Version Description
Download this release
Release Info
Developer | miled |
Plugin | WordPress Social Login |
Version | 2.1.6 |
Comparing to | |
See all releases |
Version 2.1.6
- assets/css/style.css +15 -0
- assets/img/16x16/500px.png +0 -0
- assets/img/16x16/aol.png +0 -0
- assets/img/16x16/blogger.png +0 -0
- assets/img/16x16/dribbble.png +0 -0
- assets/img/16x16/facebook.png +0 -0
- assets/img/16x16/flickr-2.png +0 -0
- assets/img/16x16/flickr.png +0 -0
- assets/img/16x16/foursquare.png +0 -0
- assets/img/16x16/github.png +0 -0
- assets/img/16x16/goodreads.png +0 -0
- assets/img/16x16/google.png +0 -0
- assets/img/16x16/gowalla.png +0 -0
- assets/img/16x16/hyves.png +0 -0
- assets/img/16x16/identica.png +0 -0
- assets/img/16x16/instagram.png +0 -0
- assets/img/16x16/lastfm.png +0 -0
- assets/img/16x16/linkedin.png +0 -0
- assets/img/16x16/live.png +0 -0
- assets/img/16x16/livejournal.png +0 -0
- assets/img/16x16/mailru.png +0 -0
- assets/img/16x16/mixi.png +0 -0
- assets/img/16x16/mixx.png +0 -0
- assets/img/16x16/myspace.png +0 -0
- assets/img/16x16/odnoklassniki.png +0 -0
- assets/img/16x16/openid-2.png +0 -0
- assets/img/16x16/orkut.png +0 -0
- assets/img/16x16/paypal.png +0 -0
- assets/img/16x16/skyrock.png +0 -0
- assets/img/16x16/stackoverflow.png +0 -0
- assets/img/16x16/steam.png +0 -0
- assets/img/16x16/tumblr.png +0 -0
- assets/img/16x16/twitchtv.png +0 -0
- assets/img/16x16/twitter.png +0 -0
- assets/img/16x16/vimeo.png +0 -0
- assets/img/16x16/vkontakte.png +0 -0
- assets/img/16x16/windows.png +0 -0
- assets/img/16x16/wordpress.png +0 -0
- assets/img/16x16/yahoo.png +0 -0
- assets/img/16x16/yandex.png +0 -0
- assets/img/32x32/icondock/500px.png +0 -0
- assets/img/32x32/icondock/aol.png +0 -0
- assets/img/32x32/icondock/blogger.png +0 -0
- assets/img/32x32/icondock/facebook.png +0 -0
- assets/img/32x32/icondock/flickr.png +0 -0
- assets/img/32x32/icondock/foursquare.png +0 -0
- assets/img/32x32/icondock/github.png +0 -0
- assets/img/32x32/icondock/goodreads.png +0 -0
- assets/img/32x32/icondock/google.png +0 -0
- assets/img/32x32/icondock/gowalla.png +0 -0
- assets/img/32x32/icondock/hyves.png +0 -0
- assets/img/32x32/icondock/identica.png +0 -0
- assets/img/32x32/icondock/info.txt +6 -0
- assets/img/32x32/icondock/instagram.png +0 -0
- assets/img/32x32/icondock/lastfm.png +0 -0
- assets/img/32x32/icondock/linkedin.png +0 -0
- assets/img/32x32/icondock/live.png +0 -0
- assets/img/32x32/icondock/livejournal.png +0 -0
- assets/img/32x32/icondock/mailru.png +0 -0
- assets/img/32x32/icondock/mixi.png +0 -0
- assets/img/32x32/icondock/msn.png +0 -0
- assets/img/32x32/icondock/myspace.png +0 -0
- assets/img/32x32/icondock/odnoklassniki.png +0 -0
- assets/img/32x32/icondock/skyrock.png +0 -0
- assets/img/32x32/icondock/stackoverflow.png +0 -0
- assets/img/32x32/icondock/steam.png +0 -0
- assets/img/32x32/icondock/tumblr.png +0 -0
- assets/img/32x32/icondock/twitchtv.png +0 -0
- assets/img/32x32/icondock/twitter.png +0 -0
- assets/img/32x32/icondock/vimeo.png +0 -0
- assets/img/32x32/icondock/vkontakte.png +0 -0
- assets/img/32x32/icondock/wordpress.png +0 -0
- assets/img/32x32/icondock/yahoo.png +0 -0
- assets/img/32x32/icondock/yandex.png +0 -0
- assets/img/32x32/wpzoom/500px.png +0 -0
- assets/img/32x32/wpzoom/aol.png +0 -0
- assets/img/32x32/wpzoom/blogger.png +0 -0
- assets/img/32x32/wpzoom/facebook.png +0 -0
- assets/img/32x32/wpzoom/flickr.png +0 -0
- assets/img/32x32/wpzoom/foursquare.png +0 -0
- assets/img/32x32/wpzoom/github.png +0 -0
- assets/img/32x32/wpzoom/goodreads.png +0 -0
- assets/img/32x32/wpzoom/google.png +0 -0
- assets/img/32x32/wpzoom/gowalla.png +0 -0
- assets/img/32x32/wpzoom/hyves.png +0 -0
- assets/img/32x32/wpzoom/identica.png +0 -0
- assets/img/32x32/wpzoom/instagram.png +0 -0
- assets/img/32x32/wpzoom/lastfm.png +0 -0
- assets/img/32x32/wpzoom/license.txt +5 -0
- assets/img/32x32/wpzoom/linkedin.png +0 -0
- assets/img/32x32/wpzoom/live.png +0 -0
- assets/img/32x32/wpzoom/livejournal.png +0 -0
- assets/img/32x32/wpzoom/mailru.png +0 -0
- assets/img/32x32/wpzoom/mixi.png +0 -0
- assets/img/32x32/wpzoom/myspace.png +0 -0
- assets/img/32x32/wpzoom/odnoklassniki.png +0 -0
- assets/img/32x32/wpzoom/openid-2.png +0 -0
- assets/img/32x32/wpzoom/skyrock.png +0 -0
- assets/img/32x32/wpzoom/stackoverflow.png +0 -0
- assets/img/32x32/wpzoom/steam.png +0 -0
- assets/img/32x32/wpzoom/tumblr.png +0 -0
- assets/img/32x32/wpzoom/twitchtv.png +0 -0
- assets/img/32x32/wpzoom/twitter.png +0 -0
- assets/img/32x32/wpzoom/vimeo.png +0 -0
- assets/img/32x32/wpzoom/vkontakte.png +0 -0
- assets/img/32x32/wpzoom/wordpress.png +0 -0
- assets/img/32x32/wpzoom/yahoo.png +0 -0
- assets/img/32x32/wpzoom/yandex.png +0 -0
- assets/img/alert.png +0 -0
- assets/img/flags.png +0 -0
- assets/img/loading.gif +0 -0
- assets/js/connect.js +49 -0
- hybridauth/Hybrid/Auth.php +406 -0
- hybridauth/Hybrid/Endpoint.php +217 -0
- hybridauth/Hybrid/Error.php +84 -0
- hybridauth/Hybrid/Logger.php +68 -0
- hybridauth/Hybrid/Provider_Adapter.php +283 -0
- hybridauth/Hybrid/Provider_Model.php +231 -0
- hybridauth/Hybrid/Provider_Model_OAuth1.php +161 -0
- hybridauth/Hybrid/Provider_Model_OAuth2.php +176 -0
- hybridauth/Hybrid/Provider_Model_OpenID.php +172 -0
- hybridauth/Hybrid/Providers/AOL.php +16 -0
- hybridauth/Hybrid/Providers/Facebook.php +269 -0
- hybridauth/Hybrid/Providers/Foursquare.php +56 -0
- hybridauth/Hybrid/Providers/GitHub.php +56 -0
- hybridauth/Hybrid/Providers/Goodreads.php +115 -0
- hybridauth/Hybrid/Providers/Google.php +119 -0
- hybridauth/Hybrid/Providers/Gowalla.php +102 -0
- hybridauth/Hybrid/Providers/Identica.php +165 -0
- hybridauth/Hybrid/Providers/Instagram.php +48 -0
- hybridauth/Hybrid/Providers/LastFM.php +111 -0
- hybridauth/Hybrid/Providers/LinkedIn.php +252 -0
- hybridauth/Hybrid/Providers/Live.php +106 -0
- hybridauth/Hybrid/Providers/Mailru.php +63 -0
- hybridauth/Hybrid/Providers/Mixi.php +6 -0
- hybridauth/Hybrid/Providers/MySpace.php +164 -0
- hybridauth/Hybrid/Providers/Odnoklassniki.php +174 -0
- hybridauth/Hybrid/Providers/OpenID.php +15 -0
- hybridauth/Hybrid/Providers/Skyrock.php +198 -0
- hybridauth/Hybrid/Providers/Stackoverflow.php +5 -0
- hybridauth/Hybrid/Providers/Steam.php +59 -0
- hybridauth/Hybrid/Providers/Tumblr.php +79 -0
- hybridauth/Hybrid/Providers/TwitchTV.php +73 -0
- hybridauth/Hybrid/Providers/Twitter.php +165 -0
- hybridauth/Hybrid/Providers/Vkontakte.php +115 -0
- hybridauth/Hybrid/Providers/Yahoo.php +31 -0
- hybridauth/Hybrid/Providers/Yandex.php +61 -0
- hybridauth/Hybrid/Providers/px500.php +100 -0
- hybridauth/Hybrid/Storage.php +97 -0
- hybridauth/Hybrid/User.php +31 -0
- hybridauth/Hybrid/User_Activity.php +39 -0
- hybridauth/Hybrid/User_Contact.php +37 -0
- hybridauth/Hybrid/User_Profile.php +84 -0
- hybridauth/Hybrid/index.html +10 -0
- hybridauth/Hybrid/resources/index.html +10 -0
- hybridauth/Hybrid/resources/openid_policy.html +10 -0
- hybridauth/Hybrid/resources/openid_realm.html +13 -0
- hybridauth/Hybrid/resources/openid_xrds.xml +12 -0
- hybridauth/Hybrid/thirdparty/Facebook/base_facebook.php +1436 -0
- hybridauth/Hybrid/thirdparty/Facebook/facebook.php +160 -0
- hybridauth/Hybrid/thirdparty/Facebook/fb_ca_chain_bundle.crt +3920 -0
- hybridauth/Hybrid/thirdparty/LastFM/LastFM.php +381 -0
- hybridauth/Hybrid/thirdparty/LinkedIn/LinkedIn.php +2639 -0
- hybridauth/Hybrid/thirdparty/OAuth/OAuth.php +897 -0
- hybridauth/Hybrid/thirdparty/OAuth/OAuth1Client.php +229 -0
- hybridauth/Hybrid/thirdparty/OAuth/OAuth2Client.php +245 -0
- hybridauth/Hybrid/thirdparty/OpenID/LightOpenID.php +834 -0
- hybridauth/Hybrid/thirdparty/index.html +10 -0
- hybridauth/index.php +15 -0
- hybridauth/readme.txt +12 -0
- includes/admin/components/advanced/index.php +111 -0
- includes/admin/components/bouncer/index.php +56 -0
- includes/admin/components/bouncer/wsl.components.bouncer.setup.php +283 -0
- includes/admin/components/bouncer/wsl.components.bouncer.sidebar.php +70 -0
- includes/admin/components/components/index.php +36 -0
- includes/admin/components/components/wsl.components.help.gallery.php +83 -0
- includes/admin/components/components/wsl.components.help.setup.php +92 -0
- includes/admin/components/contacts/index.php +220 -0
- includes/admin/components/diagnostics/index.php +75 -0
- includes/admin/components/help/index.php +105 -0
- includes/admin/components/login-widget/index.php +56 -0
- includes/admin/components/login-widget/wsl.components.loginwidget.setup.php +153 -0
- includes/admin/components/login-widget/wsl.components.loginwidget.sidebar.php +82 -0
- includes/admin/components/networks/index.php +65 -0
- includes/admin/components/networks/wsl.components.networks.addmore.php +69 -0
- includes/admin/components/networks/wsl.components.networks.basicinsights.php +154 -0
- includes/admin/components/networks/wsl.components.networks.setup.php +277 -0
- includes/admin/components/networks/wsl.components.networks.whyhello.php +52 -0
- includes/admin/components/users/index.php +41 -0
- includes/admin/components/users/wsl.components.users.list.php +137 -0
- includes/admin/components/users/wsl.components.users.profile.php +77 -0
- includes/admin/wsl.admin.ui.php +775 -0
- includes/services/wsl.authentication.php +989 -0
- includes/services/wsl.mail.notification.php +44 -0
- includes/services/wsl.user.avatar.php +77 -0
- includes/services/wsl.user.data.php +257 -0
- includes/settings/wsl.compatibilities.php +202 -0
- includes/settings/wsl.database.php +102 -0
- includes/settings/wsl.initialization.php +405 -0
- includes/settings/wsl.providers.php +245 -0
- includes/widgets/wsl.auth.widget.php +456 -0
- includes/widgets/wsl.complete.registration.php +161 -0
- includes/widgets/wsl.notices.php +67 -0
- languages/wordpress-social-login-ar.mo +0 -0
- languages/wordpress-social-login-ar.po +1446 -0
- languages/wordpress-social-login-de_DE.mo +0 -0
- languages/wordpress-social-login-de_DE.po +1449 -0
- languages/wordpress-social-login-es_ES.mo +0 -0
- languages/wordpress-social-login-es_ES.po +258 -0
assets/css/style.css
ADDED
@@ -0,0 +1,15 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
#wp-social-login-connect-with{
|
2 |
+
font-weight: bold;
|
3 |
+
}
|
4 |
+
|
5 |
+
#wp-social-login-connect-options{
|
6 |
+
padding:10px;
|
7 |
+
}
|
8 |
+
|
9 |
+
#wp-social-login-connect-options a{
|
10 |
+
text-decoration: none;
|
11 |
+
}
|
12 |
+
|
13 |
+
#wp-social-login-connect-options img{
|
14 |
+
border:0 none;
|
15 |
+
}
|
assets/img/16x16/500px.png
ADDED
Binary file
|
assets/img/16x16/aol.png
ADDED
Binary file
|
assets/img/16x16/blogger.png
ADDED
Binary file
|
assets/img/16x16/dribbble.png
ADDED
Binary file
|
assets/img/16x16/facebook.png
ADDED
Binary file
|
assets/img/16x16/flickr-2.png
ADDED
Binary file
|
assets/img/16x16/flickr.png
ADDED
Binary file
|
assets/img/16x16/foursquare.png
ADDED
Binary file
|
assets/img/16x16/github.png
ADDED
Binary file
|
assets/img/16x16/goodreads.png
ADDED
Binary file
|
assets/img/16x16/google.png
ADDED
Binary file
|
assets/img/16x16/gowalla.png
ADDED
Binary file
|
assets/img/16x16/hyves.png
ADDED
Binary file
|
assets/img/16x16/identica.png
ADDED
Binary file
|
assets/img/16x16/instagram.png
ADDED
Binary file
|
assets/img/16x16/lastfm.png
ADDED
Binary file
|
assets/img/16x16/linkedin.png
ADDED
Binary file
|
assets/img/16x16/live.png
ADDED
Binary file
|
assets/img/16x16/livejournal.png
ADDED
Binary file
|
assets/img/16x16/mailru.png
ADDED
Binary file
|
assets/img/16x16/mixi.png
ADDED
Binary file
|
assets/img/16x16/mixx.png
ADDED
Binary file
|
assets/img/16x16/myspace.png
ADDED
Binary file
|
assets/img/16x16/odnoklassniki.png
ADDED
Binary file
|
assets/img/16x16/openid-2.png
ADDED
Binary file
|
assets/img/16x16/orkut.png
ADDED
Binary file
|
assets/img/16x16/paypal.png
ADDED
Binary file
|
assets/img/16x16/skyrock.png
ADDED
Binary file
|
assets/img/16x16/stackoverflow.png
ADDED
Binary file
|
assets/img/16x16/steam.png
ADDED
Binary file
|
assets/img/16x16/tumblr.png
ADDED
Binary file
|
assets/img/16x16/twitchtv.png
ADDED
Binary file
|
assets/img/16x16/twitter.png
ADDED
Binary file
|
assets/img/16x16/vimeo.png
ADDED
Binary file
|
assets/img/16x16/vkontakte.png
ADDED
Binary file
|
assets/img/16x16/windows.png
ADDED
Binary file
|
assets/img/16x16/wordpress.png
ADDED
Binary file
|
assets/img/16x16/yahoo.png
ADDED
Binary file
|
assets/img/16x16/yandex.png
ADDED
Binary file
|
assets/img/32x32/icondock/500px.png
ADDED
Binary file
|
assets/img/32x32/icondock/aol.png
ADDED
Binary file
|
assets/img/32x32/icondock/blogger.png
ADDED
Binary file
|
assets/img/32x32/icondock/facebook.png
ADDED
Binary file
|
assets/img/32x32/icondock/flickr.png
ADDED
Binary file
|
assets/img/32x32/icondock/foursquare.png
ADDED
Binary file
|
assets/img/32x32/icondock/github.png
ADDED
Binary file
|
assets/img/32x32/icondock/goodreads.png
ADDED
Binary file
|
assets/img/32x32/icondock/google.png
ADDED
Binary file
|
assets/img/32x32/icondock/gowalla.png
ADDED
Binary file
|
assets/img/32x32/icondock/hyves.png
ADDED
Binary file
|
assets/img/32x32/icondock/identica.png
ADDED
Binary file
|
assets/img/32x32/icondock/info.txt
ADDED
@@ -0,0 +1,6 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
Vector Social Media Icons
|
2 |
+
by IconDock.com & Double-J Design (http://www.doublejdesign.co.uk)
|
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.
|
assets/img/32x32/icondock/instagram.png
ADDED
Binary file
|
assets/img/32x32/icondock/lastfm.png
ADDED
Binary file
|
assets/img/32x32/icondock/linkedin.png
ADDED
Binary file
|
assets/img/32x32/icondock/live.png
ADDED
Binary file
|
assets/img/32x32/icondock/livejournal.png
ADDED
Binary file
|
assets/img/32x32/icondock/mailru.png
ADDED
Binary file
|
assets/img/32x32/icondock/mixi.png
ADDED
Binary file
|
assets/img/32x32/icondock/msn.png
ADDED
Binary file
|
assets/img/32x32/icondock/myspace.png
ADDED
Binary file
|
assets/img/32x32/icondock/odnoklassniki.png
ADDED
Binary file
|
assets/img/32x32/icondock/skyrock.png
ADDED
Binary file
|
assets/img/32x32/icondock/stackoverflow.png
ADDED
Binary file
|
assets/img/32x32/icondock/steam.png
ADDED
Binary file
|
assets/img/32x32/icondock/tumblr.png
ADDED
Binary file
|
assets/img/32x32/icondock/twitchtv.png
ADDED
Binary file
|
assets/img/32x32/icondock/twitter.png
ADDED
Binary file
|
assets/img/32x32/icondock/vimeo.png
ADDED
Binary file
|
assets/img/32x32/icondock/vkontakte.png
ADDED
Binary file
|
assets/img/32x32/icondock/wordpress.png
ADDED
Binary file
|
assets/img/32x32/icondock/yahoo.png
ADDED
Binary file
|
assets/img/32x32/icondock/yandex.png
ADDED
Binary file
|
assets/img/32x32/wpzoom/500px.png
ADDED
Binary file
|
assets/img/32x32/wpzoom/aol.png
ADDED
Binary file
|
assets/img/32x32/wpzoom/blogger.png
ADDED
Binary file
|
assets/img/32x32/wpzoom/facebook.png
ADDED
Binary file
|
assets/img/32x32/wpzoom/flickr.png
ADDED
Binary file
|
assets/img/32x32/wpzoom/foursquare.png
ADDED
Binary file
|
assets/img/32x32/wpzoom/github.png
ADDED
Binary file
|
assets/img/32x32/wpzoom/goodreads.png
ADDED
Binary file
|
assets/img/32x32/wpzoom/google.png
ADDED
Binary file
|
assets/img/32x32/wpzoom/gowalla.png
ADDED
Binary file
|
assets/img/32x32/wpzoom/hyves.png
ADDED
Binary file
|
assets/img/32x32/wpzoom/identica.png
ADDED
Binary file
|
assets/img/32x32/wpzoom/instagram.png
ADDED
Binary file
|
assets/img/32x32/wpzoom/lastfm.png
ADDED
Binary file
|
assets/img/32x32/wpzoom/license.txt
ADDED
@@ -0,0 +1,5 @@
|
|
|
|
|
|
|
|
|
|
|
1 |
+
WPZOOM Social Networking Icon Set by WPZOOM is licensed under a Creative Commons Attribution-Share Alike 3.0 Unported License (http://creativecommons.org/licenses/by-sa/3.0/).
|
2 |
+
|
3 |
+
You are allowed to use these icons anywhere you want, however we’ll highly appreciate if you will link to our website when you share them - http://www.wpzoom.com
|
4 |
+
|
5 |
+
Designed by David Ferreira.
|
assets/img/32x32/wpzoom/linkedin.png
ADDED
Binary file
|
assets/img/32x32/wpzoom/live.png
ADDED
Binary file
|
assets/img/32x32/wpzoom/livejournal.png
ADDED
Binary file
|
assets/img/32x32/wpzoom/mailru.png
ADDED
Binary file
|
assets/img/32x32/wpzoom/mixi.png
ADDED
Binary file
|
assets/img/32x32/wpzoom/myspace.png
ADDED
Binary file
|
assets/img/32x32/wpzoom/odnoklassniki.png
ADDED
Binary file
|
assets/img/32x32/wpzoom/openid-2.png
ADDED
Binary file
|
assets/img/32x32/wpzoom/skyrock.png
ADDED
Binary file
|
assets/img/32x32/wpzoom/stackoverflow.png
ADDED
Binary file
|
assets/img/32x32/wpzoom/steam.png
ADDED
Binary file
|
assets/img/32x32/wpzoom/tumblr.png
ADDED
Binary file
|
assets/img/32x32/wpzoom/twitchtv.png
ADDED
Binary file
|
assets/img/32x32/wpzoom/twitter.png
ADDED
Binary file
|
assets/img/32x32/wpzoom/vimeo.png
ADDED
Binary file
|
assets/img/32x32/wpzoom/vkontakte.png
ADDED
Binary file
|
assets/img/32x32/wpzoom/wordpress.png
ADDED
Binary file
|
assets/img/32x32/wpzoom/yahoo.png
ADDED
Binary file
|
assets/img/32x32/wpzoom/yandex.png
ADDED
Binary file
|
assets/img/alert.png
ADDED
Binary file
|
assets/img/flags.png
ADDED
Binary file
|
assets/img/loading.gif
ADDED
Binary file
|
assets/js/connect.js
ADDED
@@ -0,0 +1,49 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
/* Based on http://wordpress.org/extend/plugins/social-connect/ */
|
2 |
+
|
3 |
+
(function($){
|
4 |
+
$(function(){
|
5 |
+
$(".wsl_connect_with_provider").click(function(){
|
6 |
+
popupurl = $("#wsl_popup_base_url").val();
|
7 |
+
provider = $(this).attr("data-provider");
|
8 |
+
|
9 |
+
window.open(
|
10 |
+
popupurl+"provider="+provider,
|
11 |
+
"hybridauth_social_sing_on",
|
12 |
+
"location=1,status=0,scrollbars=0,width=1000,height=600"
|
13 |
+
);
|
14 |
+
});
|
15 |
+
});
|
16 |
+
})(jQuery);
|
17 |
+
|
18 |
+
window.wsl_wordpress_social_login = function(config) {
|
19 |
+
jQuery('#loginform').unbind('submit.simplemodal-login');
|
20 |
+
|
21 |
+
var form_id = '#loginform';
|
22 |
+
|
23 |
+
if(!jQuery('#loginform').length) {
|
24 |
+
// if register form exists, just use that
|
25 |
+
if( jQuery('#registerform').length ) {
|
26 |
+
form_id = '#registerform';
|
27 |
+
}
|
28 |
+
else {
|
29 |
+
// create the login form
|
30 |
+
var login_uri = jQuery("#wsl_login_form_uri").val();
|
31 |
+
|
32 |
+
jQuery('body').append("<form id='loginform' method='post' action='" + login_uri + "'></form>");
|
33 |
+
jQuery('#loginform').append("<input type='hidden' id='redirect_to' name='redirect_to' value='" + window.location.href + "'>");
|
34 |
+
}
|
35 |
+
}
|
36 |
+
|
37 |
+
jQuery.each(config, function(key, value) {
|
38 |
+
jQuery("#" + key).remove();
|
39 |
+
jQuery(form_id).append("<input type='hidden' id='" + key + "' name='" + key + "' value='" + value + "'>");
|
40 |
+
});
|
41 |
+
|
42 |
+
if(jQuery("#simplemodal-login-form").length) {
|
43 |
+
var current_url = window.location.href;
|
44 |
+
jQuery("#redirect_to").remove();
|
45 |
+
jQuery(form_id).append("<input type='hidden' id='redirect_to' name='redirect_to' value='" + current_url + "'>");
|
46 |
+
}
|
47 |
+
|
48 |
+
jQuery(form_id).submit();
|
49 |
+
}
|
hybridauth/Hybrid/Auth.php
ADDED
@@ -0,0 +1,406 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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_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 instanciate and use throughout your application.
|
14 |
+
*/
|
15 |
+
class Hybrid_Auth
|
16 |
+
{
|
17 |
+
public static $version = "2.1.1-dev";
|
18 |
+
|
19 |
+
public static $config = array();
|
20 |
+
|
21 |
+
public static $store = NULL;
|
22 |
+
|
23 |
+
public static $error = NULL;
|
24 |
+
|
25 |
+
public static $logger = NULL;
|
26 |
+
|
27 |
+
// --------------------------------------------------------------------
|
28 |
+
|
29 |
+
/**
|
30 |
+
* Try to start a new session of none then initialize Hybrid_Auth
|
31 |
+
*
|
32 |
+
* Hybrid_Auth constructor will require either a valid config array or
|
33 |
+
* a path for a configuration file as parameter. To know more please
|
34 |
+
* refer to the Configuration section:
|
35 |
+
* http://hybridauth.sourceforge.net/userguide/Configuration.html
|
36 |
+
*/
|
37 |
+
function __construct( $config )
|
38 |
+
{
|
39 |
+
Hybrid_Auth::initialize( $config );
|
40 |
+
}
|
41 |
+
|
42 |
+
// --------------------------------------------------------------------
|
43 |
+
|
44 |
+
/**
|
45 |
+
* Try to initialize Hybrid_Auth with given $config hash or file
|
46 |
+
*/
|
47 |
+
public static function initialize( $config )
|
48 |
+
{
|
49 |
+
if( ! is_array( $config ) && ! file_exists( $config ) ){
|
50 |
+
throw new Exception( "Hybriauth config does not exist on the given path.", 1 );
|
51 |
+
}
|
52 |
+
|
53 |
+
if( ! is_array( $config ) ){
|
54 |
+
$config = include $config;
|
55 |
+
}
|
56 |
+
|
57 |
+
// build some need'd paths
|
58 |
+
$config["path_base"] = realpath( dirname( __FILE__ ) ) . "/";
|
59 |
+
$config["path_libraries"] = $config["path_base"] . "thirdparty/";
|
60 |
+
$config["path_resources"] = $config["path_base"] . "resources/";
|
61 |
+
$config["path_providers"] = $config["path_base"] . "Providers/";
|
62 |
+
|
63 |
+
// reset debug mode
|
64 |
+
if( ! isset( $config["debug_mode"] ) ){
|
65 |
+
$config["debug_mode"] = false;
|
66 |
+
$config["debug_file"] = null;
|
67 |
+
}
|
68 |
+
|
69 |
+
# load hybridauth required files, a autoload is on the way...
|
70 |
+
require_once $config["path_base"] . "Error.php";
|
71 |
+
require_once $config["path_base"] . "Logger.php";
|
72 |
+
|
73 |
+
require_once $config["path_base"] . "Storage.php";
|
74 |
+
|
75 |
+
require_once $config["path_base"] . "Provider_Adapter.php";
|
76 |
+
|
77 |
+
require_once $config["path_base"] . "Provider_Model.php";
|
78 |
+
require_once $config["path_base"] . "Provider_Model_OpenID.php";
|
79 |
+
require_once $config["path_base"] . "Provider_Model_OAuth1.php";
|
80 |
+
require_once $config["path_base"] . "Provider_Model_OAuth2.php";
|
81 |
+
|
82 |
+
require_once $config["path_base"] . "User.php";
|
83 |
+
require_once $config["path_base"] . "User_Profile.php";
|
84 |
+
require_once $config["path_base"] . "User_Contact.php";
|
85 |
+
require_once $config["path_base"] . "User_Activity.php";
|
86 |
+
|
87 |
+
// hash given config
|
88 |
+
Hybrid_Auth::$config = $config;
|
89 |
+
|
90 |
+
// instace of log mng
|
91 |
+
Hybrid_Auth::$logger = new Hybrid_Logger();
|
92 |
+
|
93 |
+
// instace of errors mng
|
94 |
+
Hybrid_Auth::$error = new Hybrid_Error();
|
95 |
+
|
96 |
+
// start session storage mng
|
97 |
+
Hybrid_Auth::$store = new Hybrid_Storage();
|
98 |
+
|
99 |
+
Hybrid_Logger::info( "Enter Hybrid_Auth::initialize()");
|
100 |
+
Hybrid_Logger::info( "Hybrid_Auth::initialize(). PHP version: " . PHP_VERSION );
|
101 |
+
Hybrid_Logger::info( "Hybrid_Auth::initialize(). Hybrid_Auth version: " . Hybrid_Auth::$version );
|
102 |
+
Hybrid_Logger::info( "Hybrid_Auth::initialize(). Hybrid_Auth called from: " . Hybrid_Auth::getCurrentUrl() );
|
103 |
+
|
104 |
+
// PHP Curl extension [http://www.php.net/manual/en/intro.curl.php]
|
105 |
+
if ( ! function_exists('curl_init') ) {
|
106 |
+
Hybrid_Logger::error('Hybridauth Library needs the CURL PHP extension.');
|
107 |
+
throw new Exception('Hybridauth Library needs the CURL PHP extension.');
|
108 |
+
}
|
109 |
+
|
110 |
+
// PHP JSON extension [http://php.net/manual/en/book.json.php]
|
111 |
+
if ( ! function_exists('json_decode') ) {
|
112 |
+
Hybrid_Logger::error('Hybridauth Library needs the JSON PHP extension.');
|
113 |
+
throw new Exception('Hybridauth Library needs the JSON PHP extension.');
|
114 |
+
}
|
115 |
+
|
116 |
+
// session.name
|
117 |
+
if( session_name() != "PHPSESSID" ){
|
118 |
+
Hybrid_Logger::info('PHP session.name diff from default PHPSESSID. http://php.net/manual/en/session.configuration.php#ini.session.name.');
|
119 |
+
}
|
120 |
+
|
121 |
+
// safe_mode is on
|
122 |
+
if( ini_get('safe_mode') ){
|
123 |
+
Hybrid_Logger::info('PHP safe_mode is on. http://php.net/safe-mode.');
|
124 |
+
}
|
125 |
+
|
126 |
+
// open basedir is on
|
127 |
+
if( ini_get('open_basedir') ){
|
128 |
+
Hybrid_Logger::info('PHP open_basedir is on. http://php.net/open-basedir.');
|
129 |
+
}
|
130 |
+
|
131 |
+
Hybrid_Logger::debug( "Hybrid_Auth initialize. dump used config: ", serialize( $config ) );
|
132 |
+
Hybrid_Logger::debug( "Hybrid_Auth initialize. dump current session: ", Hybrid_Auth::storage()->getSessionData() );
|
133 |
+
Hybrid_Logger::info( "Hybrid_Auth initialize: check if any error is stored on the endpoint..." );
|
134 |
+
|
135 |
+
if( Hybrid_Error::hasError() ){
|
136 |
+
$m = Hybrid_Error::getErrorMessage();
|
137 |
+
$c = Hybrid_Error::getErrorCode();
|
138 |
+
$p = Hybrid_Error::getErrorPrevious();
|
139 |
+
|
140 |
+
Hybrid_Logger::error( "Hybrid_Auth initialize: A stored Error found, Throw an new Exception and delete it from the store: Error#$c, '$m'" );
|
141 |
+
|
142 |
+
Hybrid_Error::clearError();
|
143 |
+
|
144 |
+
// try to provide the previous if any
|
145 |
+
// Exception::getPrevious (PHP 5 >= 5.3.0) http://php.net/manual/en/exception.getprevious.php
|
146 |
+
if ( version_compare( PHP_VERSION, '5.3.0', '>=' ) && ($p instanceof Exception) ) {
|
147 |
+
throw new Exception( $m, $c, $p );
|
148 |
+
}
|
149 |
+
else{
|
150 |
+
throw new Exception( $m, $c );
|
151 |
+
}
|
152 |
+
}
|
153 |
+
|
154 |
+
Hybrid_Logger::info( "Hybrid_Auth initialize: no error found. initialization succeed." );
|
155 |
+
|
156 |
+
// Endof initialize
|
157 |
+
}
|
158 |
+
|
159 |
+
// --------------------------------------------------------------------
|
160 |
+
|
161 |
+
/**
|
162 |
+
* Hybrid storage system accessor
|
163 |
+
*
|
164 |
+
* Users sessions are stored using HybridAuth storage system ( HybridAuth 2.0 handle PHP Session only) and can be acessed directly by
|
165 |
+
* Hybrid_Auth::storage()->get($key) to retrieves the data for the given key, or calling
|
166 |
+
* Hybrid_Auth::storage()->set($key, $value) to store the key => $value set.
|
167 |
+
*/
|
168 |
+
public static function storage()
|
169 |
+
{
|
170 |
+
return Hybrid_Auth::$store;
|
171 |
+
}
|
172 |
+
|
173 |
+
// --------------------------------------------------------------------
|
174 |
+
|
175 |
+
/**
|
176 |
+
* Get hybridauth session data.
|
177 |
+
*/
|
178 |
+
function getSessionData()
|
179 |
+
{
|
180 |
+
return Hybrid_Auth::storage()->getSessionData();
|
181 |
+
}
|
182 |
+
|
183 |
+
// --------------------------------------------------------------------
|
184 |
+
|
185 |
+
/**
|
186 |
+
* restore hybridauth session data.
|
187 |
+
*/
|
188 |
+
function restoreSessionData( $sessiondata = NULL )
|
189 |
+
{
|
190 |
+
Hybrid_Auth::storage()->restoreSessionData( $sessiondata );
|
191 |
+
}
|
192 |
+
|
193 |
+
// --------------------------------------------------------------------
|
194 |
+
|
195 |
+
/**
|
196 |
+
* Try to authenticate the user with a given provider.
|
197 |
+
*
|
198 |
+
* If the user is already connected we just return and instance of provider adapter,
|
199 |
+
* ELSE, try to authenticate and authorize the user with the provider.
|
200 |
+
*
|
201 |
+
* $params is generally an array with required info in order for this provider and HybridAuth to work,
|
202 |
+
* like :
|
203 |
+
* hauth_return_to: URL to call back after authentication is done
|
204 |
+
* openid_identifier: The OpenID identity provider identifier
|
205 |
+
* google_service: can be "Users" for Google user accounts service or "Apps" for Google hosted Apps
|
206 |
+
*/
|
207 |
+
public static function authenticate( $providerId, $params = NULL )
|
208 |
+
{
|
209 |
+
Hybrid_Logger::info( "Enter Hybrid_Auth::authenticate( $providerId )" );
|
210 |
+
|
211 |
+
// if user not connected to $providerId then try setup a new adapter and start the login process for this provider
|
212 |
+
if( ! Hybrid_Auth::storage()->get( "hauth_session.$providerId.is_logged_in" ) ){
|
213 |
+
Hybrid_Logger::info( "Hybrid_Auth::authenticate( $providerId ), User not connected to the provider. Try to authenticate.." );
|
214 |
+
|
215 |
+
$provider_adapter = Hybrid_Auth::setup( $providerId, $params );
|
216 |
+
|
217 |
+
$provider_adapter->login();
|
218 |
+
}
|
219 |
+
|
220 |
+
// else, then return the adapter instance for the given provider
|
221 |
+
else{
|
222 |
+
Hybrid_Logger::info( "Hybrid_Auth::authenticate( $providerId ), User is already connected to this provider. Return the adapter instance." );
|
223 |
+
|
224 |
+
return Hybrid_Auth::getAdapter( $providerId );
|
225 |
+
}
|
226 |
+
}
|
227 |
+
|
228 |
+
// --------------------------------------------------------------------
|
229 |
+
|
230 |
+
/**
|
231 |
+
* Return the adapter instance for an authenticated provider
|
232 |
+
*/
|
233 |
+
public static function getAdapter( $providerId = NULL )
|
234 |
+
{
|
235 |
+
Hybrid_Logger::info( "Enter Hybrid_Auth::getAdapter( $providerId )" );
|
236 |
+
|
237 |
+
return Hybrid_Auth::setup( $providerId );
|
238 |
+
}
|
239 |
+
|
240 |
+
// --------------------------------------------------------------------
|
241 |
+
|
242 |
+
/**
|
243 |
+
* Setup an adapter for a given provider
|
244 |
+
*/
|
245 |
+
public static function setup( $providerId, $params = NULL )
|
246 |
+
{
|
247 |
+
Hybrid_Logger::debug( "Enter Hybrid_Auth::setup( $providerId )", $params );
|
248 |
+
|
249 |
+
if( ! $params ){
|
250 |
+
$params = Hybrid_Auth::storage()->get( "hauth_session.$providerId.id_provider_params" );
|
251 |
+
|
252 |
+
Hybrid_Logger::debug( "Hybrid_Auth::setup( $providerId ), no params given. Trying to get the sotred for this provider.", $params );
|
253 |
+
}
|
254 |
+
|
255 |
+
if( ! $params ){
|
256 |
+
$params = ARRAY();
|
257 |
+
|
258 |
+
Hybrid_Logger::info( "Hybrid_Auth::setup( $providerId ), no stored params found for this provider. Initialize a new one for new session" );
|
259 |
+
}
|
260 |
+
|
261 |
+
if( ! isset( $params["hauth_return_to"] ) ){
|
262 |
+
$params["hauth_return_to"] = Hybrid_Auth::getCurrentUrl();
|
263 |
+
}
|
264 |
+
|
265 |
+
Hybrid_Logger::debug( "Hybrid_Auth::setup( $providerId ). HybridAuth Callback URL set to: ", $params["hauth_return_to"] );
|
266 |
+
|
267 |
+
# instantiate a new IDProvider Adapter
|
268 |
+
$provider = new Hybrid_Provider_Adapter();
|
269 |
+
|
270 |
+
$provider->factory( $providerId, $params );
|
271 |
+
|
272 |
+
return $provider;
|
273 |
+
}
|
274 |
+
|
275 |
+
// --------------------------------------------------------------------
|
276 |
+
|
277 |
+
/**
|
278 |
+
* Check if the current user is connected to a given provider
|
279 |
+
*/
|
280 |
+
public static function isConnectedWith( $providerId )
|
281 |
+
{
|
282 |
+
return (bool) Hybrid_Auth::storage()->get( "hauth_session.{$providerId}.is_logged_in" );
|
283 |
+
}
|
284 |
+
|
285 |
+
// --------------------------------------------------------------------
|
286 |
+
|
287 |
+
/**
|
288 |
+
* Return array listing all authenticated providers
|
289 |
+
*/
|
290 |
+
public static function getConnectedProviders()
|
291 |
+
{
|
292 |
+
$idps = array();
|
293 |
+
|
294 |
+
foreach( Hybrid_Auth::$config["providers"] as $idpid => $params ){
|
295 |
+
if( Hybrid_Auth::isConnectedWith( $idpid ) ){
|
296 |
+
$idps[] = $idpid;
|
297 |
+
}
|
298 |
+
}
|
299 |
+
|
300 |
+
return $idps;
|
301 |
+
}
|
302 |
+
|
303 |
+
// --------------------------------------------------------------------
|
304 |
+
|
305 |
+
/**
|
306 |
+
* Return array listing all enabled providers as well as a flag if you are connected.
|
307 |
+
*/
|
308 |
+
public static function getProviders()
|
309 |
+
{
|
310 |
+
$idps = array();
|
311 |
+
|
312 |
+
foreach( Hybrid_Auth::$config["providers"] as $idpid => $params ){
|
313 |
+
if($params['enabled']) {
|
314 |
+
$idps[$idpid] = array( 'connected' => false );
|
315 |
+
|
316 |
+
if( Hybrid_Auth::isConnectedWith( $idpid ) ){
|
317 |
+
$idps[$idpid]['connected'] = true;
|
318 |
+
}
|
319 |
+
}
|
320 |
+
}
|
321 |
+
|
322 |
+
return $idps;
|
323 |
+
}
|
324 |
+
|
325 |
+
// --------------------------------------------------------------------
|
326 |
+
|
327 |
+
/**
|
328 |
+
* A generic function to logout all connected provider at once
|
329 |
+
*/
|
330 |
+
public static function logoutAllProviders()
|
331 |
+
{
|
332 |
+
$idps = Hybrid_Auth::getConnectedProviders();
|
333 |
+
|
334 |
+
foreach( $idps as $idp ){
|
335 |
+
$adapter = Hybrid_Auth::getAdapter( $idp );
|
336 |
+
|
337 |
+
$adapter->logout();
|
338 |
+
}
|
339 |
+
}
|
340 |
+
|
341 |
+
// --------------------------------------------------------------------
|
342 |
+
|
343 |
+
/**
|
344 |
+
* Utility function, redirect to a given URL with php header or using javascript location.href
|
345 |
+
*/
|
346 |
+
public static function redirect( $url, $mode = "PHP" )
|
347 |
+
{
|
348 |
+
Hybrid_Logger::info( "Enter Hybrid_Auth::redirect( $url, $mode )" );
|
349 |
+
|
350 |
+
if( $mode == "PHP" ){
|
351 |
+
header( "Location: $url" ) ;
|
352 |
+
}
|
353 |
+
elseif( $mode == "JS" ){
|
354 |
+
echo '<html>';
|
355 |
+
echo '<head>';
|
356 |
+
echo '<script type="text/javascript">';
|
357 |
+
echo 'function redirect(){ window.top.location.href="' . $url . '"; }';
|
358 |
+
echo '</script>';
|
359 |
+
echo '</head>';
|
360 |
+
echo '<body onload="redirect()">';
|
361 |
+
echo 'Redirecting, please wait...';
|
362 |
+
echo '</body>';
|
363 |
+
echo '</html>';
|
364 |
+
}
|
365 |
+
|
366 |
+
die();
|
367 |
+
}
|
368 |
+
|
369 |
+
// --------------------------------------------------------------------
|
370 |
+
|
371 |
+
/**
|
372 |
+
* Utility function, return the current url. TRUE to get $_SERVER['REQUEST_URI'], FALSE for $_SERVER['PHP_SELF']
|
373 |
+
*/
|
374 |
+
public static function getCurrentUrl( $request_uri = true )
|
375 |
+
{
|
376 |
+
if(
|
377 |
+
isset( $_SERVER['HTTPS'] ) && ( $_SERVER['HTTPS'] == 'on' || $_SERVER['HTTPS'] == 1 )
|
378 |
+
|| isset( $_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https'
|
379 |
+
){
|
380 |
+
$protocol = 'https://';
|
381 |
+
}
|
382 |
+
else {
|
383 |
+
$protocol = 'http://';
|
384 |
+
}
|
385 |
+
|
386 |
+
$url = $protocol . $_SERVER['HTTP_HOST'];
|
387 |
+
|
388 |
+
// use port if non default
|
389 |
+
if( isset( $_SERVER['SERVER_PORT'] ) && strpos( $url, ':'.$_SERVER['SERVER_PORT'] ) === FALSE ) {
|
390 |
+
$url .= ($protocol === 'http://' && $_SERVER['SERVER_PORT'] != 80 && !isset( $_SERVER['HTTP_X_FORWARDED_PROTO']))
|
391 |
+
|| ($protocol === 'https://' && $_SERVER['SERVER_PORT'] != 443 && !isset( $_SERVER['HTTP_X_FORWARDED_PROTO']))
|
392 |
+
? ':' . $_SERVER['SERVER_PORT']
|
393 |
+
: '';
|
394 |
+
}
|
395 |
+
|
396 |
+
if( $request_uri ){
|
397 |
+
$url .= $_SERVER['REQUEST_URI'];
|
398 |
+
}
|
399 |
+
else{
|
400 |
+
$url .= $_SERVER['PHP_SELF'];
|
401 |
+
}
|
402 |
+
|
403 |
+
// return current url
|
404 |
+
return $url;
|
405 |
+
}
|
406 |
+
}
|
hybridauth/Hybrid/Endpoint.php
ADDED
@@ -0,0 +1,217 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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_Endpoint class
|
10 |
+
*
|
11 |
+
* Hybrid_Endpoint class provides a simple way to handle the OpenID and OAuth endpoint.
|
12 |
+
*/
|
13 |
+
class Hybrid_Endpoint {
|
14 |
+
public static $request = NULL;
|
15 |
+
public static $initDone = FALSE;
|
16 |
+
|
17 |
+
/**
|
18 |
+
* Process the current request
|
19 |
+
*
|
20 |
+
* $request - The current request parameters. Leave as NULL to default to use $_REQUEST.
|
21 |
+
*/
|
22 |
+
public static function process( $request = NULL )
|
23 |
+
{
|
24 |
+
// Setup request variable
|
25 |
+
Hybrid_Endpoint::$request = $request;
|
26 |
+
|
27 |
+
if ( is_null(Hybrid_Endpoint::$request) ){
|
28 |
+
// Fix a strange behavior when some provider call back ha endpoint
|
29 |
+
// with /index.php?hauth.done={provider}?{args}...
|
30 |
+
// >here we need to recreate the $_REQUEST
|
31 |
+
if ( strrpos( $_SERVER["QUERY_STRING"], '?' ) ) {
|
32 |
+
$_SERVER["QUERY_STRING"] = str_replace( "?", "&", $_SERVER["QUERY_STRING"] );
|
33 |
+
|
34 |
+
parse_str( $_SERVER["QUERY_STRING"], $_REQUEST );
|
35 |
+
}
|
36 |
+
|
37 |
+
Hybrid_Endpoint::$request = $_REQUEST;
|
38 |
+
}
|
39 |
+
|
40 |
+
// If openid_policy requested, we return our policy document
|
41 |
+
if ( isset( Hybrid_Endpoint::$request["get"] ) && Hybrid_Endpoint::$request["get"] == "openid_policy" ) {
|
42 |
+
Hybrid_Endpoint::processOpenidPolicy();
|
43 |
+
}
|
44 |
+
|
45 |
+
// If openid_xrds requested, we return our XRDS document
|
46 |
+
if ( isset( Hybrid_Endpoint::$request["get"] ) && Hybrid_Endpoint::$request["get"] == "openid_xrds" ) {
|
47 |
+
Hybrid_Endpoint::processOpenidXRDS();
|
48 |
+
}
|
49 |
+
|
50 |
+
// If we get a hauth.start
|
51 |
+
if ( isset( Hybrid_Endpoint::$request["hauth_start"] ) && Hybrid_Endpoint::$request["hauth_start"] ) {
|
52 |
+
Hybrid_Endpoint::processAuthStart();
|
53 |
+
}
|
54 |
+
// Else if hauth.done
|
55 |
+
elseif ( isset( Hybrid_Endpoint::$request["hauth_done"] ) && Hybrid_Endpoint::$request["hauth_done"] ) {
|
56 |
+
Hybrid_Endpoint::processAuthDone();
|
57 |
+
}
|
58 |
+
// Else we advertise our XRDS document, something supposed to be done from the Realm URL page
|
59 |
+
else {
|
60 |
+
Hybrid_Endpoint::processOpenidRealm();
|
61 |
+
}
|
62 |
+
}
|
63 |
+
|
64 |
+
/**
|
65 |
+
* Process OpenID policy request
|
66 |
+
*/
|
67 |
+
public static function processOpenidPolicy()
|
68 |
+
{
|
69 |
+
$output = file_get_contents( dirname(__FILE__) . "/resources/openid_policy.html" );
|
70 |
+
print $output;
|
71 |
+
die();
|
72 |
+
}
|
73 |
+
|
74 |
+
/**
|
75 |
+
* Process OpenID XRDS request
|
76 |
+
*/
|
77 |
+
public static function processOpenidXRDS()
|
78 |
+
{
|
79 |
+
header("Content-Type: application/xrds+xml");
|
80 |
+
|
81 |
+
$output = str_replace
|
82 |
+
(
|
83 |
+
"{RETURN_TO_URL}",
|
84 |
+
str_replace(
|
85 |
+
array("<", ">", "\"", "'", "&"), array("<", ">", """, "'", "&"),
|
86 |
+
Hybrid_Auth::getCurrentUrl( false )
|
87 |
+
),
|
88 |
+
file_get_contents( dirname(__FILE__) . "/resources/openid_xrds.xml" )
|
89 |
+
);
|
90 |
+
print $output;
|
91 |
+
die();
|
92 |
+
}
|
93 |
+
|
94 |
+
/**
|
95 |
+
* Process OpenID realm request
|
96 |
+
*/
|
97 |
+
public static function processOpenidRealm()
|
98 |
+
{
|
99 |
+
$output = str_replace
|
100 |
+
(
|
101 |
+
"{X_XRDS_LOCATION}",
|
102 |
+
htmlentities( Hybrid_Auth::getCurrentUrl( false ), ENT_QUOTES, 'UTF-8' ) . "?get=openid_xrds&v=" . Hybrid_Auth::$version,
|
103 |
+
file_get_contents( dirname(__FILE__) . "/resources/openid_realm.html" )
|
104 |
+
);
|
105 |
+
print $output;
|
106 |
+
die();
|
107 |
+
}
|
108 |
+
|
109 |
+
/**
|
110 |
+
* define:endpoint step 3.
|
111 |
+
*/
|
112 |
+
public static function processAuthStart()
|
113 |
+
{
|
114 |
+
Hybrid_Endpoint::authInit();
|
115 |
+
|
116 |
+
$provider_id = trim( strip_tags( Hybrid_Endpoint::$request["hauth_start"] ) );
|
117 |
+
|
118 |
+
# check if page accessed directly
|
119 |
+
if( ! Hybrid_Auth::storage()->get( "hauth_session.$provider_id.hauth_endpoint" ) ) {
|
120 |
+
Hybrid_Logger::error( "Endpoint: hauth_endpoint parameter is not defined on hauth_start, halt login process!" );
|
121 |
+
|
122 |
+
header( "HTTP/1.0 404 Not Found" );
|
123 |
+
die( "You cannot access this page directly." );
|
124 |
+
}
|
125 |
+
|
126 |
+
# define:hybrid.endpoint.php step 2.
|
127 |
+
$hauth = Hybrid_Auth::setup( $provider_id );
|
128 |
+
|
129 |
+
# if REQUESTed hauth_idprovider is wrong, session not created, etc.
|
130 |
+
if( ! $hauth ) {
|
131 |
+
Hybrid_Logger::error( "Endpoint: Invalid parameter on hauth_start!" );
|
132 |
+
|
133 |
+
header( "HTTP/1.0 404 Not Found" );
|
134 |
+
die( "Invalid parameter! Please return to the login page and try again." );
|
135 |
+
}
|
136 |
+
|
137 |
+
try {
|
138 |
+
Hybrid_Logger::info( "Endpoint: call adapter [{$provider_id}] loginBegin()" );
|
139 |
+
|
140 |
+
$hauth->adapter->loginBegin();
|
141 |
+
}
|
142 |
+
catch ( Exception $e ) {
|
143 |
+
Hybrid_Logger::error( "Exception:" . $e->getMessage(), $e );
|
144 |
+
Hybrid_Error::setError( $e->getMessage(), $e->getCode(), $e->getTraceAsString(), $e );
|
145 |
+
|
146 |
+
$hauth->returnToCallbackUrl();
|
147 |
+
}
|
148 |
+
|
149 |
+
die();
|
150 |
+
}
|
151 |
+
|
152 |
+
/**
|
153 |
+
* define:endpoint step 3.1 and 3.2
|
154 |
+
*/
|
155 |
+
public static function processAuthDone()
|
156 |
+
{
|
157 |
+
Hybrid_Endpoint::authInit();
|
158 |
+
|
159 |
+
$provider_id = trim( strip_tags( Hybrid_Endpoint::$request["hauth_done"] ) );
|
160 |
+
|
161 |
+
$hauth = Hybrid_Auth::setup( $provider_id );
|
162 |
+
|
163 |
+
if( ! $hauth ) {
|
164 |
+
Hybrid_Logger::error( "Endpoint: Invalid parameter on hauth_done!" );
|
165 |
+
|
166 |
+
$hauth->adapter->setUserUnconnected();
|
167 |
+
|
168 |
+
header("HTTP/1.0 404 Not Found");
|
169 |
+
die( "Invalid parameter! Please return to the login page and try again." );
|
170 |
+
}
|
171 |
+
|
172 |
+
try {
|
173 |
+
Hybrid_Logger::info( "Endpoint: call adapter [{$provider_id}] loginFinish() " );
|
174 |
+
|
175 |
+
$hauth->adapter->loginFinish();
|
176 |
+
}
|
177 |
+
catch( Exception $e ){
|
178 |
+
Hybrid_Logger::error( "Exception:" . $e->getMessage(), $e );
|
179 |
+
Hybrid_Error::setError( $e->getMessage(), $e->getCode(), $e->getTraceAsString(), $e );
|
180 |
+
|
181 |
+
$hauth->adapter->setUserUnconnected();
|
182 |
+
}
|
183 |
+
|
184 |
+
Hybrid_Logger::info( "Endpoint: job done. retrun to callback url." );
|
185 |
+
|
186 |
+
$hauth->returnToCallbackUrl();
|
187 |
+
die();
|
188 |
+
}
|
189 |
+
|
190 |
+
public static function authInit()
|
191 |
+
{
|
192 |
+
if ( ! Hybrid_Endpoint::$initDone) {
|
193 |
+
Hybrid_Endpoint::$initDone = TRUE;
|
194 |
+
|
195 |
+
# Init Hybrid_Auth
|
196 |
+
try {
|
197 |
+
require_once realpath( dirname( __FILE__ ) ) . "/Storage.php";
|
198 |
+
|
199 |
+
$storage = new Hybrid_Storage();
|
200 |
+
|
201 |
+
// Check if Hybrid_Auth session already exist
|
202 |
+
if ( ! $storage->config( "CONFIG" ) ) {
|
203 |
+
header( "HTTP/1.0 404 Not Found" );
|
204 |
+
die( "You cannot access this page directly." );
|
205 |
+
}
|
206 |
+
|
207 |
+
Hybrid_Auth::initialize( $storage->config( "CONFIG" ) );
|
208 |
+
}
|
209 |
+
catch ( Exception $e ){
|
210 |
+
Hybrid_Logger::error( "Endpoint: Error while trying to init Hybrid_Auth" );
|
211 |
+
|
212 |
+
header( "HTTP/1.0 404 Not Found" );
|
213 |
+
die( "Oophs. Error!" );
|
214 |
+
}
|
215 |
+
}
|
216 |
+
}
|
217 |
+
}
|
hybridauth/Hybrid/Error.php
ADDED
@@ -0,0 +1,84 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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 |
+
* 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 |
+
public static function setError( $message, $code = NULL, $trace = NULL, $previous = NULL )
|
19 |
+
{
|
20 |
+
Hybrid_Logger::info( "Enter Hybrid_Error::setError( $message )" );
|
21 |
+
|
22 |
+
Hybrid_Auth::storage()->set( "hauth_session.error.status" , 1 );
|
23 |
+
Hybrid_Auth::storage()->set( "hauth_session.error.message" , $message );
|
24 |
+
Hybrid_Auth::storage()->set( "hauth_session.error.code" , $code );
|
25 |
+
Hybrid_Auth::storage()->set( "hauth_session.error.trace" , $trace );
|
26 |
+
Hybrid_Auth::storage()->set( "hauth_session.error.previous", $previous );
|
27 |
+
}
|
28 |
+
|
29 |
+
/**
|
30 |
+
* clear the last error
|
31 |
+
*/
|
32 |
+
public static function clearError()
|
33 |
+
{
|
34 |
+
Hybrid_Logger::info( "Enter Hybrid_Error::clearError()" );
|
35 |
+
|
36 |
+
Hybrid_Auth::storage()->delete( "hauth_session.error.status" );
|
37 |
+
Hybrid_Auth::storage()->delete( "hauth_session.error.message" );
|
38 |
+
Hybrid_Auth::storage()->delete( "hauth_session.error.code" );
|
39 |
+
Hybrid_Auth::storage()->delete( "hauth_session.error.trace" );
|
40 |
+
Hybrid_Auth::storage()->delete( "hauth_session.error.previous" );
|
41 |
+
}
|
42 |
+
|
43 |
+
/**
|
44 |
+
* Checks to see if there is a an error.
|
45 |
+
*
|
46 |
+
* @return boolean True if there is an error.
|
47 |
+
*/
|
48 |
+
public static function hasError()
|
49 |
+
{
|
50 |
+
return (bool) Hybrid_Auth::storage()->get( "hauth_session.error.status" );
|
51 |
+
}
|
52 |
+
|
53 |
+
/**
|
54 |
+
* return error message
|
55 |
+
*/
|
56 |
+
public static function getErrorMessage()
|
57 |
+
{
|
58 |
+
return Hybrid_Auth::storage()->get( "hauth_session.error.message" );
|
59 |
+
}
|
60 |
+
|
61 |
+
/**
|
62 |
+
* return error code
|
63 |
+
*/
|
64 |
+
public static function getErrorCode()
|
65 |
+
{
|
66 |
+
return Hybrid_Auth::storage()->get( "hauth_session.error.code" );
|
67 |
+
}
|
68 |
+
|
69 |
+
/**
|
70 |
+
* return string detailled error backtrace as string.
|
71 |
+
*/
|
72 |
+
public static function getErrorTrace()
|
73 |
+
{
|
74 |
+
return Hybrid_Auth::storage()->get( "hauth_session.error.trace" );
|
75 |
+
}
|
76 |
+
|
77 |
+
/**
|
78 |
+
* @return string detailled error backtrace as string.
|
79 |
+
*/
|
80 |
+
public static function getErrorPrevious()
|
81 |
+
{
|
82 |
+
return Hybrid_Auth::storage()->get( "hauth_session.error.previous" );
|
83 |
+
}
|
84 |
+
}
|
hybridauth/Hybrid/Logger.php
ADDED
@@ -0,0 +1,68 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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 |
+
* Debugging and Logging manager
|
10 |
+
*/
|
11 |
+
class Hybrid_Logger
|
12 |
+
{
|
13 |
+
function __construct()
|
14 |
+
{
|
15 |
+
// if debug mode is set to true, then check for the writable log file
|
16 |
+
if ( Hybrid_Auth::$config["debug_mode"] ){
|
17 |
+
if ( ! file_exists( Hybrid_Auth::$config["debug_file"] ) ){
|
18 |
+
throw new Exception( "'debug_mode' is set to 'true', but the file " . Hybrid_Auth::$config['debug_file'] . " in 'debug_file' does not exit.", 1 );
|
19 |
+
}
|
20 |
+
|
21 |
+
if ( ! is_writable( Hybrid_Auth::$config["debug_file"] ) ){
|
22 |
+
throw new Exception( "'debug_mode' is set to 'true', but the given log file path 'debug_file' is not a writable file.", 1 );
|
23 |
+
}
|
24 |
+
}
|
25 |
+
}
|
26 |
+
|
27 |
+
public static function debug( $message, $object = NULL )
|
28 |
+
{
|
29 |
+
if( Hybrid_Auth::$config["debug_mode"] ){
|
30 |
+
$datetime = new DateTime();
|
31 |
+
$datetime = $datetime->format(DATE_ATOM);
|
32 |
+
|
33 |
+
file_put_contents(
|
34 |
+
Hybrid_Auth::$config["debug_file"],
|
35 |
+
"DEBUG -- " . $_SERVER['REMOTE_ADDR'] . " -- " . $datetime . " -- " . $message . " -- " . print_r($object, true) . "\n",
|
36 |
+
FILE_APPEND
|
37 |
+
);
|
38 |
+
}
|
39 |
+
}
|
40 |
+
|
41 |
+
public static function info( $message )
|
42 |
+
{
|
43 |
+
if( Hybrid_Auth::$config["debug_mode"] ){
|
44 |
+
$datetime = new DateTime();
|
45 |
+
$datetime = $datetime->format(DATE_ATOM);
|
46 |
+
|
47 |
+
file_put_contents(
|
48 |
+
Hybrid_Auth::$config["debug_file"],
|
49 |
+
"INFO -- " . $_SERVER['REMOTE_ADDR'] . " -- " . $datetime . " -- " . $message . "\n",
|
50 |
+
FILE_APPEND
|
51 |
+
);
|
52 |
+
}
|
53 |
+
}
|
54 |
+
|
55 |
+
public static function error($message, $object = NULL)
|
56 |
+
{
|
57 |
+
if( Hybrid_Auth::$config["debug_mode"] ){
|
58 |
+
$datetime = new DateTime();
|
59 |
+
$datetime = $datetime->format(DATE_ATOM);
|
60 |
+
|
61 |
+
file_put_contents(
|
62 |
+
Hybrid_Auth::$config["debug_file"],
|
63 |
+
"ERROR -- " . $_SERVER['REMOTE_ADDR'] . " -- " . $datetime . " -- " . $message . " -- " . print_r($object, true) . "\n",
|
64 |
+
FILE_APPEND
|
65 |
+
);
|
66 |
+
}
|
67 |
+
}
|
68 |
+
}
|
hybridauth/Hybrid/Provider_Adapter.php
ADDED
@@ -0,0 +1,283 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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_Provider_Adapter is the basic class which Hybrid_Auth will use
|
10 |
+
* to connect users to a given provider.
|
11 |
+
*
|
12 |
+
* Basically Hybrid_Provider_Adapterwill 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 |
+
/* Provider ID (or unique name) */
|
21 |
+
public $id = NULL ;
|
22 |
+
|
23 |
+
/* Provider adapter specific config */
|
24 |
+
public $config = NULL ;
|
25 |
+
|
26 |
+
/* Provider adapter extra parameters */
|
27 |
+
public $params = NULL ;
|
28 |
+
|
29 |
+
/* Provider adapter wrapper path */
|
30 |
+
public $wrapper = NULL ;
|
31 |
+
|
32 |
+
/* Provider adapter instance */
|
33 |
+
public $adapter = NULL ;
|
34 |
+
|
35 |
+
// --------------------------------------------------------------------
|
36 |
+
|
37 |
+
/**
|
38 |
+
* create a new adapter switch IDp name or ID
|
39 |
+
*
|
40 |
+
* @param string $id The id or name of the IDp
|
41 |
+
* @param array $params (optional) required parameters by the adapter
|
42 |
+
*/
|
43 |
+
function factory( $id, $params = NULL )
|
44 |
+
{
|
45 |
+
Hybrid_Logger::info( "Enter Hybrid_Provider_Adapter::factory( $id )" );
|
46 |
+
|
47 |
+
# init the adapter config and params
|
48 |
+
$this->id = $id;
|
49 |
+
$this->params = $params;
|
50 |
+
$this->id = $this->getProviderCiId( $this->id );
|
51 |
+
$this->config = $this->getConfigById( $this->id );
|
52 |
+
|
53 |
+
# check the IDp id
|
54 |
+
if( ! $this->id ){
|
55 |
+
throw new Exception( "No provider ID specified.", 2 );
|
56 |
+
}
|
57 |
+
|
58 |
+
# check the IDp config
|
59 |
+
if( ! $this->config ){
|
60 |
+
throw new Exception( "Unknown Provider ID, check your configuration file.", 3 );
|
61 |
+
}
|
62 |
+
|
63 |
+
# check the IDp adapter is enabled
|
64 |
+
if( ! $this->config["enabled"] ){
|
65 |
+
throw new Exception( "The provider '{$this->id}' is not enabled.", 3 );
|
66 |
+
}
|
67 |
+
|
68 |
+
# include the adapter wrapper
|
69 |
+
if( isset( $this->config["wrapper"] ) && is_array( $this->config["wrapper"] ) ){
|
70 |
+
require_once $this->config["wrapper"]["path"];
|
71 |
+
|
72 |
+
if( ! class_exists( $this->config["wrapper"]["class"] ) ){
|
73 |
+
throw new Exception( "Unable to load the adapter class.", 3 );
|
74 |
+
}
|
75 |
+
|
76 |
+
$this->wrapper = $this->config["wrapper"]["class"];
|
77 |
+
}
|
78 |
+
else{
|
79 |
+
require_once Hybrid_Auth::$config["path_providers"] . $this->id . ".php" ;
|
80 |
+
|
81 |
+
$this->wrapper = "Hybrid_Providers_" . $this->id;
|
82 |
+
}
|
83 |
+
|
84 |
+
# create the adapter instance, and pass the current params and config
|
85 |
+
$this->adapter = new $this->wrapper( $this->id, $this->config, $this->params );
|
86 |
+
|
87 |
+
return $this;
|
88 |
+
}
|
89 |
+
|
90 |
+
// --------------------------------------------------------------------
|
91 |
+
|
92 |
+
/**
|
93 |
+
* Hybrid_Provider_Adapter::login(), prepare the user session and the authentication request
|
94 |
+
* for index.php
|
95 |
+
*/
|
96 |
+
function login()
|
97 |
+
{
|
98 |
+
Hybrid_Logger::info( "Enter Hybrid_Provider_Adapter::login( {$this->id} ) " );
|
99 |
+
|
100 |
+
if( ! $this->adapter ){
|
101 |
+
throw new Exception( "Hybrid_Provider_Adapter::login() should not directly used." );
|
102 |
+
}
|
103 |
+
|
104 |
+
// clear all unneeded params
|
105 |
+
foreach( Hybrid_Auth::$config["providers"] as $idpid => $params ){
|
106 |
+
Hybrid_Auth::storage()->delete( "hauth_session.{$idpid}.hauth_return_to" );
|
107 |
+
Hybrid_Auth::storage()->delete( "hauth_session.{$idpid}.hauth_endpoint" );
|
108 |
+
Hybrid_Auth::storage()->delete( "hauth_session.{$idpid}.id_provider_params" );
|
109 |
+
}
|
110 |
+
|
111 |
+
// make a fresh start
|
112 |
+
$this->logout();
|
113 |
+
|
114 |
+
# get hybridauth base url
|
115 |
+
$HYBRID_AUTH_URL_BASE = Hybrid_Auth::$config["base_url"];
|
116 |
+
|
117 |
+
# we make use of session_id() as storage hash to identify the current user
|
118 |
+
# using session_regenerate_id() will be a problem, but ..
|
119 |
+
$this->params["hauth_token"] = session_id();
|
120 |
+
|
121 |
+
# set request timestamp
|
122 |
+
$this->params["hauth_time"] = time();
|
123 |
+
|
124 |
+
# for default HybridAuth endpoint url hauth_login_start_url
|
125 |
+
# auth.start required the IDp ID
|
126 |
+
# auth.time optional login request timestamp
|
127 |
+
$this->params["login_start"] = $HYBRID_AUTH_URL_BASE . ( strpos( $HYBRID_AUTH_URL_BASE, '?' ) ? '&' : '?' ) . "hauth.start={$this->id}&hauth.time={$this->params["hauth_time"]}";
|
128 |
+
|
129 |
+
# for default HybridAuth endpoint url hauth_login_done_url
|
130 |
+
# auth.done required the IDp ID
|
131 |
+
$this->params["login_done"] = $HYBRID_AUTH_URL_BASE . ( strpos( $HYBRID_AUTH_URL_BASE, '?' ) ? '&' : '?' ) . "hauth.done={$this->id}";
|
132 |
+
|
133 |
+
Hybrid_Auth::storage()->set( "hauth_session.{$this->id}.hauth_return_to" , $this->params["hauth_return_to"] );
|
134 |
+
Hybrid_Auth::storage()->set( "hauth_session.{$this->id}.hauth_endpoint" , $this->params["login_done"] );
|
135 |
+
Hybrid_Auth::storage()->set( "hauth_session.{$this->id}.id_provider_params" , $this->params );
|
136 |
+
|
137 |
+
// store config to be used by the end point
|
138 |
+
Hybrid_Auth::storage()->config( "CONFIG", Hybrid_Auth::$config );
|
139 |
+
|
140 |
+
// move on
|
141 |
+
Hybrid_Logger::debug( "Hybrid_Provider_Adapter::login( {$this->id} ), redirect the user to login_start URL." );
|
142 |
+
|
143 |
+
Hybrid_Auth::redirect( $this->params["login_start"] );
|
144 |
+
}
|
145 |
+
|
146 |
+
// --------------------------------------------------------------------
|
147 |
+
|
148 |
+
/**
|
149 |
+
* let hybridauth forget all about the user for the current provider
|
150 |
+
*/
|
151 |
+
function logout()
|
152 |
+
{
|
153 |
+
$this->adapter->logout();
|
154 |
+
}
|
155 |
+
|
156 |
+
// --------------------------------------------------------------------
|
157 |
+
|
158 |
+
/**
|
159 |
+
* return true if the user is connected to the current provider
|
160 |
+
*/
|
161 |
+
public function isUserConnected()
|
162 |
+
{
|
163 |
+
return $this->adapter->isUserConnected();
|
164 |
+
}
|
165 |
+
|
166 |
+
// --------------------------------------------------------------------
|
167 |
+
|
168 |
+
/**
|
169 |
+
* handle :
|
170 |
+
* getUserProfile()
|
171 |
+
* getUserContacts()
|
172 |
+
* getUserActivity()
|
173 |
+
* setUserStatus()
|
174 |
+
*/
|
175 |
+
public function __call( $name, $arguments )
|
176 |
+
{
|
177 |
+
Hybrid_Logger::info( "Enter Hybrid_Provider_Adapter::$name(), Provider: {$this->id}" );
|
178 |
+
|
179 |
+
if ( ! $this->isUserConnected() ){
|
180 |
+
throw new Exception( "User not connected to the provider {$this->id}.", 7 );
|
181 |
+
}
|
182 |
+
|
183 |
+
if ( ! method_exists( $this->adapter, $name ) ){
|
184 |
+
throw new Exception( "Call to undefined function Hybrid_Providers_{$this->id}::$name()." );
|
185 |
+
}
|
186 |
+
|
187 |
+
if( count( $arguments ) ){
|
188 |
+
return $this->adapter->$name( $arguments[0] );
|
189 |
+
}
|
190 |
+
else{
|
191 |
+
return $this->adapter->$name();
|
192 |
+
}
|
193 |
+
}
|
194 |
+
|
195 |
+
// --------------------------------------------------------------------
|
196 |
+
|
197 |
+
/**
|
198 |
+
* If the user is connected, then return the access_token and access_token_secret
|
199 |
+
* if the provider api use oauth
|
200 |
+
*/
|
201 |
+
public function getAccessToken()
|
202 |
+
{
|
203 |
+
if( ! $this->adapter->isUserConnected() ){
|
204 |
+
Hybrid_Logger::error( "User not connected to the provider." );
|
205 |
+
|
206 |
+
throw new Exception( "User not connected to the provider.", 7 );
|
207 |
+
}
|
208 |
+
|
209 |
+
return
|
210 |
+
ARRAY(
|
211 |
+
"access_token" => $this->adapter->token( "access_token" ) , // OAuth access token
|
212 |
+
"access_token_secret" => $this->adapter->token( "access_token_secret" ), // OAuth access token secret
|
213 |
+
"refresh_token" => $this->adapter->token( "refresh_token" ) , // OAuth refresh token
|
214 |
+
"expires_in" => $this->adapter->token( "expires_in" ) , // OPTIONAL. The duration in seconds of the access token lifetime
|
215 |
+
"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
|
216 |
+
);
|
217 |
+
}
|
218 |
+
|
219 |
+
// --------------------------------------------------------------------
|
220 |
+
|
221 |
+
/**
|
222 |
+
* Naive getter of the current connected IDp API client
|
223 |
+
*/
|
224 |
+
function api()
|
225 |
+
{
|
226 |
+
if( ! $this->adapter->isUserConnected() ){
|
227 |
+
Hybrid_Logger::error( "User not connected to the provider." );
|
228 |
+
|
229 |
+
throw new Exception( "User not connected to the provider.", 7 );
|
230 |
+
}
|
231 |
+
|
232 |
+
return $this->adapter->api;
|
233 |
+
}
|
234 |
+
|
235 |
+
// --------------------------------------------------------------------
|
236 |
+
|
237 |
+
/**
|
238 |
+
* redirect the user to hauth_return_to (the callback url)
|
239 |
+
*/
|
240 |
+
function returnToCallbackUrl()
|
241 |
+
{
|
242 |
+
// get the stored callback url
|
243 |
+
$callback_url = Hybrid_Auth::storage()->get( "hauth_session.{$this->id}.hauth_return_to" );
|
244 |
+
|
245 |
+
// remove some unneed'd stored data
|
246 |
+
Hybrid_Auth::storage()->delete( "hauth_session.{$this->id}.hauth_return_to" );
|
247 |
+
Hybrid_Auth::storage()->delete( "hauth_session.{$this->id}.hauth_endpoint" );
|
248 |
+
Hybrid_Auth::storage()->delete( "hauth_session.{$this->id}.id_provider_params" );
|
249 |
+
|
250 |
+
// back to home
|
251 |
+
Hybrid_Auth::redirect( $callback_url );
|
252 |
+
}
|
253 |
+
|
254 |
+
// --------------------------------------------------------------------
|
255 |
+
|
256 |
+
/**
|
257 |
+
* return the provider config by id
|
258 |
+
*/
|
259 |
+
function getConfigById( $id )
|
260 |
+
{
|
261 |
+
if( isset( Hybrid_Auth::$config["providers"][$id] ) ){
|
262 |
+
return Hybrid_Auth::$config["providers"][$id];
|
263 |
+
}
|
264 |
+
|
265 |
+
return NULL;
|
266 |
+
}
|
267 |
+
|
268 |
+
// --------------------------------------------------------------------
|
269 |
+
|
270 |
+
/**
|
271 |
+
* return the provider config by id; insensitive
|
272 |
+
*/
|
273 |
+
function getProviderCiId( $id )
|
274 |
+
{
|
275 |
+
foreach( Hybrid_Auth::$config["providers"] as $idpid => $params ){
|
276 |
+
if( strtolower( $idpid ) == strtolower( $id ) ){
|
277 |
+
return $idpid;
|
278 |
+
}
|
279 |
+
}
|
280 |
+
|
281 |
+
return NULL;
|
282 |
+
}
|
283 |
+
}
|
hybridauth/Hybrid/Provider_Model.php
ADDED
@@ -0,0 +1,231 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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_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 |
+
/* IDp ID (or unique name) */
|
25 |
+
public $providerId = NULL;
|
26 |
+
|
27 |
+
/* specific provider adapter config */
|
28 |
+
public $config = NULL;
|
29 |
+
|
30 |
+
/* provider extra parameters */
|
31 |
+
public $params = NULL;
|
32 |
+
|
33 |
+
/* Endpoint URL for that provider */
|
34 |
+
public $endpoint = NULL;
|
35 |
+
|
36 |
+
/* Hybrid_User obj, represents the current loggedin user */
|
37 |
+
public $user = NULL;
|
38 |
+
|
39 |
+
/* the provider api client (optional) */
|
40 |
+
public $api = NULL;
|
41 |
+
|
42 |
+
/**
|
43 |
+
* common providers adapter constructor
|
44 |
+
*/
|
45 |
+
function __construct( $providerId, $config, $params = NULL )
|
46 |
+
{
|
47 |
+
# init the IDp adapter parameters, get them from the cache if possible
|
48 |
+
if( ! $params ){
|
49 |
+
$this->params = Hybrid_Auth::storage()->get( "hauth_session.$providerId.id_provider_params" );
|
50 |
+
}
|
51 |
+
else{
|
52 |
+
$this->params = $params;
|
53 |
+
}
|
54 |
+
|
55 |
+
// idp id
|
56 |
+
$this->providerId = $providerId;
|
57 |
+
|
58 |
+
// set HybridAuth endpoint for this provider
|
59 |
+
$this->endpoint = Hybrid_Auth::storage()->get( "hauth_session.$providerId.hauth_endpoint" );
|
60 |
+
|
61 |
+
// idp config
|
62 |
+
$this->config = $config;
|
63 |
+
|
64 |
+
// new user instance
|
65 |
+
$this->user = new Hybrid_User();
|
66 |
+
$this->user->providerId = $providerId;
|
67 |
+
|
68 |
+
// initialize the current provider adapter
|
69 |
+
$this->initialize();
|
70 |
+
|
71 |
+
Hybrid_Logger::debug( "Hybrid_Provider_Model::__construct( $providerId ) initialized. dump current adapter instance: ", serialize( $this ) );
|
72 |
+
}
|
73 |
+
|
74 |
+
// --------------------------------------------------------------------
|
75 |
+
|
76 |
+
/**
|
77 |
+
* IDp wrappers initializer
|
78 |
+
*
|
79 |
+
* The main job of wrappers initializer is to performs (depend on the IDp api client it self):
|
80 |
+
* - include some libs nedded by this provider,
|
81 |
+
* - check IDp key and secret,
|
82 |
+
* - set some needed parameters (stored in $this->params) by this IDp api client
|
83 |
+
* - create and setup an instance of the IDp api client on $this->api
|
84 |
+
*/
|
85 |
+
abstract protected function initialize();
|
86 |
+
|
87 |
+
// --------------------------------------------------------------------
|
88 |
+
|
89 |
+
/**
|
90 |
+
* begin login
|
91 |
+
*/
|
92 |
+
abstract protected function loginBegin();
|
93 |
+
|
94 |
+
// --------------------------------------------------------------------
|
95 |
+
|
96 |
+
/**
|
97 |
+
* finish login
|
98 |
+
*/
|
99 |
+
abstract protected function loginFinish();
|
100 |
+
|
101 |
+
// --------------------------------------------------------------------
|
102 |
+
|
103 |
+
/**
|
104 |
+
* generic logout, just erase current provider adapter stored data to let Hybrid_Auth all forget about it
|
105 |
+
*/
|
106 |
+
function logout()
|
107 |
+
{
|
108 |
+
Hybrid_Logger::info( "Enter [{$this->providerId}]::logout()" );
|
109 |
+
|
110 |
+
$this->clearTokens();
|
111 |
+
|
112 |
+
return TRUE;
|
113 |
+
}
|
114 |
+
|
115 |
+
// --------------------------------------------------------------------
|
116 |
+
|
117 |
+
/**
|
118 |
+
* grab the user profile from the IDp api client
|
119 |
+
*/
|
120 |
+
function getUserProfile()
|
121 |
+
{
|
122 |
+
Hybrid_Logger::error( "HybridAuth do not provide users contats list for {$this->providerId} yet." );
|
123 |
+
|
124 |
+
throw new Exception( "Provider does not support this feature.", 8 );
|
125 |
+
}
|
126 |
+
|
127 |
+
// --------------------------------------------------------------------
|
128 |
+
|
129 |
+
/**
|
130 |
+
* load the current logged in user contacts list from the IDp api client
|
131 |
+
*/
|
132 |
+
function getUserContacts()
|
133 |
+
{
|
134 |
+
Hybrid_Logger::error( "HybridAuth do not provide users contats list for {$this->providerId} yet." );
|
135 |
+
|
136 |
+
throw new Exception( "Provider does not support this feature.", 8 );
|
137 |
+
}
|
138 |
+
|
139 |
+
// --------------------------------------------------------------------
|
140 |
+
|
141 |
+
/**
|
142 |
+
* return the user activity stream
|
143 |
+
*/
|
144 |
+
function getUserActivity( $stream )
|
145 |
+
{
|
146 |
+
Hybrid_Logger::error( "HybridAuth do not provide user's activity stream for {$this->providerId} yet." );
|
147 |
+
|
148 |
+
throw new Exception( "Provider does not support this feature.", 8 );
|
149 |
+
}
|
150 |
+
|
151 |
+
// --------------------------------------------------------------------
|
152 |
+
|
153 |
+
/**
|
154 |
+
* return the user activity stream
|
155 |
+
*/
|
156 |
+
function setUserStatus( $status )
|
157 |
+
{
|
158 |
+
Hybrid_Logger::error( "HybridAuth do not provide user's activity stream for {$this->providerId} yet." );
|
159 |
+
|
160 |
+
throw new Exception( "Provider does not support this feature.", 8 );
|
161 |
+
}
|
162 |
+
|
163 |
+
// --------------------------------------------------------------------
|
164 |
+
|
165 |
+
/**
|
166 |
+
* return true if the user is connected to the current provider
|
167 |
+
*/
|
168 |
+
public function isUserConnected()
|
169 |
+
{
|
170 |
+
return (bool) Hybrid_Auth::storage()->get( "hauth_session.{$this->providerId}.is_logged_in" );
|
171 |
+
}
|
172 |
+
|
173 |
+
// --------------------------------------------------------------------
|
174 |
+
|
175 |
+
/**
|
176 |
+
* set user to connected
|
177 |
+
*/
|
178 |
+
public function setUserConnected()
|
179 |
+
{
|
180 |
+
Hybrid_Logger::info( "Enter [{$this->providerId}]::setUserConnected()" );
|
181 |
+
|
182 |
+
Hybrid_Auth::storage()->set( "hauth_session.{$this->providerId}.is_logged_in", 1 );
|
183 |
+
}
|
184 |
+
|
185 |
+
// --------------------------------------------------------------------
|
186 |
+
|
187 |
+
/**
|
188 |
+
* set user to unconnected
|
189 |
+
*/
|
190 |
+
public function setUserUnconnected()
|
191 |
+
{
|
192 |
+
Hybrid_Logger::info( "Enter [{$this->providerId}]::setUserUnconnected()" );
|
193 |
+
|
194 |
+
Hybrid_Auth::storage()->set( "hauth_session.{$this->providerId}.is_logged_in", 0 );
|
195 |
+
}
|
196 |
+
|
197 |
+
// --------------------------------------------------------------------
|
198 |
+
|
199 |
+
/**
|
200 |
+
* get or set a token
|
201 |
+
*/
|
202 |
+
public function token( $token, $value = NULL )
|
203 |
+
{
|
204 |
+
if( $value === NULL ){
|
205 |
+
return Hybrid_Auth::storage()->get( "hauth_session.{$this->providerId}.token.$token" );
|
206 |
+
}
|
207 |
+
else{
|
208 |
+
Hybrid_Auth::storage()->set( "hauth_session.{$this->providerId}.token.$token", $value );
|
209 |
+
}
|
210 |
+
}
|
211 |
+
|
212 |
+
// --------------------------------------------------------------------
|
213 |
+
|
214 |
+
/**
|
215 |
+
* delete a stored token
|
216 |
+
*/
|
217 |
+
public function deleteToken( $token )
|
218 |
+
{
|
219 |
+
Hybrid_Auth::storage()->delete( "hauth_session.{$this->providerId}.token.$token" );
|
220 |
+
}
|
221 |
+
|
222 |
+
// --------------------------------------------------------------------
|
223 |
+
|
224 |
+
/**
|
225 |
+
* clear all existen tokens for this provider
|
226 |
+
*/
|
227 |
+
public function clearTokens()
|
228 |
+
{
|
229 |
+
Hybrid_Auth::storage()->deleteMatch( "hauth_session.{$this->providerId}." );
|
230 |
+
}
|
231 |
+
}
|
hybridauth/Hybrid/Provider_Model_OAuth1.php
ADDED
@@ -0,0 +1,161 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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 |
+
* 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 implemenent
|
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 |
+
public $request_tokens_raw = null; // request_tokens as recived from provider
|
23 |
+
public $access_tokens_raw = null; // access_tokens as recived from provider
|
24 |
+
|
25 |
+
/**
|
26 |
+
* try to get the error message from provider api
|
27 |
+
*/
|
28 |
+
function errorMessageByStatus( $code = null ) {
|
29 |
+
$http_status_codes = ARRAY(
|
30 |
+
200 => "OK: Success!",
|
31 |
+
304 => "Not Modified: There was no new data to return.",
|
32 |
+
400 => "Bad Request: The request was invalid.",
|
33 |
+
401 => "Unauthorized.",
|
34 |
+
403 => "Forbidden: The request is understood, but it has been refused.",
|
35 |
+
404 => "Not Found: The URI requested is invalid or the resource requested does not exists.",
|
36 |
+
406 => "Not Acceptable.",
|
37 |
+
500 => "Internal Server Error: Something is broken.",
|
38 |
+
502 => "Bad Gateway.",
|
39 |
+
503 => "Service Unavailable."
|
40 |
+
);
|
41 |
+
|
42 |
+
if( ! $code && $this->api )
|
43 |
+
$code = $this->api->http_code;
|
44 |
+
|
45 |
+
if( isset( $http_status_codes[ $code ] ) )
|
46 |
+
return $code . " " . $http_status_codes[ $code ];
|
47 |
+
}
|
48 |
+
|
49 |
+
// --------------------------------------------------------------------
|
50 |
+
|
51 |
+
/**
|
52 |
+
* adapter initializer
|
53 |
+
*/
|
54 |
+
function initialize()
|
55 |
+
{
|
56 |
+
// 1 - check application credentials
|
57 |
+
if ( ! $this->config["keys"]["key"] || ! $this->config["keys"]["secret"] ){
|
58 |
+
throw new Exception( "Your application key and secret are required in order to connect to {$this->providerId}.", 4 );
|
59 |
+
}
|
60 |
+
|
61 |
+
// 2 - include OAuth lib and client
|
62 |
+
require_once Hybrid_Auth::$config["path_libraries"] . "OAuth/OAuth.php";
|
63 |
+
require_once Hybrid_Auth::$config["path_libraries"] . "OAuth/OAuth1Client.php";
|
64 |
+
|
65 |
+
// 3.1 - setup access_token if any stored
|
66 |
+
if( $this->token( "access_token" ) ){
|
67 |
+
$this->api = new OAuth1Client(
|
68 |
+
$this->config["keys"]["key"], $this->config["keys"]["secret"],
|
69 |
+
$this->token( "access_token" ), $this->token( "access_token_secret" )
|
70 |
+
);
|
71 |
+
}
|
72 |
+
|
73 |
+
// 3.2 - setup request_token if any stored, in order to exchange with an access token
|
74 |
+
elseif( $this->token( "request_token" ) ){
|
75 |
+
$this->api = new OAuth1Client(
|
76 |
+
$this->config["keys"]["key"], $this->config["keys"]["secret"],
|
77 |
+
$this->token( "request_token" ), $this->token( "request_token_secret" )
|
78 |
+
);
|
79 |
+
}
|
80 |
+
|
81 |
+
// 3.3 - instanciate OAuth client with client credentials
|
82 |
+
else{
|
83 |
+
$this->api = new OAuth1Client( $this->config["keys"]["key"], $this->config["keys"]["secret"] );
|
84 |
+
}
|
85 |
+
|
86 |
+
// Set curl proxy if exist
|
87 |
+
if( isset( Hybrid_Auth::$config["proxy"] ) ){
|
88 |
+
$this->api->curl_proxy = Hybrid_Auth::$config["proxy"];
|
89 |
+
}
|
90 |
+
}
|
91 |
+
|
92 |
+
// --------------------------------------------------------------------
|
93 |
+
|
94 |
+
/**
|
95 |
+
* begin login step
|
96 |
+
*/
|
97 |
+
function loginBegin()
|
98 |
+
{
|
99 |
+
$tokens = $this->api->requestToken( $this->endpoint );
|
100 |
+
|
101 |
+
// request tokens as recived from provider
|
102 |
+
$this->request_tokens_raw = $tokens;
|
103 |
+
|
104 |
+
// check the last HTTP status code returned
|
105 |
+
if ( $this->api->http_code != 200 ){
|
106 |
+
throw new Exception( "Authentication failed! {$this->providerId} returned an error. " . $this->errorMessageByStatus( $this->api->http_code ), 5 );
|
107 |
+
}
|
108 |
+
|
109 |
+
if ( ! isset( $tokens["oauth_token"] ) ){
|
110 |
+
throw new Exception( "Authentication failed! {$this->providerId} returned an invalid oauth token.", 5 );
|
111 |
+
}
|
112 |
+
|
113 |
+
$this->token( "request_token" , $tokens["oauth_token"] );
|
114 |
+
$this->token( "request_token_secret", $tokens["oauth_token_secret"] );
|
115 |
+
|
116 |
+
# redirect the user to the provider authentication url
|
117 |
+
Hybrid_Auth::redirect( $this->api->authorizeUrl( $tokens ) );
|
118 |
+
}
|
119 |
+
|
120 |
+
// --------------------------------------------------------------------
|
121 |
+
|
122 |
+
/**
|
123 |
+
* finish login step
|
124 |
+
*/
|
125 |
+
function loginFinish()
|
126 |
+
{
|
127 |
+
$oauth_token = (array_key_exists('oauth_token',$_REQUEST))?$_REQUEST['oauth_token']:"";
|
128 |
+
$oauth_verifier = (array_key_exists('oauth_verifier',$_REQUEST))?$_REQUEST['oauth_verifier']:"";
|
129 |
+
|
130 |
+
if ( ! $oauth_token || ! $oauth_verifier ){
|
131 |
+
throw new Exception( "Authentication failed! {$this->providerId} returned an invalid oauth verifier.", 5 );
|
132 |
+
}
|
133 |
+
|
134 |
+
// request an access token
|
135 |
+
$tokens = $this->api->accessToken( $oauth_verifier );
|
136 |
+
|
137 |
+
// access tokens as recived from provider
|
138 |
+
$this->access_tokens_raw = $tokens;
|
139 |
+
|
140 |
+
// check the last HTTP status code returned
|
141 |
+
if ( $this->api->http_code != 200 ){
|
142 |
+
throw new Exception( "Authentication failed! {$this->providerId} returned an error. " . $this->errorMessageByStatus( $this->api->http_code ), 5 );
|
143 |
+
}
|
144 |
+
|
145 |
+
// we should have an access_token, or else, something has gone wrong
|
146 |
+
if ( ! isset( $tokens["oauth_token"] ) ){
|
147 |
+
throw new Exception( "Authentication failed! {$this->providerId} returned an invalid access token.", 5 );
|
148 |
+
}
|
149 |
+
|
150 |
+
// we no more need to store requet tokens
|
151 |
+
$this->deleteToken( "request_token" );
|
152 |
+
$this->deleteToken( "request_token_secret" );
|
153 |
+
|
154 |
+
// sotre access_token for later user
|
155 |
+
$this->token( "access_token" , $tokens['oauth_token'] );
|
156 |
+
$this->token( "access_token_secret" , $tokens['oauth_token_secret'] );
|
157 |
+
|
158 |
+
// set user as logged in to the current provider
|
159 |
+
$this->setUserConnected();
|
160 |
+
}
|
161 |
+
}
|
hybridauth/Hybrid/Provider_Model_OAuth2.php
ADDED
@@ -0,0 +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 |
+
* 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 implemenent
|
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 |
+
// default permissions
|
23 |
+
public $scope = "";
|
24 |
+
|
25 |
+
/**
|
26 |
+
* try to get the error message from provider api
|
27 |
+
*/
|
28 |
+
function errorMessageByStatus( $code = null ) {
|
29 |
+
$http_status_codes = ARRAY(
|
30 |
+
200 => "OK: Success!",
|
31 |
+
304 => "Not Modified: There was no new data to return.",
|
32 |
+
400 => "Bad Request: The request was invalid.",
|
33 |
+
401 => "Unauthorized.",
|
34 |
+
403 => "Forbidden: The request is understood, but it has been refused.",
|
35 |
+
404 => "Not Found: The URI requested is invalid or the resource requested does not exists.",
|
36 |
+
406 => "Not Acceptable.",
|
37 |
+
500 => "Internal Server Error: Something is broken.",
|
38 |
+
502 => "Bad Gateway.",
|
39 |
+
503 => "Service Unavailable."
|
40 |
+
);
|
41 |
+
|
42 |
+
if( ! $code && $this->api )
|
43 |
+
$code = $this->api->http_code;
|
44 |
+
|
45 |
+
if( isset( $http_status_codes[ $code ] ) )
|
46 |
+
return $code . " " . $http_status_codes[ $code ];
|
47 |
+
}
|
48 |
+
|
49 |
+
// --------------------------------------------------------------------
|
50 |
+
|
51 |
+
/**
|
52 |
+
* adapter initializer
|
53 |
+
*/
|
54 |
+
function initialize()
|
55 |
+
{
|
56 |
+
if ( ! $this->config["keys"]["id"] || ! $this->config["keys"]["secret"] ){
|
57 |
+
throw new Exception( "Your application id and secret are required in order to connect to {$this->providerId}.", 4 );
|
58 |
+
}
|
59 |
+
|
60 |
+
// override requested scope
|
61 |
+
if( isset( $this->config["scope"] ) && ! empty( $this->config["scope"] ) ){
|
62 |
+
$this->scope = $this->config["scope"];
|
63 |
+
}
|
64 |
+
|
65 |
+
// include OAuth2 client
|
66 |
+
require_once Hybrid_Auth::$config["path_libraries"] . "OAuth/OAuth2Client.php";
|
67 |
+
|
68 |
+
// create a new OAuth2 client instance
|
69 |
+
$this->api = new OAuth2Client( $this->config["keys"]["id"], $this->config["keys"]["secret"], $this->endpoint );
|
70 |
+
|
71 |
+
// If we have an access token, set it
|
72 |
+
if( $this->token( "access_token" ) ){
|
73 |
+
$this->api->access_token = $this->token( "access_token" );
|
74 |
+
$this->api->refresh_token = $this->token( "refresh_token" );
|
75 |
+
$this->api->access_token_expires_in = $this->token( "expires_in" );
|
76 |
+
$this->api->access_token_expires_at = $this->token( "expires_at" );
|
77 |
+
}
|
78 |
+
|
79 |
+
// Set curl proxy if exist
|
80 |
+
if( isset( Hybrid_Auth::$config["proxy"] ) ){
|
81 |
+
$this->api->curl_proxy = Hybrid_Auth::$config["proxy"];
|
82 |
+
}
|
83 |
+
}
|
84 |
+
|
85 |
+
// --------------------------------------------------------------------
|
86 |
+
|
87 |
+
/**
|
88 |
+
* begin login step
|
89 |
+
*/
|
90 |
+
function loginBegin()
|
91 |
+
{
|
92 |
+
// redirect the user to the provider authentication url
|
93 |
+
Hybrid_Auth::redirect( $this->api->authorizeUrl( array( "scope" => $this->scope ) ) );
|
94 |
+
}
|
95 |
+
|
96 |
+
// --------------------------------------------------------------------
|
97 |
+
|
98 |
+
/**
|
99 |
+
* finish login step
|
100 |
+
*/
|
101 |
+
function loginFinish()
|
102 |
+
{
|
103 |
+
$error = (array_key_exists('error',$_REQUEST))?$_REQUEST['error']:"";
|
104 |
+
|
105 |
+
// check for errors
|
106 |
+
if ( $error ){
|
107 |
+
throw new Exception( "Authentication failed! {$this->providerId} returned an error: $error", 5 );
|
108 |
+
}
|
109 |
+
|
110 |
+
// try to authenicate user
|
111 |
+
$code = (array_key_exists('code',$_REQUEST))?$_REQUEST['code']:"";
|
112 |
+
|
113 |
+
try{
|
114 |
+
$this->api->authenticate( $code );
|
115 |
+
}
|
116 |
+
catch( Exception $e ){
|
117 |
+
throw new Exception( "User profile request failed! {$this->providerId} returned an error: $e", 6 );
|
118 |
+
}
|
119 |
+
|
120 |
+
// check if authenticated
|
121 |
+
if ( ! $this->api->access_token ){
|
122 |
+
throw new Exception( "Authentication failed! {$this->providerId} returned an invalid access token.", 5 );
|
123 |
+
}
|
124 |
+
|
125 |
+
// store tokens
|
126 |
+
$this->token( "access_token" , $this->api->access_token );
|
127 |
+
$this->token( "refresh_token", $this->api->refresh_token );
|
128 |
+
$this->token( "expires_in" , $this->api->access_token_expires_in );
|
129 |
+
$this->token( "expires_at" , $this->api->access_token_expires_at );
|
130 |
+
|
131 |
+
// set user connected locally
|
132 |
+
$this->setUserConnected();
|
133 |
+
}
|
134 |
+
|
135 |
+
function refreshToken()
|
136 |
+
{
|
137 |
+
// have an access token?
|
138 |
+
if( $this->api->access_token ){
|
139 |
+
|
140 |
+
// have to refresh?
|
141 |
+
if( $this->api->refresh_token && $this->api->access_token_expires_at ){
|
142 |
+
|
143 |
+
// expired?
|
144 |
+
if( $this->api->access_token_expires_at <= time() ){
|
145 |
+
$response = $this->api->refreshToken( array( "refresh_token" => $this->api->refresh_token ) );
|
146 |
+
|
147 |
+
if( ! isset( $response->access_token ) || ! $response->access_token ){
|
148 |
+
// set the user as disconnected at this point and throw an exception
|
149 |
+
$this->setUserUnconnected();
|
150 |
+
|
151 |
+
throw new Exception( "The Authorization Service has return an invalid response while requesting a new access token. " . (string) $response->error );
|
152 |
+
}
|
153 |
+
|
154 |
+
// set new access_token
|
155 |
+
$this->api->access_token = $response->access_token;
|
156 |
+
|
157 |
+
if( isset( $response->refresh_token ) )
|
158 |
+
$this->api->refresh_token = $response->refresh_token;
|
159 |
+
|
160 |
+
if( isset( $response->expires_in ) ){
|
161 |
+
$this->api->access_token_expires_in = $response->expires_in;
|
162 |
+
|
163 |
+
// even given by some idp, we should calculate this
|
164 |
+
$this->api->access_token_expires_at = time() + $response->expires_in;
|
165 |
+
}
|
166 |
+
}
|
167 |
+
}
|
168 |
+
|
169 |
+
// re store tokens
|
170 |
+
$this->token( "access_token" , $this->api->access_token );
|
171 |
+
$this->token( "refresh_token", $this->api->refresh_token );
|
172 |
+
$this->token( "expires_in" , $this->api->access_token_expires_in );
|
173 |
+
$this->token( "expires_at" , $this->api->access_token_expires_at );
|
174 |
+
}
|
175 |
+
}
|
176 |
+
}
|
hybridauth/Hybrid/Provider_Model_OpenID.php
ADDED
@@ -0,0 +1,172 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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 |
+
* 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 |
+
/* Openid provider identifier */
|
21 |
+
public $openidIdentifier = "";
|
22 |
+
|
23 |
+
// --------------------------------------------------------------------
|
24 |
+
|
25 |
+
/**
|
26 |
+
* adapter initializer
|
27 |
+
*/
|
28 |
+
function initialize()
|
29 |
+
{
|
30 |
+
if( isset( $this->params["openid_identifier"] ) ){
|
31 |
+
$this->openidIdentifier = $this->params["openid_identifier"];
|
32 |
+
}
|
33 |
+
|
34 |
+
// include LightOpenID lib
|
35 |
+
require_once Hybrid_Auth::$config["path_libraries"] . "OpenID/LightOpenID.php";
|
36 |
+
|
37 |
+
// An error was occurring when proxy wasn't set. Not sure where proxy was meant to be set/initialized.
|
38 |
+
Hybrid_Auth::$config['proxy'] = isset(Hybrid_Auth::$config['proxy'])?Hybrid_Auth::$config['proxy']:'';
|
39 |
+
|
40 |
+
$this->api = new LightOpenID( parse_url( Hybrid_Auth::$config["base_url"], PHP_URL_HOST), Hybrid_Auth::$config["proxy"] );
|
41 |
+
}
|
42 |
+
|
43 |
+
// --------------------------------------------------------------------
|
44 |
+
|
45 |
+
/**
|
46 |
+
* begin login step
|
47 |
+
*/
|
48 |
+
function loginBegin()
|
49 |
+
{
|
50 |
+
if( empty( $this->openidIdentifier ) ){
|
51 |
+
throw new Exception( "OpenID adapter require the identity provider identifier 'openid_identifier' as an extra parameter.", 4 );
|
52 |
+
}
|
53 |
+
|
54 |
+
$this->api->identity = $this->openidIdentifier;
|
55 |
+
$this->api->returnUrl = $this->endpoint;
|
56 |
+
$this->api->required = ARRAY(
|
57 |
+
'namePerson/first' ,
|
58 |
+
'namePerson/last' ,
|
59 |
+
'namePerson/friendly' ,
|
60 |
+
'namePerson' ,
|
61 |
+
|
62 |
+
'contact/email' ,
|
63 |
+
|
64 |
+
'birthDate' ,
|
65 |
+
'birthDate/birthDay' ,
|
66 |
+
'birthDate/birthMonth' ,
|
67 |
+
'birthDate/birthYear' ,
|
68 |
+
|
69 |
+
'person/gender' ,
|
70 |
+
'pref/language' ,
|
71 |
+
|
72 |
+
'contact/postalCode/home',
|
73 |
+
'contact/city/home' ,
|
74 |
+
'contact/country/home' ,
|
75 |
+
|
76 |
+
'media/image/default' ,
|
77 |
+
);
|
78 |
+
|
79 |
+
# redirect the user to the provider authentication url
|
80 |
+
Hybrid_Auth::redirect( $this->api->authUrl() );
|
81 |
+
}
|
82 |
+
|
83 |
+
// --------------------------------------------------------------------
|
84 |
+
|
85 |
+
/**
|
86 |
+
* finish login step
|
87 |
+
*/
|
88 |
+
function loginFinish()
|
89 |
+
{
|
90 |
+
# if user don't garant acess of their data to your site, halt with an Exception
|
91 |
+
if( $this->api->mode == 'cancel'){
|
92 |
+
throw new Exception( "Authentication failed! User has canceled authentication!", 5 );
|
93 |
+
}
|
94 |
+
|
95 |
+
# if something goes wrong
|
96 |
+
if( ! $this->api->validate() ){
|
97 |
+
throw new Exception( "Authentication failed. Invalid request recived!", 5 );
|
98 |
+
}
|
99 |
+
|
100 |
+
# fetch recived user data
|
101 |
+
$response = $this->api->getAttributes();
|
102 |
+
|
103 |
+
# sotre the user profile
|
104 |
+
$this->user->profile->identifier = $this->api->identity;
|
105 |
+
|
106 |
+
$this->user->profile->firstName = (array_key_exists("namePerson/first",$response))?$response["namePerson/first"]:"";
|
107 |
+
$this->user->profile->lastName = (array_key_exists("namePerson/last",$response))?$response["namePerson/last"]:"";
|
108 |
+
$this->user->profile->displayName = (array_key_exists("namePerson",$response))?$response["namePerson"]:"";
|
109 |
+
$this->user->profile->email = (array_key_exists("contact/email",$response))?$response["contact/email"]:"";
|
110 |
+
$this->user->profile->language = (array_key_exists("pref/language",$response))?$response["pref/language"]:"";
|
111 |
+
$this->user->profile->country = (array_key_exists("contact/country/home",$response))?$response["contact/country/home"]:"";
|
112 |
+
$this->user->profile->zip = (array_key_exists("contact/postalCode/home",$response))?$response["contact/postalCode/home"]:"";
|
113 |
+
$this->user->profile->gender = (array_key_exists("person/gender",$response))?$response["person/gender"]:"";
|
114 |
+
$this->user->profile->photoURL = (array_key_exists("media/image/default",$response))?$response["media/image/default"]:"";
|
115 |
+
|
116 |
+
$this->user->profile->birthDay = (array_key_exists("birthDate/birthDay",$response))?$response["birthDate/birthDay"]:"";
|
117 |
+
$this->user->profile->birthMonth = (array_key_exists("birthDate/birthMonth",$response))?$response["birthDate/birthMonth"]:"";
|
118 |
+
$this->user->profile->birthYear = (array_key_exists("birthDate/birthDate",$response))?$response["birthDate/birthDate"]:"";
|
119 |
+
|
120 |
+
if( ! $this->user->profile->displayName ) {
|
121 |
+
$this->user->profile->displayName = trim( $this->user->profile->lastName . " " . $this->user->profile->firstName );
|
122 |
+
}
|
123 |
+
|
124 |
+
if( isset( $response['namePerson/friendly'] ) && ! empty( $response['namePerson/friendly'] ) && ! $this->user->profile->displayName ) {
|
125 |
+
$this->user->profile->displayName = (array_key_exists("namePerson/friendly",$response))?$response["namePerson/friendly"]:"" ;
|
126 |
+
}
|
127 |
+
|
128 |
+
if( isset( $response['birthDate'] ) && ! empty( $response['birthDate'] ) && ! $this->user->profile->birthDay ) {
|
129 |
+
list( $birthday_year, $birthday_month, $birthday_day ) = (array_key_exists('birthDate',$response))?$response['birthDate']:"";
|
130 |
+
|
131 |
+
$this->user->profile->birthDay = (int) $birthday_day;
|
132 |
+
$this->user->profile->birthMonth = (int) $birthday_month;
|
133 |
+
$this->user->profile->birthYear = (int) $birthday_year;
|
134 |
+
}
|
135 |
+
|
136 |
+
if( ! $this->user->profile->displayName ){
|
137 |
+
$this->user->profile->displayName = trim( $this->user->profile->firstName . " " . $this->user->profile->lastName );
|
138 |
+
}
|
139 |
+
|
140 |
+
if( $this->user->profile->gender == "f" ){
|
141 |
+
$this->user->profile->gender = "female";
|
142 |
+
}
|
143 |
+
|
144 |
+
if( $this->user->profile->gender == "m" ){
|
145 |
+
$this->user->profile->gender = "male";
|
146 |
+
}
|
147 |
+
|
148 |
+
// set user as logged in
|
149 |
+
$this->setUserConnected();
|
150 |
+
|
151 |
+
// with openid providers we get the user profile only once, so store it
|
152 |
+
Hybrid_Auth::storage()->set( "hauth_session.{$this->providerId}.user", $this->user );
|
153 |
+
}
|
154 |
+
|
155 |
+
// --------------------------------------------------------------------
|
156 |
+
|
157 |
+
/**
|
158 |
+
* load the user profile from the IDp api client
|
159 |
+
*/
|
160 |
+
function getUserProfile()
|
161 |
+
{
|
162 |
+
// try to get the user profile from stored data
|
163 |
+
$this->user = Hybrid_Auth::storage()->get( "hauth_session.{$this->providerId}.user" ) ;
|
164 |
+
|
165 |
+
// if not found
|
166 |
+
if ( ! is_object( $this->user ) ){
|
167 |
+
throw new Exception( "User profile request failed! User is not connected to {$this->providerId} or his session has expired.", 6 );
|
168 |
+
}
|
169 |
+
|
170 |
+
return $this->user->profile;
|
171 |
+
}
|
172 |
+
}
|
hybridauth/Hybrid/Providers/AOL.php
ADDED
@@ -0,0 +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 |
+
}
|
hybridauth/Hybrid/Providers/Facebook.php
ADDED
@@ -0,0 +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_Facebook provider adapter based on OAuth2 protocol
|
10 |
+
*
|
11 |
+
* Hybrid_Providers_Facebook use the Facebook PHP SDK created by Facebook
|
12 |
+
*
|
13 |
+
* http://hybridauth.sourceforge.net/userguide/IDProvider_info_Facebook.html
|
14 |
+
*/
|
15 |
+
class Hybrid_Providers_Facebook extends Hybrid_Provider_Model
|
16 |
+
{
|
17 |
+
// default permissions, and alot of them. You can change them from the configuration by setting the scope to what you want/need
|
18 |
+
public $scope = "email, user_about_me, user_birthday, user_hometown, user_website, read_stream, offline_access, publish_stream, read_friendlists";
|
19 |
+
|
20 |
+
/**
|
21 |
+
* IDp wrappers initializer
|
22 |
+
*/
|
23 |
+
function initialize()
|
24 |
+
{
|
25 |
+
if ( ! $this->config["keys"]["id"] || ! $this->config["keys"]["secret"] ){
|
26 |
+
throw new Exception( "Your application id and secret are required in order to connect to {$this->providerId}.", 4 );
|
27 |
+
}
|
28 |
+
|
29 |
+
if ( ! class_exists('FacebookApiException', false) ) {
|
30 |
+
require_once Hybrid_Auth::$config["path_libraries"] . "Facebook/base_facebook.php";
|
31 |
+
require_once Hybrid_Auth::$config["path_libraries"] . "Facebook/facebook.php";
|
32 |
+
}
|
33 |
+
|
34 |
+
BaseFacebook::$CURL_OPTS[CURLOPT_SSL_VERIFYPEER] = false;
|
35 |
+
|
36 |
+
$this->api = new Facebook( ARRAY( 'appId' => $this->config["keys"]["id"], 'secret' => $this->config["keys"]["secret"] ) );
|
37 |
+
|
38 |
+
if ( $this->token("access_token") ) {
|
39 |
+
$this->api->setAccessToken( $this->token("access_token") );
|
40 |
+
$this->api->setExtendedAccessToken();
|
41 |
+
$access_token = $this->api->getAccessToken();
|
42 |
+
|
43 |
+
if( $access_token ){
|
44 |
+
$this->token("access_token", $access_token );
|
45 |
+
$this->api->setAccessToken( $access_token );
|
46 |
+
}
|
47 |
+
|
48 |
+
$this->api->setAccessToken( $this->token("access_token") );
|
49 |
+
}
|
50 |
+
|
51 |
+
$this->api->getUser();
|
52 |
+
}
|
53 |
+
|
54 |
+
/**
|
55 |
+
* begin login step
|
56 |
+
*
|
57 |
+
* simply call Facebook::require_login().
|
58 |
+
*/
|
59 |
+
function loginBegin()
|
60 |
+
{
|
61 |
+
$parameters = array("scope" => $this->scope, "redirect_uri" => $this->endpoint, "display" => "page");
|
62 |
+
$optionals = array("scope", "redirect_uri", "display");
|
63 |
+
|
64 |
+
foreach ($optionals as $parameter){
|
65 |
+
if( isset( $this->config[$parameter] ) && ! empty( $this->config[$parameter] ) ){
|
66 |
+
$parameters[$parameter] = $this->config[$parameter];
|
67 |
+
}
|
68 |
+
}
|
69 |
+
|
70 |
+
// get the login url
|
71 |
+
$url = $this->api->getLoginUrl( $parameters );
|
72 |
+
|
73 |
+
// redirect to facebook
|
74 |
+
Hybrid_Auth::redirect( $url );
|
75 |
+
}
|
76 |
+
|
77 |
+
/**
|
78 |
+
* finish login step
|
79 |
+
*/
|
80 |
+
function loginFinish()
|
81 |
+
{
|
82 |
+
// in case we get error_reason=user_denied&error=access_denied
|
83 |
+
if ( isset( $_REQUEST['error'] ) && $_REQUEST['error'] == "access_denied" ){
|
84 |
+
throw new Exception( "Authentication failed! The user denied your request.", 5 );
|
85 |
+
}
|
86 |
+
|
87 |
+
// try to get the UID of the connected user from fb, should be > 0
|
88 |
+
if ( ! $this->api->getUser() ){
|
89 |
+
throw new Exception( "Authentication failed! {$this->providerId} returned an invalid user id.", 5 );
|
90 |
+
}
|
91 |
+
|
92 |
+
// set user as logged in
|
93 |
+
$this->setUserConnected();
|
94 |
+
|
95 |
+
// store facebook access token
|
96 |
+
$this->token( "access_token", $this->api->getAccessToken() );
|
97 |
+
}
|
98 |
+
|
99 |
+
/**
|
100 |
+
* logout
|
101 |
+
*/
|
102 |
+
function logout()
|
103 |
+
{
|
104 |
+
$this->api->destroySession();
|
105 |
+
|
106 |
+
parent::logout();
|
107 |
+
}
|
108 |
+
|
109 |
+
/**
|
110 |
+
* load the user profile from the IDp api client
|
111 |
+
*/
|
112 |
+
function getUserProfile()
|
113 |
+
{
|
114 |
+
// request user profile from fb api
|
115 |
+
try{
|
116 |
+
$data = $this->api->api('/me');
|
117 |
+
}
|
118 |
+
catch( FacebookApiException $e ){
|
119 |
+
throw new Exception( "User profile request failed! {$this->providerId} returned an error: $e", 6 );
|
120 |
+
}
|
121 |
+
|
122 |
+
// if the provider identifier is not recived, we assume the auth has failed
|
123 |
+
if ( ! isset( $data["id"] ) ){
|
124 |
+
throw new Exception( "User profile request failed! {$this->providerId} api returned an invalid response.", 6 );
|
125 |
+
}
|
126 |
+
|
127 |
+
# store the user profile.
|
128 |
+
$this->user->profile->identifier = (array_key_exists('id',$data))?$data['id']:"";
|
129 |
+
$this->user->profile->displayName = (array_key_exists('name',$data))?$data['name']:"";
|
130 |
+
$this->user->profile->firstName = (array_key_exists('first_name',$data))?$data['first_name']:"";
|
131 |
+
$this->user->profile->lastName = (array_key_exists('last_name',$data))?$data['last_name']:"";
|
132 |
+
$this->user->profile->photoURL = "https://graph.facebook.com/" . $this->user->profile->identifier . "/picture?width=150&height=150";
|
133 |
+
$this->user->profile->profileURL = (array_key_exists('link',$data))?$data['link']:"";
|
134 |
+
$this->user->profile->webSiteURL = (array_key_exists('website',$data))?$data['website']:"";
|
135 |
+
$this->user->profile->gender = (array_key_exists('gender',$data))?$data['gender']:"";
|
136 |
+
$this->user->profile->description = (array_key_exists('bio',$data))?$data['bio']:"";
|
137 |
+
$this->user->profile->email = (array_key_exists('email',$data))?$data['email']:"";
|
138 |
+
$this->user->profile->emailVerified = (array_key_exists('email',$data))?$data['email']:"";
|
139 |
+
$this->user->profile->region = (array_key_exists("hometown",$data)&&array_key_exists("name",$data['hometown']))?$data['hometown']["name"]:"";
|
140 |
+
|
141 |
+
if( array_key_exists('birthday',$data) ) {
|
142 |
+
list($birthday_month, $birthday_day, $birthday_year) = explode( "/", $data['birthday'] );
|
143 |
+
|
144 |
+
$this->user->profile->birthDay = (int) $birthday_day;
|
145 |
+
$this->user->profile->birthMonth = (int) $birthday_month;
|
146 |
+
$this->user->profile->birthYear = (int) $birthday_year;
|
147 |
+
}
|
148 |
+
|
149 |
+
return $this->user->profile;
|
150 |
+
}
|
151 |
+
|
152 |
+
/**
|
153 |
+
* load the user contacts
|
154 |
+
*/
|
155 |
+
function getUserContacts()
|
156 |
+
{
|
157 |
+
try{
|
158 |
+
$response = $this->api->api('/me/friends');
|
159 |
+
}
|
160 |
+
catch( FacebookApiException $e ){
|
161 |
+
throw new Exception( "User contacts request failed! {$this->providerId} returned an error: $e" );
|
162 |
+
}
|
163 |
+
|
164 |
+
if( ! $response || ! count( $response["data"] ) ){
|
165 |
+
return ARRAY();
|
166 |
+
}
|
167 |
+
|
168 |
+
$contacts = ARRAY();
|
169 |
+
|
170 |
+
foreach( $response["data"] as $item ){
|
171 |
+
$uc = new Hybrid_User_Contact();
|
172 |
+
|
173 |
+
$uc->identifier = (array_key_exists("id",$item))?$item["id"]:"";
|
174 |
+
$uc->displayName = (array_key_exists("name",$item))?$item["name"]:"";
|
175 |
+
$uc->profileURL = "https://www.facebook.com/profile.php?id=" . $uc->identifier;
|
176 |
+
$uc->photoURL = "https://graph.facebook.com/" . $uc->identifier . "/picture?width=150&height=150";
|
177 |
+
|
178 |
+
$contacts[] = $uc;
|
179 |
+
}
|
180 |
+
|
181 |
+
return $contacts;
|
182 |
+
}
|
183 |
+
|
184 |
+
/**
|
185 |
+
* update user status
|
186 |
+
*/
|
187 |
+
function setUserStatus( $status )
|
188 |
+
{
|
189 |
+
$parameters = array();
|
190 |
+
|
191 |
+
if( is_array( $status ) ){
|
192 |
+
$parameters = $status;
|
193 |
+
}
|
194 |
+
else{
|
195 |
+
$parameters["message"] = $status;
|
196 |
+
}
|
197 |
+
|
198 |
+
try{
|
199 |
+
$response = $this->api->api( "/me/feed", "post", $parameters );
|
200 |
+
}
|
201 |
+
catch( FacebookApiException $e ){
|
202 |
+
throw new Exception( "Update user status failed! {$this->providerId} returned an error: $e" );
|
203 |
+
}
|
204 |
+
}
|
205 |
+
|
206 |
+
/**
|
207 |
+
* load the user latest activity
|
208 |
+
* - timeline : all the stream
|
209 |
+
* - me : the user activity only
|
210 |
+
*/
|
211 |
+
function getUserActivity( $stream )
|
212 |
+
{
|
213 |
+
try{
|
214 |
+
if( $stream == "me" ){
|
215 |
+
$response = $this->api->api( '/me/feed' );
|
216 |
+
}
|
217 |
+
else{
|
218 |
+
$response = $this->api->api('/me/home');
|
219 |
+
}
|
220 |
+
}
|
221 |
+
catch( FacebookApiException $e ){
|
222 |
+
throw new Exception( "User activity stream request failed! {$this->providerId} returned an error: $e" );
|
223 |
+
}
|
224 |
+
|
225 |
+
if( ! $response || ! count( $response['data'] ) ){
|
226 |
+
return ARRAY();
|
227 |
+
}
|
228 |
+
|
229 |
+
$activities = ARRAY();
|
230 |
+
|
231 |
+
foreach( $response['data'] as $item ){
|
232 |
+
if( $stream == "me" && $item["from"]["id"] != $this->api->getUser() ){
|
233 |
+
continue;
|
234 |
+
}
|
235 |
+
|
236 |
+
$ua = new Hybrid_User_Activity();
|
237 |
+
|
238 |
+
$ua->id = (array_key_exists("id",$item))?$item["id"]:"";
|
239 |
+
$ua->date = (array_key_exists("created_time",$item))?strtotime($item["created_time"]):"";
|
240 |
+
|
241 |
+
if( $item["type"] == "video" ){
|
242 |
+
$ua->text = (array_key_exists("link",$item))?$item["link"]:"";
|
243 |
+
}
|
244 |
+
|
245 |
+
if( $item["type"] == "link" ){
|
246 |
+
$ua->text = (array_key_exists("link",$item))?$item["link"]:"";
|
247 |
+
}
|
248 |
+
|
249 |
+
if( empty( $ua->text ) && isset( $item["story"] ) ){
|
250 |
+
$ua->text = (array_key_exists("link",$item))?$item["link"]:"";
|
251 |
+
}
|
252 |
+
|
253 |
+
if( empty( $ua->text ) && isset( $item["message"] ) ){
|
254 |
+
$ua->text = (array_key_exists("message",$item))?$item["message"]:"";
|
255 |
+
}
|
256 |
+
|
257 |
+
if( ! empty( $ua->text ) ){
|
258 |
+
$ua->user->identifier = (array_key_exists("id",$item["from"]))?$item["from"]["id"]:"";
|
259 |
+
$ua->user->displayName = (array_key_exists("name",$item["from"]))?$item["from"]["name"]:"";
|
260 |
+
$ua->user->profileURL = "https://www.facebook.com/profile.php?id=" . $ua->user->identifier;
|
261 |
+
$ua->user->photoURL = "https://graph.facebook.com/" . $ua->user->identifier . "/picture?type=square";
|
262 |
+
|
263 |
+
$activities[] = $ua;
|
264 |
+
}
|
265 |
+
}
|
266 |
+
|
267 |
+
return $activities;
|
268 |
+
}
|
269 |
+
}
|
hybridauth/Hybrid/Providers/Foursquare.php
ADDED
@@ -0,0 +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" );
|
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
ADDED
@@ -0,0 +1,56 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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 = "";
|
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 invalide 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 |
+
return $this->user->profile;
|
55 |
+
}
|
56 |
+
}
|
hybridauth/Hybrid/Providers/Goodreads.php
ADDED
@@ -0,0 +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( "Authentification failed! The user denied your request.", 5 );
|
38 |
+
}
|
39 |
+
|
40 |
+
$oauth_verifier = @ $_REQUEST['oauth_token'];
|
41 |
+
|
42 |
+
if ( !$oauth_verifier ){
|
43 |
+
throw new Exception( "Authentification 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 recived 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( "Authentification 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( "Authentification failed! {$this->providerId} returned an invalid access token.", 5 );
|
60 |
+
}
|
61 |
+
|
62 |
+
// we no more need to store requet tokens
|
63 |
+
$this->deleteToken( "request_token" );
|
64 |
+
$this->deleteToken( "request_token_secret" );
|
65 |
+
|
66 |
+
// sotre 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
ADDED
@@ -0,0 +1,119 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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_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 |
+
// default permissions
|
16 |
+
public $scope = "https://www.googleapis.com/auth/userinfo.profile https://www.googleapis.com/auth/userinfo.email https://www.google.com/m8/feeds/";
|
17 |
+
|
18 |
+
/**
|
19 |
+
* IDp wrappers initializer
|
20 |
+
*/
|
21 |
+
function initialize()
|
22 |
+
{
|
23 |
+
parent::initialize();
|
24 |
+
|
25 |
+
// Provider api end-points
|
26 |
+
$this->api->authorize_url = "https://accounts.google.com/o/oauth2/auth";
|
27 |
+
$this->api->token_url = "https://accounts.google.com/o/oauth2/token";
|
28 |
+
$this->api->token_info_url = "https://www.googleapis.com/oauth2/v1/tokeninfo";
|
29 |
+
}
|
30 |
+
|
31 |
+
/**
|
32 |
+
* begin login step
|
33 |
+
*/
|
34 |
+
function loginBegin()
|
35 |
+
{
|
36 |
+
$parameters = array("scope" => $this->scope, "access_type" => "offline");
|
37 |
+
$optionals = array("scope", "access_type", "redirect_uri", "approval_prompt", "hd");
|
38 |
+
|
39 |
+
foreach ($optionals as $parameter){
|
40 |
+
if( isset( $this->config[$parameter] ) && ! empty( $this->config[$parameter] ) ){
|
41 |
+
$parameters[$parameter] = $this->config[$parameter];
|
42 |
+
}
|
43 |
+
}
|
44 |
+
|
45 |
+
Hybrid_Auth::redirect( $this->api->authorizeUrl( $parameters ) );
|
46 |
+
}
|
47 |
+
|
48 |
+
/**
|
49 |
+
* load the user profile from the IDp api client
|
50 |
+
*/
|
51 |
+
function getUserProfile()
|
52 |
+
{
|
53 |
+
// refresh tokens if needed
|
54 |
+
$this->refreshToken();
|
55 |
+
|
56 |
+
// ask google api for user infos
|
57 |
+
$response = $this->api->api( "https://www.googleapis.com/oauth2/v1/userinfo" );
|
58 |
+
|
59 |
+
if ( ! isset( $response->id ) || isset( $response->error ) ){
|
60 |
+
throw new Exception( "User profile request failed! {$this->providerId} returned an invalid response.", 6 );
|
61 |
+
}
|
62 |
+
|
63 |
+
$this->user->profile->identifier = (property_exists($response,'id'))?$response->id:"";
|
64 |
+
$this->user->profile->firstName = (property_exists($response,'given_name'))?$response->given_name:"";
|
65 |
+
$this->user->profile->lastName = (property_exists($response,'family_name'))?$response->family_name:"";
|
66 |
+
$this->user->profile->displayName = (property_exists($response,'name'))?$response->name:"";
|
67 |
+
$this->user->profile->photoURL = (property_exists($response,'picture'))?$response->picture:"";
|
68 |
+
$this->user->profile->profileURL = "https://profiles.google.com/" . $this->user->profile->identifier;
|
69 |
+
$this->user->profile->gender = (property_exists($response,'gender'))?$response->gender:"";
|
70 |
+
$this->user->profile->email = (property_exists($response,'email'))?$response->email:"";
|
71 |
+
$this->user->profile->emailVerified = (property_exists($response,'email'))?$response->email:"";
|
72 |
+
$this->user->profile->language = (property_exists($response,'locale'))?$response->locale:"";
|
73 |
+
|
74 |
+
if( property_exists($response,'birthday') ){
|
75 |
+
list($birthday_year, $birthday_month, $birthday_day) = explode( '-', $response->birthday );
|
76 |
+
|
77 |
+
$this->user->profile->birthDay = (int) $birthday_day;
|
78 |
+
$this->user->profile->birthMonth = (int) $birthday_month;
|
79 |
+
$this->user->profile->birthYear = (int) $birthday_year;
|
80 |
+
}
|
81 |
+
|
82 |
+
return $this->user->profile;
|
83 |
+
}
|
84 |
+
|
85 |
+
/**
|
86 |
+
* load the user (Gmail) contacts
|
87 |
+
* ..toComplete
|
88 |
+
*/
|
89 |
+
function getUserContacts()
|
90 |
+
{
|
91 |
+
// refresh tokens if needed
|
92 |
+
$this->refreshToken();
|
93 |
+
|
94 |
+
if( ! isset( $this->config['contacts_param'] ) ){
|
95 |
+
$this->config['contacts_param'] = array( "max-results" => 500 );
|
96 |
+
}
|
97 |
+
|
98 |
+
$response = $this->api->api( "https://www.google.com/m8/feeds/contacts/default/full?"
|
99 |
+
. http_build_query( array_merge( array('alt' => 'json'), $this->config['contacts_param'] ) ) );
|
100 |
+
|
101 |
+
if( ! $response ){
|
102 |
+
return ARRAY();
|
103 |
+
}
|
104 |
+
|
105 |
+
$contacts = ARRAY();
|
106 |
+
|
107 |
+
foreach( $response->feed->entry as $idx => $entry ){
|
108 |
+
$uc = new Hybrid_User_Contact();
|
109 |
+
|
110 |
+
$uc->email = isset($entry->{'gd$email'}[0]->address) ? (string) $entry->{'gd$email'}[0]->address : '';
|
111 |
+
$uc->displayName = isset($entry->title->{'$t'}) ? (string) $entry->title->{'$t'} : '';
|
112 |
+
$uc->identifier = $uc->email;
|
113 |
+
|
114 |
+
$contacts[] = $uc;
|
115 |
+
}
|
116 |
+
|
117 |
+
return $contacts;
|
118 |
+
}
|
119 |
+
}
|
hybridauth/Hybrid/Providers/Gowalla.php
ADDED
@@ -0,0 +1,102 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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_Gowalla provider adapter based on OAuth2 protocol
|
10 |
+
*
|
11 |
+
* http://hybridauth.sourceforge.net/userguide/IDProvider_info_Gowalla.html
|
12 |
+
*/
|
13 |
+
class Hybrid_Providers_Gowalla 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.gowalla.com/";
|
24 |
+
$this->api->authorize_url = "https://gowalla.com/api/oauth/new";
|
25 |
+
$this->api->token_url = "https://api.gowalla.com/api/oauth/token";
|
26 |
+
|
27 |
+
$this->api->curl_header = array( 'X-Gowalla-API-Key: ' . $this->config["keys"]["id"], 'Accept: application/json' );
|
28 |
+
}
|
29 |
+
|
30 |
+
/**
|
31 |
+
* load the user profile from the IDp api client
|
32 |
+
*/
|
33 |
+
function getUserProfile()
|
34 |
+
{
|
35 |
+
// refresh tokens if needed
|
36 |
+
$this->refreshToken();
|
37 |
+
|
38 |
+
$data = $this->api->api( "users/me/" );
|
39 |
+
|
40 |
+
if ( ! is_object( $data ) || ! isset( $data->username ) )
|
41 |
+
{
|
42 |
+
throw new Exception( "User profile request failed! {$this->providerId} returned an invalid response.", 6 );
|
43 |
+
}
|
44 |
+
|
45 |
+
$this->user->providerUID = @ (string) $data->username;
|
46 |
+
$this->user->profile->firstName = @ (string) $data->first_name;
|
47 |
+
$this->user->profile->lastName = @ (string) $data->last_name;
|
48 |
+
$this->user->profile->displayName = trim( $this->user->profile->firstName . " " . $this->user->profile->lastName );
|
49 |
+
$this->user->profile->profileURL = @ "http://gowalla.com" . ( (string) $data->url );
|
50 |
+
$this->user->profile->webSiteURL = @ (string) $data->website;
|
51 |
+
$this->user->profile->photoURL = @ (string) $data->image_url;
|
52 |
+
|
53 |
+
// make sure to always have a display name
|
54 |
+
if( ! $this->user->profile->displayName ){
|
55 |
+
$this->user->profile->displayName = @ (string) $data->username;
|
56 |
+
}
|
57 |
+
|
58 |
+
return $this->user->profile;
|
59 |
+
}
|
60 |
+
|
61 |
+
function refreshToken()
|
62 |
+
{
|
63 |
+
// have an access token?
|
64 |
+
if( $this->api->access_token ){
|
65 |
+
|
66 |
+
// have to refresh?
|
67 |
+
if( $this->api->refresh_token && $this->api->access_token_expires_at ){
|
68 |
+
|
69 |
+
// expired?
|
70 |
+
if( $this->api->access_token_expires_at <= time() ){
|
71 |
+
$response = $this->api->refreshToken( array( "refresh_token" => $this->api->refresh_token, "access_token" => $this->api->access_token ) );
|
72 |
+
|
73 |
+
if( ! isset( $response->access_token ) || ! $response->access_token ){
|
74 |
+
// set the user as disconnected at this point and throw an exception
|
75 |
+
$this->setUserUnconnected();
|
76 |
+
|
77 |
+
throw new Exception( "The Authorization Service has return an invalid response while requesting a new access token. " . (string) $response->error );
|
78 |
+
}
|
79 |
+
|
80 |
+
// set new access_token
|
81 |
+
$this->api->access_token = $response->access_token;
|
82 |
+
|
83 |
+
if( isset( $response->refresh_token ) )
|
84 |
+
$this->api->refresh_token = $response->refresh_token;
|
85 |
+
|
86 |
+
if( isset( $response->expires_in ) ){
|
87 |
+
$this->api->access_token_expires_in = $response->expires_in;
|
88 |
+
|
89 |
+
// even given by some idp, we should calculate this
|
90 |
+
$this->api->access_token_expires_at = time() + $response->expires_in;
|
91 |
+
}
|
92 |
+
}
|
93 |
+
}
|
94 |
+
|
95 |
+
// re store tokens
|
96 |
+
$this->token( "access_token" , $this->api->access_token );
|
97 |
+
$this->token( "refresh_token", $this->api->refresh_token );
|
98 |
+
$this->token( "expires_in" , $this->api->access_token_expires_in );
|
99 |
+
$this->token( "expires_at" , $this->api->access_token_expires_at );
|
100 |
+
}
|
101 |
+
}
|
102 |
+
}
|
hybridauth/Hybrid/Providers/Identica.php
ADDED
@@ -0,0 +1,165 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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_Identica
|
10 |
+
*/
|
11 |
+
class Hybrid_Providers_Identica 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://identi.ca/api/";
|
22 |
+
$this->api->authorize_url = "https://identi.ca/api/oauth/authorize";
|
23 |
+
$this->api->request_token_url = "https://identi.ca/api/oauth/request_token";
|
24 |
+
$this->api->access_token_url = "https://identi.ca/api/oauth/access_token";
|
25 |
+
}
|
26 |
+
|
27 |
+
/**
|
28 |
+
* load the user profile from the IDp api client
|
29 |
+
*/
|
30 |
+
function getUserProfile()
|
31 |
+
{
|
32 |
+
$response = $this->api->get( 'account/verify_credentials.json' );
|
33 |
+
|
34 |
+
// check the last HTTP status code returned
|
35 |
+
if ( $this->api->http_code != 200 )
|
36 |
+
{
|
37 |
+
throw new Exception( "User profile request failed! {$this->providerId} returned an error. " . $this->errorMessageByStatus( $this->api->http_code ), 6 );
|
38 |
+
}
|
39 |
+
|
40 |
+
if ( ! is_object( $response ) )
|
41 |
+
{
|
42 |
+
throw new Exception( "User profile request failed! {$this->providerId} api returned an invalid response.", 6 );
|
43 |
+
}
|
44 |
+
|
45 |
+
# store the user profile.
|
46 |
+
$this->user->profile->identifier = @ $response->id;
|
47 |
+
$this->user->profile->displayName = @ $response->screen_name;
|
48 |
+
$this->user->profile->description = @ $response->description;
|
49 |
+
$this->user->profile->firstName = @ $response->name;
|
50 |
+
$this->user->profile->photoURL = @ $response->profile_image_url;
|
51 |
+
$this->user->profile->profileURL = @ 'http://identi.ca/' . $response->screen_name;
|
52 |
+
$this->user->profile->webSiteURL = @ $response->url;
|
53 |
+
$this->user->profile->address = @ $response->location;
|
54 |
+
|
55 |
+
return $this->user->profile;
|
56 |
+
}
|
57 |
+
|
58 |
+
/**
|
59 |
+
* load the user contacts
|
60 |
+
*/
|
61 |
+
function getUserContacts( $arguments = ARRAY() )
|
62 |
+
{
|
63 |
+
$parameters = array( 'cursor' => '-1' );
|
64 |
+
$response = $this->api->get( 'friends/ids.json', $parameters );
|
65 |
+
|
66 |
+
// check the last HTTP status code returned
|
67 |
+
if ( $this->api->http_code != 200 )
|
68 |
+
{
|
69 |
+
throw new Exception( "User contacts request failed! {$this->providerId} returned an error. " . $this->errorMessageByStatus( $this->api->http_code ) );
|
70 |
+
}
|
71 |
+
|
72 |
+
if( ! $response ){
|
73 |
+
return ARRAY();
|
74 |
+
}
|
75 |
+
|
76 |
+
$contacts = ARRAY();
|
77 |
+
|
78 |
+
// donno if users/lookup is supported by identica.. to do
|
79 |
+
foreach( $response as $item ){
|
80 |
+
$parameters = array( 'user_id' => $item );
|
81 |
+
$responseud = $this->api->get( 'users/show.json', $parameters );
|
82 |
+
|
83 |
+
// check the last HTTP status code returned
|
84 |
+
if ( $this->api->http_code != 200 )
|
85 |
+
{
|
86 |
+
throw new Exception( "User contacts request failed! {$this->providerId} returned an error. " . $this->errorMessageByStatus( $this->api->http_code ) );
|
87 |
+
}
|
88 |
+
|
89 |
+
if( $responseud ){
|
90 |
+
$uc = new Hybrid_User_Contact();
|
91 |
+
|
92 |
+
$uc->identifier = @ $responseud->id;
|
93 |
+
$uc->displayName = @ $responseud->name;
|
94 |
+
$uc->profileURL = @ $responseud->statusnet_profile_url;
|
95 |
+
$uc->photoURL = @ $responseud->profile_image_url;
|
96 |
+
$uc->description = @ $responseud->description;
|
97 |
+
|
98 |
+
$contacts[] = $uc;
|
99 |
+
}
|
100 |
+
}
|
101 |
+
|
102 |
+
return $contacts;
|
103 |
+
}
|
104 |
+
|
105 |
+
/**
|
106 |
+
* update user status
|
107 |
+
*/
|
108 |
+
function setUserStatus( $arguments = ARRAY() )
|
109 |
+
{
|
110 |
+
$status = $arguments[0]; // status content
|
111 |
+
|
112 |
+
$parameters = array( 'status' => $status );
|
113 |
+
$response = $this->api->post( 'statuses/update.json', $parameters );
|
114 |
+
|
115 |
+
// check the last HTTP status code returned
|
116 |
+
if ( $this->api->http_code != 200 )
|
117 |
+
{
|
118 |
+
throw new Exception( "Update user status update failed! {$this->providerId} returned an error. " . $this->errorMessageByStatus( $this->api->http_code ) );
|
119 |
+
}
|
120 |
+
}
|
121 |
+
|
122 |
+
/**
|
123 |
+
* load the user latest activity
|
124 |
+
* - timeline : all the stream
|
125 |
+
* - me : the user activity only
|
126 |
+
*/
|
127 |
+
function getUserActivity( $arguments = ARRAY() )
|
128 |
+
{
|
129 |
+
if( isset( $arguments[0] ) && $arguments[0] == "me" ){
|
130 |
+
$response = $this->api->get( 'statuses/user_timeline.json' );
|
131 |
+
}
|
132 |
+
else{
|
133 |
+
$response = $this->api->get( 'statuses/home_timeline.json' );
|
134 |
+
}
|
135 |
+
|
136 |
+
// check the last HTTP status code returned
|
137 |
+
if ( $this->api->http_code != 200 )
|
138 |
+
{
|
139 |
+
throw new Exception( "User activity stream request failed! {$this->providerId} returned an error. " . $this->errorMessageByStatus( $this->api->http_code ) );
|
140 |
+
}
|
141 |
+
|
142 |
+
if( ! $response ){
|
143 |
+
return ARRAY();
|
144 |
+
}
|
145 |
+
|
146 |
+
$activities = ARRAY();
|
147 |
+
|
148 |
+
foreach( $response as $item ){
|
149 |
+
$ua = new Hybrid_User_Activity();
|
150 |
+
|
151 |
+
$ua->id = @ $item->id;
|
152 |
+
$ua->date = @ $item->created_at;
|
153 |
+
$ua->text = @ $item->text;
|
154 |
+
|
155 |
+
$ua->user->identifier = @ $item->user->id;
|
156 |
+
$ua->user->displayName = @ $item->user->name;
|
157 |
+
$ua->user->profileURL = @ $item->user->statusnet_profile_url;
|
158 |
+
$ua->user->photoURL = @ $item->user->profile_image_url;
|
159 |
+
|
160 |
+
$activities[] = $ua;
|
161 |
+
}
|
162 |
+
|
163 |
+
return $activities;
|
164 |
+
}
|
165 |
+
}
|
hybridauth/Hybrid/Providers/Instagram.php
ADDED
@@ -0,0 +1,48 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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_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 invalide 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 |
+
$this->user->profile->webSiteURL = $data->data->website;
|
45 |
+
|
46 |
+
return $this->user->profile;
|
47 |
+
}
|
48 |
+
}
|
hybridauth/Hybrid/Providers/LastFM.php
ADDED
@@ -0,0 +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 Hybrid_Auth::$config["path_libraries"] . "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( "Authentification 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( "Authentification 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( "Authentification 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/LinkedIn.php
ADDED
@@ -0,0 +1,252 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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 |
+
require_once Hybrid_Auth::$config["path_libraries"] . "OAuth/OAuth.php";
|
27 |
+
require_once Hybrid_Auth::$config["path_libraries"] . "LinkedIn/LinkedIn.php";
|
28 |
+
|
29 |
+
$this->api = new LinkedIn( array( 'appKey' => $this->config["keys"]["key"], 'appSecret' => $this->config["keys"]["secret"], 'callbackUrl' => $this->endpoint ) );
|
30 |
+
|
31 |
+
if( $this->token( "access_token_linkedin" ) ){
|
32 |
+
$this->api->setTokenAccess( $this->token( "access_token_linkedin" ) );
|
33 |
+
}
|
34 |
+
}
|
35 |
+
|
36 |
+
/**
|
37 |
+
* begin login step
|
38 |
+
*/
|
39 |
+
function loginBegin()
|
40 |
+
{
|
41 |
+
// send a request for a LinkedIn access token
|
42 |
+
$response = $this->api->retrieveTokenRequest();
|
43 |
+
|
44 |
+
if( isset( $response['success'] ) && $response['success'] === TRUE ){
|
45 |
+
$this->token( "oauth_token", $response['linkedin']['oauth_token'] );
|
46 |
+
$this->token( "oauth_token_secret", $response['linkedin']['oauth_token_secret'] );
|
47 |
+
|
48 |
+
# redirect user to LinkedIn authorisation web page
|
49 |
+
Hybrid_Auth::redirect( LINKEDIN::_URL_AUTH . $response['linkedin']['oauth_token'] );
|
50 |
+
}
|
51 |
+
else{
|
52 |
+
throw new Exception( "Authentication failed! {$this->providerId} returned an invalid Token.", 5 );
|
53 |
+
}
|
54 |
+
}
|
55 |
+
|
56 |
+
/**
|
57 |
+
* finish login step
|
58 |
+
*/
|
59 |
+
function loginFinish()
|
60 |
+
{
|
61 |
+
$oauth_token = $_REQUEST['oauth_token'];
|
62 |
+
$oauth_verifier = $_REQUEST['oauth_verifier'];
|
63 |
+
|
64 |
+
if ( ! $oauth_verifier ){
|
65 |
+
throw new Exception( "Authentication failed! {$this->providerId} returned an invalid Token.", 5 );
|
66 |
+
}
|
67 |
+
|
68 |
+
$response = $this->api->retrieveTokenAccess( $oauth_token, $this->token( "oauth_token_secret" ), $oauth_verifier );
|
69 |
+
|
70 |
+
if( isset( $response['success'] ) && $response['success'] === TRUE ){
|
71 |
+
$this->deleteToken( "oauth_token" );
|
72 |
+
$this->deleteToken( "oauth_token_secret" );
|
73 |
+
|
74 |
+
$this->token( "access_token_linkedin", $response['linkedin'] );
|
75 |
+
$this->token( "access_token" , $response['linkedin']['oauth_token'] );
|
76 |
+
$this->token( "access_token_secret" , $response['linkedin']['oauth_token_secret'] );
|
77 |
+
|
78 |
+
// set user as logged in
|
79 |
+
$this->setUserConnected();
|
80 |
+
}
|
81 |
+
else{
|
82 |
+
throw new Exception( "Authentication failed! {$this->providerId} returned an invalid Token.", 5 );
|
83 |
+
}
|
84 |
+
}
|
85 |
+
|
86 |
+
/**
|
87 |
+
* load the user profile from the IDp api client
|
88 |
+
*/
|
89 |
+
function getUserProfile()
|
90 |
+
{
|
91 |
+
try{
|
92 |
+
// http://developer.linkedin.com/docs/DOC-1061
|
93 |
+
$response = $this->api->profile('~:(id,first-name,last-name,public-profile-url,picture-url,email-address,date-of-birth,phone-numbers,summary)');
|
94 |
+
}
|
95 |
+
catch( LinkedInException $e ){
|
96 |
+
throw new Exception( "User profile request failed! {$this->providerId} returned an error: $e", 6 );
|
97 |
+
}
|
98 |
+
|
99 |
+
if( isset( $response['success'] ) && $response['success'] === TRUE ){
|
100 |
+
$data = @ new SimpleXMLElement( $response['linkedin'] );
|
101 |
+
|
102 |
+
if ( ! is_object( $data ) ){
|
103 |
+
throw new Exception( "User profile request failed! {$this->providerId} returned an invalid xml data.", 6 );
|
104 |
+
}
|
105 |
+
|
106 |
+
$this->user->profile->identifier = (string) $data->{'id'};
|
107 |
+
$this->user->profile->firstName = (string) $data->{'first-name'};
|
108 |
+
$this->user->profile->lastName = (string) $data->{'last-name'};
|
109 |
+
$this->user->profile->displayName = trim( $this->user->profile->firstName . " " . $this->user->profile->lastName );
|
110 |
+
|
111 |
+
$this->user->profile->email = (string) $data->{'email-address'};
|
112 |
+
$this->user->profile->emailVerified = (string) $data->{'email-address'};
|
113 |
+
|
114 |
+
$this->user->profile->photoURL = (string) $data->{'picture-url'};
|
115 |
+
$this->user->profile->profileURL = (string) $data->{'public-profile-url'};
|
116 |
+
$this->user->profile->description = (string) $data->{'summary'};
|
117 |
+
|
118 |
+
if( $data->{'phone-numbers'} && $data->{'phone-numbers'}->{'phone-number'} ){
|
119 |
+
$this->user->profile->phone = (string) $data->{'phone-numbers'}->{'phone-number'}->{'phone-number'};
|
120 |
+
}
|
121 |
+
else{
|
122 |
+
$this->user->profile->phone = null;
|
123 |
+
}
|
124 |
+
|
125 |
+
if( $data->{'date-of-birth'} ){
|
126 |
+
$this->user->profile->birthDay = (string) $data->{'date-of-birth'}->day;
|
127 |
+
$this->user->profile->birthMonth = (string) $data->{'date-of-birth'}->month;
|
128 |
+
$this->user->profile->birthYear = (string) $data->{'date-of-birth'}->year;
|
129 |
+
}
|
130 |
+
|
131 |
+
return $this->user->profile;
|
132 |
+
}
|
133 |
+
else{
|
134 |
+
throw new Exception( "User profile request failed! {$this->providerId} returned an invalid response.", 6 );
|
135 |
+
}
|
136 |
+
}
|
137 |
+
|
138 |
+
/**
|
139 |
+
* load the user contacts
|
140 |
+
*/
|
141 |
+
function getUserContacts()
|
142 |
+
{
|
143 |
+
try{
|
144 |
+
$response = $this->api->profile('~/connections:(id,first-name,last-name,picture-url,public-profile-url,summary)');
|
145 |
+
}
|
146 |
+
catch( LinkedInException $e ){
|
147 |
+
throw new Exception( "User contacts request failed! {$this->providerId} returned an error: $e" );
|
148 |
+
}
|
149 |
+
|
150 |
+
if( ! $response || ! $response['success'] ){
|
151 |
+
return ARRAY();
|
152 |
+
}
|
153 |
+
|
154 |
+
$connections = new SimpleXMLElement( $response['linkedin'] );
|
155 |
+
|
156 |
+
$contacts = ARRAY();
|
157 |
+
|
158 |
+
foreach( $connections->person as $connection ) {
|
159 |
+
$uc = new Hybrid_User_Contact();
|
160 |
+
|
161 |
+
$uc->identifier = (string) $connection->id;
|
162 |
+
$uc->displayName = (string) $connection->{'last-name'} . " " . $connection->{'first-name'};
|
163 |
+
$uc->profileURL = (string) $connection->{'public-profile-url'};
|
164 |
+
$uc->photoURL = (string) $connection->{'picture-url'};
|
165 |
+
$uc->description = (string) $connection->{'summary'};
|
166 |
+
|
167 |
+
$contacts[] = $uc;
|
168 |
+
}
|
169 |
+
|
170 |
+
return $contacts;
|
171 |
+
}
|
172 |
+
|
173 |
+
/**
|
174 |
+
* update user status
|
175 |
+
*/
|
176 |
+
function setUserStatus( $status )
|
177 |
+
{
|
178 |
+
$parameters = array();
|
179 |
+
$private = true; // share with your connections only
|
180 |
+
|
181 |
+
if( is_array( $status ) ){
|
182 |
+
if( isset( $status[0] ) && ! empty( $status[0] ) ) $parameters["title"] = $status[0]; // post title
|
183 |
+
if( isset( $status[1] ) && ! empty( $status[1] ) ) $parameters["comment"] = $status[1]; // post comment
|
184 |
+
if( isset( $status[2] ) && ! empty( $status[2] ) ) $parameters["submitted-url"] = $status[2]; // post url
|
185 |
+
if( isset( $status[3] ) && ! empty( $status[3] ) ) $parameters["submitted-image-url"] = $status[3]; // post picture url
|
186 |
+
if( isset( $status[4] ) && ! empty( $status[4] ) ) $private = $status[4]; // true or false
|
187 |
+
}
|
188 |
+
else{
|
189 |
+
$parameters["comment"] = $status;
|
190 |
+
}
|
191 |
+
|
192 |
+
try{
|
193 |
+
$response = $this->api->share( 'new', $parameters, $private );
|
194 |
+
}
|
195 |
+
catch( LinkedInException $e ){
|
196 |
+
throw new Exception( "Update user status update failed! {$this->providerId} returned an error: $e" );
|
197 |
+
}
|
198 |
+
|
199 |
+
if ( ! $response || ! $response['success'] )
|
200 |
+
{
|
201 |
+
throw new Exception( "Update user status update failed! {$this->providerId} returned an error." );
|
202 |
+
}
|
203 |
+
}
|
204 |
+
|
205 |
+
/**
|
206 |
+
* load the user latest activity
|
207 |
+
* - timeline : all the stream
|
208 |
+
* - me : the user activity only
|
209 |
+
*/
|
210 |
+
function getUserActivity( $stream )
|
211 |
+
{
|
212 |
+
try{
|
213 |
+
if( $stream == "me" ){
|
214 |
+
$response = $this->api->updates( '?type=SHAR&scope=self&count=25' );
|
215 |
+
}
|
216 |
+
else{
|
217 |
+
$response = $this->api->updates( '?type=SHAR&count=25' );
|
218 |
+
}
|
219 |
+
}
|
220 |
+
catch( LinkedInException $e ){
|
221 |
+
throw new Exception( "User activity stream request failed! {$this->providerId} returned an error: $e" );
|
222 |
+
}
|
223 |
+
|
224 |
+
if( ! $response || ! $response['success'] ){
|
225 |
+
return ARRAY();
|
226 |
+
}
|
227 |
+
|
228 |
+
$updates = new SimpleXMLElement( $response['linkedin'] );
|
229 |
+
|
230 |
+
$activities = ARRAY();
|
231 |
+
|
232 |
+
foreach( $updates->update as $update ) {
|
233 |
+
$person = $update->{'update-content'}->person;
|
234 |
+
$share = $update->{'update-content'}->person->{'current-share'};
|
235 |
+
|
236 |
+
$ua = new Hybrid_User_Activity();
|
237 |
+
|
238 |
+
$ua->id = (string) $update->id;
|
239 |
+
$ua->date = (string) $update->timestamp;
|
240 |
+
$ua->text = (string) $share->{'comment'};
|
241 |
+
|
242 |
+
$ua->user->identifier = (string) $person->id;
|
243 |
+
$ua->user->displayName = (string) $person->{'first-name'} . ' ' . $person->{'last-name'};
|
244 |
+
$ua->user->profileURL = (string) $person->{'site-standard-profile-request'}->url;
|
245 |
+
$ua->user->photoURL = NULL;
|
246 |
+
|
247 |
+
$activities[] = $ua;
|
248 |
+
}
|
249 |
+
|
250 |
+
return $activities;
|
251 |
+
}
|
252 |
+
}
|
hybridauth/Hybrid/Providers/Live.php
ADDED
@@ -0,0 +1,106 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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 |
+
* grab the user profile from the api client
|
43 |
+
*/
|
44 |
+
function getUserProfile()
|
45 |
+
{
|
46 |
+
$data = $this->api->get( "me" );
|
47 |
+
|
48 |
+
if ( ! isset( $data->id ) ){
|
49 |
+
throw new Exception( "User profile request failed! {$this->providerId} returned an invalide response.", 6 );
|
50 |
+
}
|
51 |
+
|
52 |
+
$this->user->profile->identifier = (property_exists($data,'id'))?$data->id:"";
|
53 |
+
$this->user->profile->firstName = (property_exists($data,'first_name'))?$data->first_name:"";
|
54 |
+
$this->user->profile->lastName = (property_exists($data,'last_name'))?$data->last_name:"";
|
55 |
+
$this->user->profile->displayName = (property_exists($data,'name'))?trim( $data->name ):"";
|
56 |
+
$this->user->profile->gender = (property_exists($data,'gender'))?$data->gender:"";
|
57 |
+
|
58 |
+
//wl.basic
|
59 |
+
$this->user->profile->profileURL = (property_exists($data,'link'))?$data->link:"";
|
60 |
+
|
61 |
+
//wl.emails
|
62 |
+
$this->user->profile->email = (property_exists($data,'emails'))?$data->emails->account:"";
|
63 |
+
$this->user->profile->emailVerified = (property_exists($data,'emails'))?$data->emails->account:"";
|
64 |
+
|
65 |
+
//wl.birthday
|
66 |
+
$this->user->profile->birthDay = (property_exists($data,'birth_day'))?$data->birth_day:"";
|
67 |
+
$this->user->profile->birthMonth = (property_exists($data,'birth_month'))?$data->birth_month:"";
|
68 |
+
$this->user->profile->birthYear = (property_exists($data,'birth_year'))?$data->birth_year:"";
|
69 |
+
|
70 |
+
return $this->user->profile;
|
71 |
+
}
|
72 |
+
|
73 |
+
|
74 |
+
/**
|
75 |
+
* load the current logged in user contacts list from the IDp api client
|
76 |
+
*/
|
77 |
+
|
78 |
+
/* Windows Live api does not support retrieval of email addresses (only hashes :/) */
|
79 |
+
function getUserContacts()
|
80 |
+
{
|
81 |
+
$response = $this->api->get( 'me/contacts' );
|
82 |
+
|
83 |
+
if ( $this->api->http_code != 200 )
|
84 |
+
{
|
85 |
+
throw new Exception( 'User contacts request failed! ' . $this->providerId . ' returned an error: ' . $this->errorMessageByStatus( $this->api->http_code ) );
|
86 |
+
}
|
87 |
+
|
88 |
+
if ( ! $response->data && ( $response->error != 0 ) )
|
89 |
+
{
|
90 |
+
return array();
|
91 |
+
}
|
92 |
+
|
93 |
+
$contacts = array();
|
94 |
+
|
95 |
+
foreach( $response->data as $item ) {
|
96 |
+
$uc = new Hybrid_User_Contact();
|
97 |
+
|
98 |
+
$uc->identifier = (property_exists($item,'id'))?$item->id:"";
|
99 |
+
$uc->displayName = (property_exists($item,'name'))?$item->name:"";
|
100 |
+
|
101 |
+
$contacts[] = $uc;
|
102 |
+
}
|
103 |
+
|
104 |
+
return $contacts;
|
105 |
+
}
|
106 |
+
}
|
hybridauth/Hybrid/Providers/Mailru.php
ADDED
@@ -0,0 +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 invalide 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
ADDED
@@ -0,0 +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 |
+
}
|
hybridauth/Hybrid/Providers/MySpace.php
ADDED
@@ -0,0 +1,164 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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_MySpace provider adapter based on OAuth1 protocol
|
10 |
+
*
|
11 |
+
* http://hybridauth.sourceforge.net/userguide/IDProvider_info_MySpace.html
|
12 |
+
*/
|
13 |
+
class Hybrid_Providers_MySpace extends Hybrid_Provider_Model_OAuth1
|
14 |
+
{
|
15 |
+
/**
|
16 |
+
* IDp wrappers initializer
|
17 |
+
*/
|
18 |
+
function initialize()
|
19 |
+
{
|
20 |
+
parent::initialize();
|
21 |
+
|
22 |
+
// Provider api end-points
|
23 |
+
$this->api->api_endpoint_url = "http://api.myspace.com/v1/";
|
24 |
+
$this->api->authorize_url = "http://api.myspace.com/authorize";
|
25 |
+
$this->api->request_token_url = "http://api.myspace.com/request_token";
|
26 |
+
$this->api->access_token_url = "http://api.myspace.com/access_token";
|
27 |
+
}
|
28 |
+
|
29 |
+
/**
|
30 |
+
* get the connected uid from myspace api
|
31 |
+
*/
|
32 |
+
public function getCurrentUserId()
|
33 |
+
{
|
34 |
+
$response = $this->api->get( 'http://api.myspace.com/v1/user.json' );
|
35 |
+
|
36 |
+
if ( ! isset( $response->userId ) ){
|
37 |
+
throw new Exception( "User id request failed! {$this->providerId} returned an invalid response." );
|
38 |
+
}
|
39 |
+
|
40 |
+
return $response->userId;
|
41 |
+
}
|
42 |
+
|
43 |
+
/**
|
44 |
+
* load the user profile from the IDp api client
|
45 |
+
*/
|
46 |
+
function getUserProfile()
|
47 |
+
{
|
48 |
+
$userId = $this->getCurrentUserId();
|
49 |
+
|
50 |
+
$data = $this->api->get( 'http://api.myspace.com/v1/users/' . $userId . '/profile.json' );
|
51 |
+
|
52 |
+
if ( ! is_object( $data ) ){
|
53 |
+
throw new Exception( "User profile request failed! {$this->providerId} returned an invalid response.", 6 );
|
54 |
+
}
|
55 |
+
|
56 |
+
$this->user->profile->identifier = $userId;
|
57 |
+
$this->user->profile->displayName = $data->basicprofile->name;
|
58 |
+
$this->user->profile->description = $data->aboutme;
|
59 |
+
$this->user->profile->gender = $data->basicprofile->gender;
|
60 |
+
$this->user->profile->photoURL = $data->basicprofile->image;
|
61 |
+
$this->user->profile->profileURL = $data->basicprofile->webUri;
|
62 |
+
$this->user->profile->age = $data->age;
|
63 |
+
$this->user->profile->country = $data->country;
|
64 |
+
$this->user->profile->region = $data->region;
|
65 |
+
$this->user->profile->city = $data->city;
|
66 |
+
$this->user->profile->zip = $data->postalcode;
|
67 |
+
|
68 |
+
return $this->user->profile;
|
69 |
+
}
|
70 |
+
|
71 |
+
/**
|
72 |
+
* load the user contacts
|
73 |
+
*/
|
74 |
+
function getUserContacts()
|
75 |
+
{
|
76 |
+
$userId = $this->getCurrentUserId();
|
77 |
+
|
78 |
+
$response = $this->api->get( "http://api.myspace.com/v1/users/" . $userId . "/friends.json" );
|
79 |
+
|
80 |
+
if ( ! is_object( $response ) ){
|
81 |
+
throw new Exception( "User profile request failed! {$this->providerId} returned an invalid response.", 6 );
|
82 |
+
}
|
83 |
+
|
84 |
+
$contacts = ARRAY();
|
85 |
+
|
86 |
+
foreach( $response->Friends as $item ){
|
87 |
+
$uc = new Hybrid_User_Contact();
|
88 |
+
|
89 |
+
$uc->identifier = $item->userId;
|
90 |
+
$uc->displayName = $item->name;
|
91 |
+
$uc->profileURL = $item->webUri;
|
92 |
+
$uc->photoURL = $item->image;
|
93 |
+
$uc->description = $item->status;
|
94 |
+
|
95 |
+
$contacts[] = $uc;
|
96 |
+
}
|
97 |
+
|
98 |
+
return $contacts;
|
99 |
+
}
|
100 |
+
|
101 |
+
/**
|
102 |
+
* update user status
|
103 |
+
*/
|
104 |
+
function setUserStatus( $status )
|
105 |
+
{
|
106 |
+
// crappy myspace... gonna see this asaic
|
107 |
+
$userId = $this->getCurrentUserId();
|
108 |
+
|
109 |
+
$parameters = array( 'status' => $status );
|
110 |
+
|
111 |
+
$response = $this->api->api( "http://api.myspace.com/v1/users/" . $userId . "/status", 'PUT', $parameters );
|
112 |
+
|
113 |
+
// check the last HTTP status code returned
|
114 |
+
if ( $this->api->http_code != 200 )
|
115 |
+
{
|
116 |
+
throw new Exception( "Update user status failed! {$this->providerId} returned an error. " . $this->errorMessageByStatus( $this->api->http_code ) );
|
117 |
+
}
|
118 |
+
}
|
119 |
+
|
120 |
+
/**
|
121 |
+
* load the user latest activity
|
122 |
+
* - timeline : all the stream
|
123 |
+
* - me : the user activity only
|
124 |
+
*/
|
125 |
+
function getUserActivity( $stream )
|
126 |
+
{
|
127 |
+
$userId = $this->getCurrentUserId();
|
128 |
+
|
129 |
+
if( $stream == "me" ){
|
130 |
+
$response = $this->api->get( "http://api.myspace.com/v1/users/" . $userId . "/status.json" );
|
131 |
+
}
|
132 |
+
else{
|
133 |
+
$response = $this->api->get( "http://api.myspace.com/v1/users/" . $userId . "/friends/status.json" );
|
134 |
+
}
|
135 |
+
|
136 |
+
if ( ! is_object( $response ) ){
|
137 |
+
throw new Exception( "User profile request failed! {$this->providerId} returned an invalid response.", 6 );
|
138 |
+
}
|
139 |
+
|
140 |
+
$activities = ARRAY();
|
141 |
+
|
142 |
+
if( $stream == "me" ){
|
143 |
+
// todo
|
144 |
+
}
|
145 |
+
else{
|
146 |
+
foreach( $response->FriendsStatus as $item ){
|
147 |
+
$ua = new Hybrid_User_Activity();
|
148 |
+
|
149 |
+
$ua->id = $item->statusId;
|
150 |
+
$ua->date = NULL; // to find out!!
|
151 |
+
$ua->text = $item->status;
|
152 |
+
|
153 |
+
$ua->user->identifier = $item->user->userId;
|
154 |
+
$ua->user->displayName = $item->user->name;
|
155 |
+
$ua->user->profileURL = $item->user->uri;
|
156 |
+
$ua->user->photoURL = $item->user->image;
|
157 |
+
|
158 |
+
$activities[] = $ua;
|
159 |
+
}
|
160 |
+
}
|
161 |
+
|
162 |
+
return $activities;
|
163 |
+
}
|
164 |
+
}
|
hybridauth/Hybrid/Providers/Odnoklassniki.php
ADDED
@@ -0,0 +1,174 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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 |
+
Hybrid_Logger::info( "Enter OAuth2Client::request( $url )" );
|
31 |
+
Hybrid_Logger::debug( "OAuth2Client::request(). dump request params: ", serialize( $params ) );
|
32 |
+
|
33 |
+
if( $type == "GET" ){
|
34 |
+
$url = $url . ( strpos( $url, '?' ) ? '&' : '?' ) . http_build_query( $params );
|
35 |
+
}
|
36 |
+
|
37 |
+
$this->http_info = array();
|
38 |
+
$ch = curl_init();
|
39 |
+
|
40 |
+
curl_setopt($ch, CURLOPT_URL , $url );
|
41 |
+
curl_setopt($ch, CURLOPT_RETURNTRANSFER , 1 );
|
42 |
+
curl_setopt($ch, CURLOPT_TIMEOUT , $this->curl_time_out );
|
43 |
+
curl_setopt($ch, CURLOPT_USERAGENT , $this->curl_useragent );
|
44 |
+
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT , $this->curl_connect_time_out );
|
45 |
+
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER , $this->curl_ssl_verifypeer );
|
46 |
+
curl_setopt($ch, CURLOPT_HTTPHEADER , $this->curl_header );
|
47 |
+
if($this->curl_proxy){
|
48 |
+
curl_setopt( $ch, CURLOPT_PROXY , $this->curl_proxy);
|
49 |
+
}
|
50 |
+
if( $type == "POST" ){
|
51 |
+
curl_setopt($ch, CURLOPT_POST, 1);
|
52 |
+
if($params) curl_setopt( $ch, CURLOPT_POSTFIELDS, $params );
|
53 |
+
}
|
54 |
+
$response = curl_exec($ch);
|
55 |
+
Hybrid_Logger::debug( "OAuth2Client::request(). dump request info: ", serialize( curl_getinfo($ch) ) );
|
56 |
+
Hybrid_Logger::debug( "OAuth2Client::request(). dump request result: ", serialize( $response ) );
|
57 |
+
|
58 |
+
$this->http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
|
59 |
+
$this->http_info = array_merge($this->http_info, curl_getinfo($ch));
|
60 |
+
|
61 |
+
curl_close ($ch);
|
62 |
+
|
63 |
+
return $response;
|
64 |
+
}
|
65 |
+
|
66 |
+
private function parseRequestResult( $result )
|
67 |
+
{
|
68 |
+
if( json_decode( $result ) ) return json_decode( $result );
|
69 |
+
|
70 |
+
parse_str( $result, $ouput );
|
71 |
+
|
72 |
+
$result = new StdClass();
|
73 |
+
|
74 |
+
foreach( $ouput as $k => $v )
|
75 |
+
$result->$k = $v;
|
76 |
+
|
77 |
+
return $result;
|
78 |
+
}
|
79 |
+
|
80 |
+
function authodnoklass( $code )
|
81 |
+
{
|
82 |
+
$params = array(
|
83 |
+
"client_id" => $this->api->client_id,
|
84 |
+
"client_secret" => $this->api->client_secret,
|
85 |
+
"grant_type" => "authorization_code",
|
86 |
+
"redirect_uri" => $this->api->redirect_uri,
|
87 |
+
"code" => $code
|
88 |
+
);
|
89 |
+
|
90 |
+
$response = $this->request( $this->api->token_url, http_build_query($params, '', '&'), $this->api->curl_authenticate_method );
|
91 |
+
|
92 |
+
$response = $this->parseRequestResult( $response );
|
93 |
+
|
94 |
+
if( ! $response || ! isset( $response->access_token ) ){
|
95 |
+
throw new Exception( "The Authorization Service has return: " . $response->error );
|
96 |
+
}
|
97 |
+
|
98 |
+
if( isset( $response->access_token ) ) $this->api->access_token = $response->access_token;
|
99 |
+
if( isset( $response->refresh_token ) ) $this->api->refresh_token = $response->refresh_token;
|
100 |
+
if( isset( $response->expires_in ) ) $this->api->access_token_expires_in = $response->expires_in;
|
101 |
+
|
102 |
+
// calculate when the access token expire
|
103 |
+
$this->api->access_token_expires_at = time() + $response->expires_in;
|
104 |
+
|
105 |
+
return $response;
|
106 |
+
}
|
107 |
+
|
108 |
+
function loginFinish()
|
109 |
+
{
|
110 |
+
$error = (array_key_exists('error',$_REQUEST))?$_REQUEST['error']:"";
|
111 |
+
|
112 |
+
// check for errors
|
113 |
+
if ( $error ){
|
114 |
+
throw new Exception( "Authentification failed! {$this->providerId} returned an error: $error", 5 );
|
115 |
+
}
|
116 |
+
|
117 |
+
// try to authenicate user
|
118 |
+
$code = (array_key_exists('code',$_REQUEST))?$_REQUEST['code']:"";
|
119 |
+
|
120 |
+
try{
|
121 |
+
$this->authodnoklass( $code );
|
122 |
+
}
|
123 |
+
catch( Exception $e ){
|
124 |
+
throw new Exception( "User profile request failed! {$this->providerId} returned an error: $e", 6 );
|
125 |
+
}
|
126 |
+
|
127 |
+
// check if authenticated
|
128 |
+
if ( ! $this->api->access_token ){
|
129 |
+
throw new Exception( "Authentification failed! {$this->providerId} returned an invalid access token.", 5 );
|
130 |
+
}
|
131 |
+
|
132 |
+
// store tokens
|
133 |
+
$this->token( "access_token" , $this->api->access_token );
|
134 |
+
$this->token( "refresh_token", $this->api->refresh_token );
|
135 |
+
$this->token( "expires_in" , $this->api->access_token_expires_in );
|
136 |
+
$this->token( "expires_at" , $this->api->access_token_expires_at );
|
137 |
+
|
138 |
+
// set user connected locally
|
139 |
+
$this->setUserConnected();
|
140 |
+
}
|
141 |
+
|
142 |
+
/**
|
143 |
+
* load the user profile from the IDp api client
|
144 |
+
*/
|
145 |
+
function getUserProfile()
|
146 |
+
{
|
147 |
+
$sig = md5('application_key=' . $this->config['keys']['key'] . 'method=users.getCurrentUser' . md5($this->api->access_token . $this->api->client_secret));
|
148 |
+
$response = $this->api->api( '?application_key=' . $this->config['keys']['key'] . '&method=users.getCurrentUser&sig=' .$sig);
|
149 |
+
if ( ! isset( $response->uid ) ){
|
150 |
+
throw new Exception( "User profile request failed! {$this->providerId} returned an invalide response.", 6 );
|
151 |
+
}
|
152 |
+
|
153 |
+
$this->user->profile->identifier = (property_exists($response,'uid'))?$response->uid:"";
|
154 |
+
$this->user->profile->firstName = (property_exists($response,'first_name'))?$response->first_name:"";
|
155 |
+
$this->user->profile->lastName = (property_exists($response,'last_name'))?$response->last_name:"";
|
156 |
+
$this->user->profile->displayName = (property_exists($response,'name'))?$response->name:"";
|
157 |
+
$this->user->profile->photoURL = (property_exists($response,'pic_1'))?$response->pic_1:"";
|
158 |
+
$this->user->profile->photoBIG = (property_exists($response,'pic_2'))?$response->pic_2:"";
|
159 |
+
$this->user->profile->profileURL = (property_exists($response,'link'))?$response->link:"";
|
160 |
+
$this->user->profile->gender = (property_exists($response,'gender'))?$response->gender:"";
|
161 |
+
$this->user->profile->email = (property_exists($response,'email'))?$response->email:"";
|
162 |
+
$this->user->profile->emailVerified = (property_exists($response,'email'))?$response->email:"";
|
163 |
+
|
164 |
+
if( property_exists($response,'birthday') ){
|
165 |
+
list($birthday_year, $birthday_month, $birthday_day) = explode( '-', $response->birthday );
|
166 |
+
|
167 |
+
$this->user->profile->birthDay = (int) $birthday_day;
|
168 |
+
$this->user->profile->birthMonth = (int) $birthday_month;
|
169 |
+
$this->user->profile->birthYear = (int) $birthday_year;
|
170 |
+
}
|
171 |
+
|
172 |
+
return $this->user->profile;
|
173 |
+
}
|
174 |
+
}
|
hybridauth/Hybrid/Providers/OpenID.php
ADDED
@@ -0,0 +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 |
+
}
|
hybridauth/Hybrid/Providers/Skyrock.php
ADDED
@@ -0,0 +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 |
+
|
hybridauth/Hybrid/Providers/Stackoverflow.php
ADDED
@@ -0,0 +1,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
ADDED
@@ -0,0 +1,59 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
class Hybrid_Providers_Steam extends Hybrid_Provider_Model_OpenID
|
3 |
+
{
|
4 |
+
var $openidIdentifier = "http://steamcommunity.com/openid";
|
5 |
+
|
6 |
+
/**
|
7 |
+
* finish login step
|
8 |
+
*/
|
9 |
+
function loginFinish()
|
10 |
+
{
|
11 |
+
parent::loginFinish();
|
12 |
+
|
13 |
+
$uid = str_replace( "http://steamcommunity.com/openid/id/", "", $this->user->profile->identifier );
|
14 |
+
|
15 |
+
if( $uid ){
|
16 |
+
$data = curl_gets_url( "http://steamcommunity.com/profiles/$uid/?xml=1" );
|
17 |
+
|
18 |
+
$data = @ new SimpleXMLElement( $data );
|
19 |
+
|
20 |
+
if ( ! is_object( $data ) ){
|
21 |
+
return false;
|
22 |
+
}
|
23 |
+
|
24 |
+
$this->user->profile->displayName = (string) $data->{'steamID'};
|
25 |
+
$this->user->profile->photoURL = (string) $data->{'avatarMedium'};
|
26 |
+
$this->user->profile->description = (string) $data->{'summary'};
|
27 |
+
|
28 |
+
$realname = (string) $data->{'realname'};
|
29 |
+
|
30 |
+
if( $realname ){
|
31 |
+
$this->user->profile->displayName = $realname;
|
32 |
+
}
|
33 |
+
|
34 |
+
$customURL = (string) $data->{'customURL'};
|
35 |
+
|
36 |
+
if( $customURL ){
|
37 |
+
$this->user->profile->profileURL = "http://steamcommunity.com/id/$customURL/";
|
38 |
+
}
|
39 |
+
|
40 |
+
// restore the user profile
|
41 |
+
Hybrid_Auth::storage()->set( "hauth_session.{$this->providerId}.user", $this->user );
|
42 |
+
}
|
43 |
+
}
|
44 |
+
}
|
45 |
+
|
46 |
+
function curl_gets_url( $curl_url ){
|
47 |
+
$ch = curl_init();
|
48 |
+
$curl_options = array(
|
49 |
+
CURLOPT_URL => $curl_url,
|
50 |
+
CURLOPT_RETURNTRANSFER => true,
|
51 |
+
CURLOPT_FOLLOWLOCATION => true,
|
52 |
+
CURLOPT_MAXREDIRS => 3,
|
53 |
+
CURLOPT_TIMEOUT => 10
|
54 |
+
);
|
55 |
+
curl_setopt_array($ch, $curl_options);
|
56 |
+
$data = curl_exec($ch);
|
57 |
+
|
58 |
+
return $data;
|
59 |
+
}
|
hybridauth/Hybrid/Providers/Tumblr.php
ADDED
@@ -0,0 +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 |
+
}
|
hybridauth/Hybrid/Providers/TwitchTV.php
ADDED
@@ -0,0 +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 channel_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
ADDED
@@ -0,0 +1,165 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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 |
+
$this->api->curl_auth_header = false;
|
27 |
+
}
|
28 |
+
|
29 |
+
/**
|
30 |
+
* load the user profile from the IDp api client
|
31 |
+
*/
|
32 |
+
function getUserProfile()
|
33 |
+
{
|
34 |
+
$response = $this->api->get( 'account/verify_credentials.json' );
|
35 |
+
|
36 |
+
// check the last HTTP status code returned
|
37 |
+
if ( $this->api->http_code != 200 ){
|
38 |
+
throw new Exception( "User profile request failed! {$this->providerId} returned an error. " . $this->errorMessageByStatus( $this->api->http_code ), 6 );
|
39 |
+
}
|
40 |
+
|
41 |
+
if ( ! is_object( $response ) || ! isset( $response->id ) ){
|
42 |
+
throw new Exception( "User profile request failed! {$this->providerId} api returned an invalid response.", 6 );
|
43 |
+
}
|
44 |
+
|
45 |
+
# store the user profile.
|
46 |
+
$this->user->profile->identifier = (property_exists($response,'id'))?$response->id:"";
|
47 |
+
$this->user->profile->displayName = (property_exists($response,'screen_name'))?$response->screen_name:"";
|
48 |
+
$this->user->profile->description = (property_exists($response,'description'))?$response->description:"";
|
49 |
+
$this->user->profile->firstName = (property_exists($response,'name'))?$response->name:"";
|
50 |
+
$this->user->profile->photoURL = (property_exists($response,'profile_image_url'))?$response->profile_image_url:"";
|
51 |
+
$this->user->profile->profileURL = (property_exists($response,'screen_name'))?("http://twitter.com/".$response->screen_name):"";
|
52 |
+
$this->user->profile->webSiteURL = (property_exists($response,'url'))?$response->url:"";
|
53 |
+
$this->user->profile->region = (property_exists($response,'location'))?$response->location:"";
|
54 |
+
|
55 |
+
return $this->user->profile;
|
56 |
+
}
|
57 |
+
|
58 |
+
/**
|
59 |
+
* load the user contacts
|
60 |
+
*/
|
61 |
+
function getUserContacts()
|
62 |
+
{
|
63 |
+
$parameters = array( 'cursor' => '-1' );
|
64 |
+
$response = $this->api->get( 'friends/ids.json', $parameters );
|
65 |
+
|
66 |
+
// check the last HTTP status code returned
|
67 |
+
if ( $this->api->http_code != 200 ){
|
68 |
+
throw new Exception( "User contacts request failed! {$this->providerId} returned an error. " . $this->errorMessageByStatus( $this->api->http_code ) );
|
69 |
+
}
|
70 |
+
|
71 |
+
if( ! $response || ! count( $response->ids ) ){
|
72 |
+
return ARRAY();
|
73 |
+
}
|
74 |
+
|
75 |
+
// 75 id per time should be okey
|
76 |
+
$contactsids = array_chunk ( $response->ids, 75 );
|
77 |
+
|
78 |
+
$contacts = ARRAY();
|
79 |
+
|
80 |
+
foreach( $contactsids as $chunk ){
|
81 |
+
$parameters = array( 'user_id' => implode( ",", $chunk ) );
|
82 |
+
$response = $this->api->get( 'users/lookup.json', $parameters );
|
83 |
+
|
84 |
+
// check the last HTTP status code returned
|
85 |
+
if ( $this->api->http_code != 200 ){
|
86 |
+
throw new Exception( "User contacts request failed! {$this->providerId} returned an error. " . $this->errorMessageByStatus( $this->api->http_code ) );
|
87 |
+
}
|
88 |
+
|
89 |
+
if( $response && count( $response ) ){
|
90 |
+
foreach( $response as $item ){
|
91 |
+
$uc = new Hybrid_User_Contact();
|
92 |
+
|
93 |
+
$uc->identifier = (property_exists($item,'id'))?$item->id:"";
|
94 |
+
$uc->displayName = (property_exists($item,'name'))?$item->name:"";
|
95 |
+
$uc->profileURL = (property_exists($item,'screen_name'))?("http://twitter.com/".$item->screen_name):"";
|
96 |
+
$uc->photoURL = (property_exists($item,'profile_image_url'))?$item->profile_image_url:"";
|
97 |
+
$uc->description = (property_exists($item,'description'))?$item->description:"";
|
98 |
+
|
99 |
+
$contacts[] = $uc;
|
100 |
+
}
|
101 |
+
}
|
102 |
+
}
|
103 |
+
|
104 |
+
return $contacts;
|
105 |
+
}
|
106 |
+
|
107 |
+
/**
|
108 |
+
* update user status
|
109 |
+
*/
|
110 |
+
function setUserStatus( $status )
|
111 |
+
{
|
112 |
+
$parameters = array( 'status' => $status );
|
113 |
+
$response = $this->api->post( 'statuses/update.json', $parameters );
|
114 |
+
|
115 |
+
// check the last HTTP status code returned
|
116 |
+
if ( $this->api->http_code != 200 ){
|
117 |
+
throw new Exception( "Update user status failed! {$this->providerId} returned an error. " . $this->errorMessageByStatus( $this->api->http_code ) );
|
118 |
+
}
|
119 |
+
}
|
120 |
+
|
121 |
+
/**
|
122 |
+
* load the user latest activity
|
123 |
+
* - timeline : all the stream
|
124 |
+
* - me : the user activity only
|
125 |
+
*
|
126 |
+
* by default return the timeline
|
127 |
+
*/
|
128 |
+
function getUserActivity( $stream )
|
129 |
+
{
|
130 |
+
if( $stream == "me" ){
|
131 |
+
$response = $this->api->get( 'statuses/user_timeline.json' );
|
132 |
+
}
|
133 |
+
else{
|
134 |
+
$response = $this->api->get( 'statuses/home_timeline.json' );
|
135 |
+
}
|
136 |
+
|
137 |
+
// check the last HTTP status code returned
|
138 |
+
if ( $this->api->http_code != 200 ){
|
139 |
+
throw new Exception( "User activity stream request failed! {$this->providerId} returned an error. " . $this->errorMessageByStatus( $this->api->http_code ) );
|
140 |
+
}
|
141 |
+
|
142 |
+
if( ! $response ){
|
143 |
+
return ARRAY();
|
144 |
+
}
|
145 |
+
|
146 |
+
$activities = ARRAY();
|
147 |
+
|
148 |
+
foreach( $response as $item ){
|
149 |
+
$ua = new Hybrid_User_Activity();
|
150 |
+
|
151 |
+
$ua->id = (property_exists($item,'id'))?$item->id:"";
|
152 |
+
$ua->date = (property_exists($item,'created_at'))?strtotime($item->created_at):"";
|
153 |
+
$ua->text = (property_exists($item,'text'))?$item->text:"";
|
154 |
+
|
155 |
+
$ua->user->identifier = (property_exists($item->user,'id'))?$item->user->id:"";
|
156 |
+
$ua->user->displayName = (property_exists($item->user,'name'))?$item->user->name:"";
|
157 |
+
$ua->user->profileURL = (property_exists($item->user,'screen_name'))?("http://twitter.com/".$item->user->screen_name):"";
|
158 |
+
$ua->user->photoURL = (property_exists($item->user,'profile_image_url'))?$item->user->profile_image_url:"";
|
159 |
+
|
160 |
+
$activities[] = $ua;
|
161 |
+
}
|
162 |
+
|
163 |
+
return $activities;
|
164 |
+
}
|
165 |
+
}
|
hybridauth/Hybrid/Providers/Vkontakte.php
ADDED
@@ -0,0 +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_Vkontakte provider adapter based on OAuth2 protocol
|
10 |
+
*
|
11 |
+
* added by guiltar | https://github.com/guiltar
|
12 |
+
*/
|
13 |
+
|
14 |
+
class Hybrid_Providers_Vkontakte extends Hybrid_Provider_Model_OAuth2
|
15 |
+
{
|
16 |
+
// default permissions
|
17 |
+
public $scope = "";
|
18 |
+
|
19 |
+
/**
|
20 |
+
* IDp wrappers initializer
|
21 |
+
*/
|
22 |
+
function initialize()
|
23 |
+
{
|
24 |
+
parent::initialize();
|
25 |
+
|
26 |
+
// Provider api end-points
|
27 |
+
$this->api->authorize_url = "http://api.vk.com/oauth/authorize";
|
28 |
+
$this->api->token_url = "https://api.vk.com/oauth/token";
|
29 |
+
//$this->api->token_info_url
|
30 |
+
}
|
31 |
+
|
32 |
+
function loginFinish()
|
33 |
+
{
|
34 |
+
$error = (array_key_exists('error',$_REQUEST))?$_REQUEST['error']:"";
|
35 |
+
|
36 |
+
// check for errors
|
37 |
+
if ( $error ){
|
38 |
+
throw new Exception( "Authentification failed! {$this->providerId} returned an error: $error", 5 );
|
39 |
+
}
|
40 |
+
|
41 |
+
// try to authenicate user
|
42 |
+
$code = (array_key_exists('code',$_REQUEST))?$_REQUEST['code']:"";
|
43 |
+
|
44 |
+
try{
|
45 |
+
$response = $this->api->authenticate( $code );
|
46 |
+
}
|
47 |
+
catch( Exception $e ){
|
48 |
+
throw new Exception( "User profile request failed! {$this->providerId} returned an error: $e", 6 );
|
49 |
+
}
|
50 |
+
|
51 |
+
// check if authenticated
|
52 |
+
if ( !property_exists($response,'user_id') || ! $this->api->access_token ){
|
53 |
+
throw new Exception( "Authentification failed! {$this->providerId} returned an invalid access token.", 5 );
|
54 |
+
}
|
55 |
+
|
56 |
+
// store tokens
|
57 |
+
$this->token( "access_token" , $this->api->access_token );
|
58 |
+
$this->token( "refresh_token", $this->api->refresh_token );
|
59 |
+
$this->token( "expires_in" , $this->api->access_token_expires_in );
|
60 |
+
$this->token( "expires_at" , $this->api->access_token_expires_at );
|
61 |
+
|
62 |
+
// store user id. it is required for api access to Vkontakte
|
63 |
+
Hybrid_Auth::storage()->set( "hauth_session.{$this->providerId}.user_id", $response->user_id );
|
64 |
+
|
65 |
+
// set user connected locally
|
66 |
+
$this->setUserConnected();
|
67 |
+
}
|
68 |
+
|
69 |
+
/**
|
70 |
+
* load the user profile from the IDp api client
|
71 |
+
*/
|
72 |
+
function getUserProfile()
|
73 |
+
{
|
74 |
+
// refresh tokens if needed
|
75 |
+
$this->refreshToken();
|
76 |
+
|
77 |
+
// Vkontakte requires user id, not just token for api access
|
78 |
+
$params['uid'] = Hybrid_Auth::storage()->get( "hauth_session.{$this->providerId}.user_id" );
|
79 |
+
$params['fields'] = 'first_name,last_name,nickname,screen_name,sex,bdate,timezone,photo_rec,photo_big';
|
80 |
+
// ask vkontakte api for user infos
|
81 |
+
$response = $this->api->api( "https://api.vk.com/method/getProfiles" , 'GET', $params);
|
82 |
+
|
83 |
+
|
84 |
+
if (!isset( $response->response[0] ) || !isset( $response->response[0]->uid ) || isset( $response->error ) ){
|
85 |
+
throw new Exception( "User profile request failed! {$this->providerId} returned an invalide response.", 6 );
|
86 |
+
}
|
87 |
+
|
88 |
+
$response = $response->response[0];
|
89 |
+
$this->user->profile->identifier = (property_exists($response,'uid'))?$response->uid:"";
|
90 |
+
$this->user->profile->firstName = (property_exists($response,'first_name'))?$response->first_name:"";
|
91 |
+
$this->user->profile->lastName = (property_exists($response,'last_name'))?$response->last_name:"";
|
92 |
+
$this->user->profile->displayName = (property_exists($response,'nickname'))?$response->nickname:"";
|
93 |
+
$this->user->profile->photoURL = (property_exists($response,'photo_big'))?$response->photo_big:"";
|
94 |
+
$this->user->profile->profileURL = (property_exists($response,'screen_name'))?"http://vk.com/" . $response->screen_name:"";
|
95 |
+
|
96 |
+
if(property_exists($response,'sex')){
|
97 |
+
switch ($response->sex)
|
98 |
+
{
|
99 |
+
case 1: $this->user->profile->gender = 'female'; break;
|
100 |
+
case 2: $this->user->profile->gender = 'male'; break;
|
101 |
+
default: $this->user->profile->gender = ''; break;
|
102 |
+
}
|
103 |
+
}
|
104 |
+
|
105 |
+
if( property_exists($response,'bdate') ){
|
106 |
+
list($birthday_year, $birthday_month, $birthday_day) = explode( '.', $response->bdate );
|
107 |
+
|
108 |
+
$this->user->profile->birthDay = (int) $birthday_day;
|
109 |
+
$this->user->profile->birthMonth = (int) $birthday_month;
|
110 |
+
$this->user->profile->birthYear = (int) $birthday_year;
|
111 |
+
}
|
112 |
+
|
113 |
+
return $this->user->profile;
|
114 |
+
}
|
115 |
+
}
|
hybridauth/Hybrid/Providers/Yahoo.php
ADDED
@@ -0,0 +1,31 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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->emailVerified = $this->user->profile->email;
|
27 |
+
|
28 |
+
// restore the user profile
|
29 |
+
Hybrid_Auth::storage()->set( "hauth_session.{$this->providerId}.user", $this->user );
|
30 |
+
}
|
31 |
+
}
|
hybridauth/Hybrid/Providers/Yandex.php
ADDED
@@ -0,0 +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 invalide 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') ){
|
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
ADDED
@@ -0,0 +1,100 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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 |
+
|
36 |
+
|
37 |
+
try{
|
38 |
+
$response = $this->api->get( 'users' );
|
39 |
+
|
40 |
+
$this->user->profile->identifier = (property_exists($response->user,'id'))?$response->user->id:"";
|
41 |
+
$this->user->profile->displayName = (property_exists($response->user,'username'))?$response->user->username:"";
|
42 |
+
$this->user->profile->description = (property_exists($response->user,'about'))?$response->user->about:"";
|
43 |
+
$this->user->profile->firstName = (property_exists($response->user,'firstname'))?$response->user->firstname:"";
|
44 |
+
$this->user->profile->lastName = (property_exists($response->user,'lastname'))?$response->user->lastname:"";
|
45 |
+
$this->user->profile->photoURL = (property_exists($response->user,'userpic_url'))?$response->user->userpic_url:"";
|
46 |
+
$this->user->profile->profileURL = (property_exists($response->user,'domain'))?("http://".$response->user->domain):"";
|
47 |
+
$this->user->profile->webSiteURL = (property_exists($response->user->contacts,'website'))?$response->user->contacts->website:"";
|
48 |
+
$this->user->profile->city = (property_exists($response->user,'city'))?$response->user->city:"";
|
49 |
+
$this->user->profile->region = (property_exists($response->user,'state'))?$response->user->state:"";
|
50 |
+
$this->user->profile->country = (property_exists($response->user,'country'))?$response->user->country:"";
|
51 |
+
|
52 |
+
if(property_exists($response->user,'sex')){
|
53 |
+
if($response->user->sex>0){
|
54 |
+
$this->user->profile->gender = ($response->user->sex==1)?"male":"female";
|
55 |
+
}
|
56 |
+
}
|
57 |
+
|
58 |
+
return $this->user->profile;
|
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 500px
|
69 |
+
*/
|
70 |
+
function setUserStatus( $status )
|
71 |
+
{
|
72 |
+
// README : posting to a 500px.com blog requires the post's TITLE to be set somehow
|
73 |
+
// So it is strongly recommended that you submit status as an ARRAY, like :
|
74 |
+
|
75 |
+
// setUserStatus( array( 'title'=>'YOUR TITLE HERE', 'body'=>'YOUR MESSAGE HERE' ) )
|
76 |
+
|
77 |
+
|
78 |
+
if(is_array($status) && isset($status['title']) && isset($status['body'])){
|
79 |
+
$t = $status['title'];
|
80 |
+
$b = $status['body'];
|
81 |
+
} else {
|
82 |
+
$t = '...';
|
83 |
+
$b = $status;
|
84 |
+
}
|
85 |
+
|
86 |
+
$parameters = array( 'title' => $t, 'body' => $b );
|
87 |
+
$response = $this->api->post( 'blogs', $parameters );
|
88 |
+
|
89 |
+
if ( property_exists($response,'id') ){
|
90 |
+
return $response->id;
|
91 |
+
} else {
|
92 |
+
throw new Exception( "Update user status failed! {$this->providerId} returned an error. " );
|
93 |
+
}
|
94 |
+
|
95 |
+
// this function is for 'plain' blog posting only :
|
96 |
+
// we will commit photo upload soon in an extra function, called setUpload -
|
97 |
+
// because 500px users can also get an additional Upload Key to upload pictures
|
98 |
+
// refer to http://developers.500px.com/docs/upload-post for now
|
99 |
+
}
|
100 |
+
}
|
hybridauth/Hybrid/Storage.php
ADDED
@@ -0,0 +1,97 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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 |
+
* HybridAuth storage manager
|
10 |
+
*/
|
11 |
+
class Hybrid_Storage
|
12 |
+
{
|
13 |
+
function __construct()
|
14 |
+
{
|
15 |
+
if ( ! session_id() ){
|
16 |
+
if( ! session_start() ){
|
17 |
+
throw new Exception( "Hybridauth requires the use of 'session_start()' at the start of your script, which appears to be disabled.", 1 );
|
18 |
+
}
|
19 |
+
}
|
20 |
+
|
21 |
+
$this->config( "php_session_id", session_id() );
|
22 |
+
$this->config( "version", Hybrid_Auth::$version );
|
23 |
+
}
|
24 |
+
|
25 |
+
public function config($key, $value=null)
|
26 |
+
{
|
27 |
+
$key = strtolower( $key );
|
28 |
+
|
29 |
+
if( $value ){
|
30 |
+
$_SESSION["HA::CONFIG"][$key] = serialize( $value );
|
31 |
+
}
|
32 |
+
elseif( isset( $_SESSION["HA::CONFIG"][$key] ) ){
|
33 |
+
return unserialize( $_SESSION["HA::CONFIG"][$key] );
|
34 |
+
}
|
35 |
+
|
36 |
+
return NULL;
|
37 |
+
}
|
38 |
+
|
39 |
+
public function get($key)
|
40 |
+
{
|
41 |
+
$key = strtolower( $key );
|
42 |
+
|
43 |
+
if( isset( $_SESSION["HA::STORE"], $_SESSION["HA::STORE"][$key] ) ){
|
44 |
+
return unserialize( $_SESSION["HA::STORE"][$key] );
|
45 |
+
}
|
46 |
+
|
47 |
+
return NULL;
|
48 |
+
}
|
49 |
+
|
50 |
+
public function set( $key, $value )
|
51 |
+
{
|
52 |
+
$key = strtolower( $key );
|
53 |
+
|
54 |
+
$_SESSION["HA::STORE"][$key] = serialize( $value );
|
55 |
+
}
|
56 |
+
|
57 |
+
function clear()
|
58 |
+
{
|
59 |
+
$_SESSION["HA::STORE"] = ARRAY();
|
60 |
+
}
|
61 |
+
|
62 |
+
function delete($key)
|
63 |
+
{
|
64 |
+
$key = strtolower( $key );
|
65 |
+
|
66 |
+
if( isset( $_SESSION["HA::STORE"], $_SESSION["HA::STORE"][$key] ) ){
|
67 |
+
unset( $_SESSION["HA::STORE"][$key] );
|
68 |
+
}
|
69 |
+
}
|
70 |
+
|
71 |
+
function deleteMatch($key)
|
72 |
+
{
|
73 |
+
$key = strtolower( $key );
|
74 |
+
|
75 |
+
if( isset( $_SESSION["HA::STORE"] ) && count( $_SESSION["HA::STORE"] ) ) {
|
76 |
+
foreach( $_SESSION["HA::STORE"] as $k => $v ){
|
77 |
+
if( strstr( $k, $key ) ){
|
78 |
+
unset( $_SESSION["HA::STORE"][ $k ] );
|
79 |
+
}
|
80 |
+
}
|
81 |
+
}
|
82 |
+
}
|
83 |
+
|
84 |
+
function getSessionData()
|
85 |
+
{
|
86 |
+
if( isset( $_SESSION["HA::STORE"] ) ){
|
87 |
+
return serialize( $_SESSION["HA::STORE"] );
|
88 |
+
}
|
89 |
+
|
90 |
+
return NULL;
|
91 |
+
}
|
92 |
+
|
93 |
+
function restoreSessionData( $sessiondata = NULL )
|
94 |
+
{
|
95 |
+
$_SESSION["HA::STORE"] = unserialize( $sessiondata );
|
96 |
+
}
|
97 |
+
}
|
hybridauth/Hybrid/User.php
ADDED
@@ -0,0 +1,31 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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 |
+
* The Hybrid_User class represents the current loggedin user
|
10 |
+
*/
|
11 |
+
class Hybrid_User
|
12 |
+
{
|
13 |
+
/* The ID (name) of the connected provider */
|
14 |
+
public $providerId = NULL;
|
15 |
+
|
16 |
+
/* timestamp connection to the provider */
|
17 |
+
public $timestamp = NULL;
|
18 |
+
|
19 |
+
/* user profile, containts the list of fields available in the normalized user profile structure used by HybridAuth. */
|
20 |
+
public $profile = NULL;
|
21 |
+
|
22 |
+
/**
|
23 |
+
* inisialize the user object,
|
24 |
+
*/
|
25 |
+
function __construct()
|
26 |
+
{
|
27 |
+
$this->timestamp = time();
|
28 |
+
|
29 |
+
$this->profile = new Hybrid_User_Profile();
|
30 |
+
}
|
31 |
+
}
|
hybridauth/Hybrid/User_Activity.php
ADDED
@@ -0,0 +1,39 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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_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 |
+
/* activity id on the provider side, usually given as integer */
|
18 |
+
public $id = NULL;
|
19 |
+
|
20 |
+
/* activity date of creation */
|
21 |
+
public $date = NULL;
|
22 |
+
|
23 |
+
/* activity content as a string */
|
24 |
+
public $text = NULL;
|
25 |
+
|
26 |
+
/* user who created the activity */
|
27 |
+
public $user = NULL;
|
28 |
+
|
29 |
+
public function __construct()
|
30 |
+
{
|
31 |
+
$this->user = new stdClass();
|
32 |
+
|
33 |
+
// typically, we should have a few information about the user who created the event from social apis
|
34 |
+
$this->user->identifier = NULL;
|
35 |
+
$this->user->displayName = NULL;
|
36 |
+
$this->user->profileURL = NULL;
|
37 |
+
$this->user->photoURL = NULL;
|
38 |
+
}
|
39 |
+
}
|
hybridauth/Hybrid/User_Contact.php
ADDED
@@ -0,0 +1,37 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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_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 |
+
/* The Unique contact user ID */
|
18 |
+
public $identifier = NULL;
|
19 |
+
|
20 |
+
/* User website, blog, web page */
|
21 |
+
public $webSiteURL = NULL;
|
22 |
+
|
23 |
+
/* URL link to profile page on the IDp web site */
|
24 |
+
public $profileURL = NULL;
|
25 |
+
|
26 |
+
/* URL link to user photo or avatar */
|
27 |
+
public $photoURL = NULL;
|
28 |
+
|
29 |
+
/* User dispalyName provided by the IDp or a concatenation of first and last name */
|
30 |
+
public $displayName = NULL;
|
31 |
+
|
32 |
+
/* A short about_me */
|
33 |
+
public $description = NULL;
|
34 |
+
|
35 |
+
/* User email. Not all of IDp garant access to the user email */
|
36 |
+
public $email = NULL;
|
37 |
+
}
|
hybridauth/Hybrid/User_Profile.php
ADDED
@@ -0,0 +1,84 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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_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 |
+
/* The Unique user's ID on the connected provider */
|
20 |
+
public $identifier = NULL;
|
21 |
+
|
22 |
+
/* User website, blog, web page */
|
23 |
+
public $webSiteURL = NULL;
|
24 |
+
|
25 |
+
/* URL link to profile page on the IDp web site */
|
26 |
+
public $profileURL = NULL;
|
27 |
+
|
28 |
+
/* URL link to user photo or avatar */
|
29 |
+
public $photoURL = NULL;
|
30 |
+
|
31 |
+
/* User dispalyName provided by the IDp or a concatenation of first and last name. */
|
32 |
+
public $displayName = NULL;
|
33 |
+
|
34 |
+
/* A short about_me */
|
35 |
+
public $description = NULL;
|
36 |
+
|
37 |
+
/* User's first name */
|
38 |
+
public $firstName = NULL;
|
39 |
+
|
40 |
+
/* User's last name */
|
41 |
+
public $lastName = NULL;
|
42 |
+
|
43 |
+
/* male or female */
|
44 |
+
public $gender = NULL;
|
45 |
+
|
46 |
+
/* language */
|
47 |
+
public $language = NULL;
|
48 |
+
|
49 |
+
/* User age, we dont calculate it. we return it as is if the IDp provide it. */
|
50 |
+
public $age = NULL;
|
51 |
+
|
52 |
+
/* User birth Day */
|
53 |
+
public $birthDay = NULL;
|
54 |
+
|
55 |
+
/* User birth Month */
|
56 |
+
public $birthMonth = NULL;
|
57 |
+
|
58 |
+
/* User birth Year */
|
59 |
+
public $birthYear = NULL;
|
60 |
+
|
61 |
+
/* User email. Note: not all of IDp garant access to the user email */
|
62 |
+
public $email = NULL;
|
63 |
+
|
64 |
+
/* Verified user email. Note: not all of IDp garant access to verified user email */
|
65 |
+
public $emailVerified = NULL;
|
66 |
+
|
67 |
+
/* phone number */
|
68 |
+
public $phone = NULL;
|
69 |
+
|
70 |
+
/* complete user address */
|
71 |
+
public $address = NULL;
|
72 |
+
|
73 |
+
/* user country */
|
74 |
+
public $country = NULL;
|
75 |
+
|
76 |
+
/* region */
|
77 |
+
public $region = NULL;
|
78 |
+
|
79 |
+
/** city */
|
80 |
+
public $city = NULL;
|
81 |
+
|
82 |
+
/* Postal code */
|
83 |
+
public $zip = NULL;
|
84 |
+
}
|
hybridauth/Hybrid/index.html
ADDED
@@ -0,0 +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>
|
hybridauth/Hybrid/resources/index.html
ADDED
@@ -0,0 +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>
|
hybridauth/Hybrid/resources/openid_policy.html
ADDED
@@ -0,0 +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>
|
hybridauth/Hybrid/resources/openid_realm.html
ADDED
@@ -0,0 +1,13 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<html>
|
2 |
+
<head>
|
3 |
+
<title>HybridAuth Endpoint</title>
|
4 |
+
<meta name="robots" content="NOINDEX, NOFOLLOW">
|
5 |
+
<meta http-equiv="X-XRDS-Location" content="{X_XRDS_LOCATION}" />
|
6 |
+
</head>
|
7 |
+
<body>
|
8 |
+
<h3 style="margin-bottom: 2px;">HybridAuth</h3>
|
9 |
+
Open Source Social Sign On PHP Library.
|
10 |
+
<br />
|
11 |
+
<a href="http://hybridauth.sourceforge.net/" style="color:green;text-decoration:none;">hybridauth.sourceforge.net/</a>
|
12 |
+
</body>
|
13 |
+
</html>
|
hybridauth/Hybrid/resources/openid_xrds.xml
ADDED
@@ -0,0 +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>
|
hybridauth/Hybrid/thirdparty/Facebook/base_facebook.php
ADDED
@@ -0,0 +1,1436 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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 |
+
if (!function_exists('curl_init')) {
|
19 |
+
throw new Exception('Facebook needs the CURL PHP extension.');
|
20 |
+
}
|
21 |
+
if (!function_exists('json_decode')) {
|
22 |
+
throw new Exception('Facebook needs the JSON PHP extension.');
|
23 |
+
}
|
24 |
+
|
25 |
+
/**
|
26 |
+
* Thrown when an API call returns an exception.
|
27 |
+
*
|
28 |
+
* @author Naitik Shah <naitik@facebook.com>
|
29 |
+
*/
|
30 |
+
class FacebookApiException extends Exception
|
31 |
+
{
|
32 |
+
/**
|
33 |
+
* The result from the API server that represents the exception information.
|
34 |
+
*/
|
35 |
+
protected $result;
|
36 |
+
|
37 |
+
/**
|
38 |
+
* Make a new API Exception with the given result.
|
39 |
+
*
|
40 |
+
* @param array $result The result from the API server
|
41 |
+
*/
|
42 |
+
public function __construct($result) {
|
43 |
+
$this->result = $result;
|
44 |
+
|
45 |
+
$code = isset($result['error_code']) ? $result['error_code'] : 0;
|
46 |
+
|
47 |
+
if (isset($result['error_description'])) {
|
48 |
+
// OAuth 2.0 Draft 10 style
|
49 |
+
$msg = $result['error_description'];
|
50 |
+
} else if (isset($result['error']) && is_array($result['error'])) {
|
51 |
+
// OAuth 2.0 Draft 00 style
|
52 |
+
$msg = $result['error']['message'];
|
53 |
+
} else if (isset($result['error_msg'])) {
|
54 |
+
// Rest server style
|
55 |
+
$msg = $result['error_msg'];
|
56 |
+
} else {
|
57 |
+
$msg = 'Unknown Error. Check getResult()';
|
58 |
+
}
|
59 |
+
|
60 |
+
parent::__construct($msg, $code);
|
61 |
+
}
|
62 |
+
|
63 |
+
/**
|
64 |
+
* Return the associated result object returned by the API server.
|
65 |
+
*
|
66 |
+
* @return array The result from the API server
|
67 |
+
*/
|
68 |
+
public function getResult() {
|
69 |
+
return $this->result;
|
70 |
+
}
|
71 |
+
|
72 |
+
/**
|
73 |
+
* Returns the associated type for the error. This will default to
|
74 |
+
* 'Exception' when a type is not available.
|
75 |
+
*
|
76 |
+
* @return string
|
77 |
+
*/
|
78 |
+
public function getType() {
|
79 |
+
if (isset($this->result['error'])) {
|
80 |
+
$error = $this->result['error'];
|
81 |
+
if (is_string($error)) {
|
82 |
+
// OAuth 2.0 Draft 10 style
|
83 |
+
return $error;
|
84 |
+
} else if (is_array($error)) {
|
85 |
+
// OAuth 2.0 Draft 00 style
|
86 |
+
if (isset($error['type'])) {
|
87 |
+
return $error['type'];
|
88 |
+
}
|
89 |
+
}
|
90 |
+
}
|
91 |
+
|
92 |
+
return 'Exception';
|
93 |
+
}
|
94 |
+
|
95 |
+
/**
|
96 |
+
* To make debugging easier.
|
97 |
+
*
|
98 |
+
* @return string The string representation of the error
|
99 |
+
*/
|
100 |
+
public function __toString() {
|
101 |
+
$str = $this->getType() . ': ';
|
102 |
+
if ($this->code != 0) {
|
103 |
+
$str .= $this->code . ': ';
|
104 |
+
}
|
105 |
+
return $str . $this->message;
|
106 |
+
}
|
107 |
+
}
|
108 |
+
|
109 |
+
/**
|
110 |
+
* Provides access to the Facebook Platform. This class provides
|
111 |
+
* a majority of the functionality needed, but the class is abstract
|
112 |
+
* because it is designed to be sub-classed. The subclass must
|
113 |
+
* implement the four abstract methods listed at the bottom of
|
114 |
+
* the file.
|
115 |
+
*
|
116 |
+
* @author Naitik Shah <naitik@facebook.com>
|
117 |
+
*/
|
118 |
+
abstract class BaseFacebook
|
119 |
+
{
|
120 |
+
/**
|
121 |
+
* Version.
|
122 |
+
*/
|
123 |
+
const VERSION = '3.2.2';
|
124 |
+
|
125 |
+
/**
|
126 |
+
* Signed Request Algorithm.
|
127 |
+
*/
|
128 |
+
const SIGNED_REQUEST_ALGORITHM = 'HMAC-SHA256';
|
129 |
+
|
130 |
+
/**
|
131 |
+
* Default options for curl.
|
132 |
+
*/
|
133 |
+
public static $CURL_OPTS = array(
|
134 |
+
CURLOPT_CONNECTTIMEOUT => 10,
|
135 |
+
CURLOPT_RETURNTRANSFER => true,
|
136 |
+
CURLOPT_TIMEOUT => 60,
|
137 |
+
CURLOPT_USERAGENT => 'facebook-php-3.2',
|
138 |
+
);
|
139 |
+
|
140 |
+
/**
|
141 |
+
* List of query parameters that get automatically dropped when rebuilding
|
142 |
+
* the current URL.
|
143 |
+
*/
|
144 |
+
protected static $DROP_QUERY_PARAMS = array(
|
145 |
+
'code',
|
146 |
+
'state',
|
147 |
+
'signed_request',
|
148 |
+
);
|
149 |
+
|
150 |
+
/**
|
151 |
+
* Maps aliases to Facebook domains.
|
152 |
+
*/
|
153 |
+
public static $DOMAIN_MAP = array(
|
154 |
+
'api' => 'https://api.facebook.com/',
|
155 |
+
'api_video' => 'https://api-video.facebook.com/',
|
156 |
+
'api_read' => 'https://api-read.facebook.com/',
|
157 |
+
'graph' => 'https://graph.facebook.com/',
|
158 |
+
'graph_video' => 'https://graph-video.facebook.com/',
|
159 |
+
'www' => 'https://www.facebook.com/',
|
160 |
+
);
|
161 |
+
|
162 |
+
/**
|
163 |
+
* The Application ID.
|
164 |
+
*
|
165 |
+
* @var string
|
166 |
+
*/
|
167 |
+
protected $appId;
|
168 |
+
|
169 |
+
/**
|
170 |
+
* The Application App Secret.
|
171 |
+
*
|
172 |
+
* @var string
|
173 |
+
*/
|
174 |
+
protected $appSecret;
|
175 |
+
|
176 |
+
/**
|
177 |
+
* The ID of the Facebook user, or 0 if the user is logged out.
|
178 |
+
*
|
179 |
+
* @var integer
|
180 |
+
*/
|
181 |
+
protected $user;
|
182 |
+
|
183 |
+
/**
|
184 |
+
* The data from the signed_request token.
|
185 |
+
*/
|
186 |
+
protected $signedRequest;
|
187 |
+
|
188 |
+
/**
|
189 |
+
* A CSRF state variable to assist in the defense against CSRF attacks.
|
190 |
+
*/
|
191 |
+
protected $state;
|
192 |
+
|
193 |
+
/**
|
194 |
+
* The OAuth access token received in exchange for a valid authorization
|
195 |
+
* code. null means the access token has yet to be determined.
|
196 |
+
*
|
197 |
+
* @var string
|
198 |
+
*/
|
199 |
+
protected $accessToken = null;
|
200 |
+
|
201 |
+
/**
|
202 |
+
* Indicates if the CURL based @ syntax for file uploads is enabled.
|
203 |
+
*
|
204 |
+
* @var boolean
|
205 |
+
*/
|
206 |
+
protected $fileUploadSupport = false;
|
207 |
+
|
208 |
+
/**
|
209 |
+
* Indicates if we trust HTTP_X_FORWARDED_* headers.
|
210 |
+
*
|
211 |
+
* @var boolean
|
212 |
+
*/
|
213 |
+
protected $trustForwarded = false;
|
214 |
+
|
215 |
+
/**
|
216 |
+
* Initialize a Facebook Application.
|
217 |
+
*
|
218 |
+
* The configuration:
|
219 |
+
* - appId: the application ID
|
220 |
+
* - secret: the application secret
|
221 |
+
* - fileUpload: (optional) boolean indicating if file uploads are enabled
|
222 |
+
*
|
223 |
+
* @param array $config The application configuration
|
224 |
+
*/
|
225 |
+
public function __construct($config) {
|
226 |
+
$this->setAppId($config['appId']);
|
227 |
+
$this->setAppSecret($config['secret']);
|
228 |
+
if (isset($config['fileUpload'])) {
|
229 |
+
$this->setFileUploadSupport($config['fileUpload']);
|
230 |
+
}
|
231 |
+
if (isset($config['trustForwarded']) && $config['trustForwarded']) {
|
232 |
+
$this->trustForwarded = true;
|
233 |
+
}
|
234 |
+
$state = $this->getPersistentData('state');
|
235 |
+
if (!empty($state)) {
|
236 |
+
$this->state = $state;
|
237 |
+
}
|
238 |
+
}
|
239 |
+
|
240 |
+
/**
|
241 |
+
* Set the Application ID.
|
242 |
+
*
|
243 |
+
* @param string $appId The Application ID
|
244 |
+
* @return BaseFacebook
|
245 |
+
*/
|
246 |
+
public function setAppId($appId) {
|
247 |
+
$this->appId = $appId;
|
248 |
+
return $this;
|
249 |
+
}
|
250 |
+
|
251 |
+
/**
|
252 |
+
* Get the Application ID.
|
253 |
+
*
|
254 |
+
* @return string the Application ID
|
255 |
+
*/
|
256 |
+
public function getAppId() {
|
257 |
+
return $this->appId;
|
258 |
+
}
|
259 |
+
|
260 |
+
/**
|
261 |
+
* Set the App Secret.
|
262 |
+
*
|
263 |
+
* @param string $apiSecret The App Secret
|
264 |
+
* @return BaseFacebook
|
265 |
+
* @deprecated
|
266 |
+
*/
|
267 |
+
public function setApiSecret($apiSecret) {
|
268 |
+
$this->setAppSecret($apiSecret);
|
269 |
+
return $this;
|
270 |
+
}
|
271 |
+
|
272 |
+
/**
|
273 |
+
* Set the App Secret.
|
274 |
+
*
|
275 |
+
* @param string $appSecret The App Secret
|
276 |
+
* @return BaseFacebook
|
277 |
+
*/
|
278 |
+
public function setAppSecret($appSecret) {
|
279 |
+
$this->appSecret = $appSecret;
|
280 |
+
return $this;
|
281 |
+
}
|
282 |
+
|
283 |
+
/**
|
284 |
+
* Get the App Secret.
|
285 |
+
*
|
286 |
+
* @return string the App Secret
|
287 |
+
* @deprecated
|
288 |
+
*/
|
289 |
+
public function getApiSecret() {
|
290 |
+
return $this->getAppSecret();
|
291 |
+
}
|
292 |
+
|
293 |
+
/**
|
294 |
+
* Get the App Secret.
|
295 |
+
*
|
296 |
+
* @return string the App Secret
|
297 |
+
*/
|
298 |
+
public function getAppSecret() {
|
299 |
+
return $this->appSecret;
|
300 |
+
}
|
301 |
+
|
302 |
+
/**
|
303 |
+
* Set the file upload support status.
|
304 |
+
*
|
305 |
+
* @param boolean $fileUploadSupport The file upload support status.
|
306 |
+
* @return BaseFacebook
|
307 |
+
*/
|
308 |
+
public function setFileUploadSupport($fileUploadSupport) {
|
309 |
+
$this->fileUploadSupport = $fileUploadSupport;
|
310 |
+
return $this;
|
311 |
+
}
|
312 |
+
|
313 |
+
/**
|
314 |
+
* Get the file upload support status.
|
315 |
+
*
|
316 |
+
* @return boolean true if and only if the server supports file upload.
|
317 |
+
*/
|
318 |
+
public function getFileUploadSupport() {
|
319 |
+
return $this->fileUploadSupport;
|
320 |
+
}
|
321 |
+
|
322 |
+
/**
|
323 |
+
* DEPRECATED! Please use getFileUploadSupport instead.
|
324 |
+
*
|
325 |
+
* Get the file upload support status.
|
326 |
+
*
|
327 |
+
* @return boolean true if and only if the server supports file upload.
|
328 |
+
*/
|
329 |
+
public function useFileUploadSupport() {
|
330 |
+
return $this->getFileUploadSupport();
|
331 |
+
}
|
332 |
+
|
333 |
+
/**
|
334 |
+
* Sets the access token for api calls. Use this if you get
|
335 |
+
* your access token by other means and just want the SDK
|
336 |
+
* to use it.
|
337 |
+
*
|
338 |
+
* @param string $access_token an access token.
|
339 |
+
* @return BaseFacebook
|
340 |
+
*/
|
341 |
+
public function setAccessToken($access_token) {
|
342 |
+
$this->accessToken = $access_token;
|
343 |
+
return $this;
|
344 |
+
}
|
345 |
+
|
346 |
+
/**
|
347 |
+
* Extend an access token, while removing the short-lived token that might
|
348 |
+
* have been generated via client-side flow. Thanks to http://bit.ly/b0Pt0H
|
349 |
+
* for the workaround.
|
350 |
+
*/
|
351 |
+
public function setExtendedAccessToken() {
|
352 |
+
try {
|
353 |
+
// need to circumvent json_decode by calling _oauthRequest
|
354 |
+
// directly, since response isn't JSON format.
|
355 |
+
$access_token_response = $this->_oauthRequest(
|
356 |
+
$this->getUrl('graph', '/oauth/access_token'),
|
357 |
+
$params = array(
|
358 |
+
'client_id' => $this->getAppId(),
|
359 |
+
'client_secret' => $this->getAppSecret(),
|
360 |
+
'grant_type' => 'fb_exchange_token',
|
361 |
+
'fb_exchange_token' => $this->getAccessToken(),
|
362 |
+
)
|
363 |
+
);
|
364 |
+
}
|
365 |
+
catch (FacebookApiException $e) {
|
366 |
+
// most likely that user very recently revoked authorization.
|
367 |
+
// In any event, we don't have an access token, so say so.
|
368 |
+
return false;
|
369 |
+
}
|
370 |
+
|
371 |
+
if (empty($access_token_response)) {
|
372 |
+
return false;
|
373 |
+
}
|
374 |
+
|
375 |
+
$response_params = array();
|
376 |
+
parse_str($access_token_response, $response_params);
|
377 |
+
|
378 |
+
if (!isset($response_params['access_token'])) {
|
379 |
+
return false;
|
380 |
+
}
|
381 |
+
|
382 |
+
$this->destroySession();
|
383 |
+
|
384 |
+
$this->setPersistentData(
|
385 |
+
'access_token', $response_params['access_token']
|
386 |
+
);
|
387 |
+
}
|
388 |
+
|
389 |
+
/**
|
390 |
+
* Determines the access token that should be used for API calls.
|
391 |
+
* The first time this is called, $this->accessToken is set equal
|
392 |
+
* to either a valid user access token, or it's set to the application
|
393 |
+
* access token if a valid user access token wasn't available. Subsequent
|
394 |
+
* calls return whatever the first call returned.
|
395 |
+
*
|
396 |
+
* @return string The access token
|
397 |
+
*/
|
398 |
+
public function getAccessToken() {
|
399 |
+
if ($this->accessToken !== null) {
|
400 |
+
// we've done this already and cached it. Just return.
|
401 |
+
return $this->accessToken;
|
402 |
+
}
|
403 |
+
|
404 |
+
// first establish access token to be the application
|
405 |
+
// access token, in case we navigate to the /oauth/access_token
|
406 |
+
// endpoint, where SOME access token is required.
|
407 |
+
$this->setAccessToken($this->getApplicationAccessToken());
|
408 |
+
$user_access_token = $this->getUserAccessToken();
|
409 |
+
if ($user_access_token) {
|
410 |
+
$this->setAccessToken($user_access_token);
|
411 |
+
}
|
412 |
+
|
413 |
+
return $this->accessToken;
|
414 |
+
}
|
415 |
+
|
416 |
+
/**
|
417 |
+
* Determines and returns the user access token, first using
|
418 |
+
* the signed request if present, and then falling back on
|
419 |
+
* the authorization code if present. The intent is to
|
420 |
+
* return a valid user access token, or false if one is determined
|
421 |
+
* to not be available.
|
422 |
+
*
|
423 |
+
* @return string A valid user access token, or false if one
|
424 |
+
* could not be determined.
|
425 |
+
*/
|
426 |
+
protected function getUserAccessToken() {
|
427 |
+
// first, consider a signed request if it's supplied.
|
428 |
+
// if there is a signed request, then it alone determines
|
429 |
+
// the access token.
|
430 |
+
$signed_request = $this->getSignedRequest();
|
431 |
+
if ($signed_request) {
|
432 |
+
// apps.facebook.com hands the access_token in the signed_request
|
433 |
+
if (array_key_exists('oauth_token', $signed_request)) {
|
434 |
+
$access_token = $signed_request['oauth_token'];
|
435 |
+
$this->setPersistentData('access_token', $access_token);
|
436 |
+
return $access_token;
|
437 |
+
}
|
438 |
+
|
439 |
+
// the JS SDK puts a code in with the redirect_uri of ''
|
440 |
+
if (array_key_exists('code', $signed_request)) {
|
441 |
+
$code = $signed_request['code'];
|
442 |
+
if ($code && $code == $this->getPersistentData('code')) {
|
443 |
+
// short-circuit if the code we have is the same as the one presented
|
444 |
+
return $this->getPersistentData('access_token');
|
445 |
+
}
|
446 |
+
|
447 |
+
$access_token = $this->getAccessTokenFromCode($code, '');
|
448 |
+
if ($access_token) {
|
449 |
+
$this->setPersistentData('code', $code);
|
450 |
+
$this->setPersistentData('access_token', $access_token);
|
451 |
+
return $access_token;
|
452 |
+
}
|
453 |
+
}
|
454 |
+
|
455 |
+
// signed request states there's no access token, so anything
|
456 |
+
// stored should be cleared.
|
457 |
+
$this->clearAllPersistentData();
|
458 |
+
return false; // respect the signed request's data, even
|
459 |
+
// if there's an authorization code or something else
|
460 |
+
}
|
461 |
+
|
462 |
+
$code = $this->getCode();
|
463 |
+
if ($code && $code != $this->getPersistentData('code')) {
|
464 |
+
$access_token = $this->getAccessTokenFromCode($code);
|
465 |
+
if ($access_token) {
|
466 |
+
$this->setPersistentData('code', $code);
|
467 |
+
$this->setPersistentData('access_token', $access_token);
|
468 |
+
return $access_token;
|
469 |
+
}
|
470 |
+
|
471 |
+
// code was bogus, so everything based on it should be invalidated.
|
472 |
+
$this->clearAllPersistentData();
|
473 |
+
return false;
|
474 |
+
}
|
475 |
+
|
476 |
+
// as a fallback, just return whatever is in the persistent
|
477 |
+
// store, knowing nothing explicit (signed request, authorization
|
478 |
+
// code, etc.) was present to shadow it (or we saw a code in $_REQUEST,
|
479 |
+
// but it's the same as what's in the persistent store)
|
480 |
+
return $this->getPersistentData('access_token');
|
481 |
+
}
|
482 |
+
|
483 |
+
/**
|
484 |
+
* Retrieve the signed request, either from a request parameter or,
|
485 |
+
* if not present, from a cookie.
|
486 |
+
*
|
487 |
+
* @return string the signed request, if available, or null otherwise.
|
488 |
+
*/
|
489 |
+
public function getSignedRequest() {
|
490 |
+
if (!$this->signedRequest) {
|
491 |
+
if (!empty($_REQUEST['signed_request'])) {
|
492 |
+
$this->signedRequest = $this->parseSignedRequest(
|
493 |
+
$_REQUEST['signed_request']);
|
494 |
+
} else if (!empty($_COOKIE[$this->getSignedRequestCookieName()])) {
|
495 |
+
$this->signedRequest = $this->parseSignedRequest(
|
496 |
+
$_COOKIE[$this->getSignedRequestCookieName()]);
|
497 |
+
}
|
498 |
+
}
|
499 |
+
return $this->signedRequest;
|
500 |
+
}
|
501 |
+
|
502 |
+
/**
|
503 |
+
* Get the UID of the connected user, or 0
|
504 |
+
* if the Facebook user is not connected.
|
505 |
+
*
|
506 |
+
* @return string the UID if available.
|
507 |
+
*/
|
508 |
+
public function getUser() {
|
509 |
+
if ($this->user !== null) {
|
510 |
+
// we've already determined this and cached the value.
|
511 |
+
return $this->user;
|
512 |
+
}
|
513 |
+
|
514 |
+
return $this->user = $this->getUserFromAvailableData();
|
515 |
+
}
|
516 |
+
|
517 |
+
/**
|
518 |
+
* Determines the connected user by first examining any signed
|
519 |
+
* requests, then considering an authorization code, and then
|
520 |
+
* falling back to any persistent store storing the user.
|
521 |
+
*
|
522 |
+
* @return integer The id of the connected Facebook user,
|
523 |
+
* or 0 if no such user exists.
|
524 |
+
*/
|
525 |
+
protected function getUserFromAvailableData() {
|
526 |
+
// if a signed request is supplied, then it solely determines
|
527 |
+
// who the user is.
|
528 |
+
$signed_request = $this->getSignedRequest();
|
529 |
+
if ($signed_request) {
|
530 |
+
if (array_key_exists('user_id', $signed_request)) {
|
531 |
+
$user = $signed_request['user_id'];
|
532 |
+
$this->setPersistentData('user_id', $signed_request['user_id']);
|
533 |
+
return $user;
|
534 |
+
}
|
535 |
+
|
536 |
+
// if the signed request didn't present a user id, then invalidate
|
537 |
+
// all entries in any persistent store.
|
538 |
+
$this->clearAllPersistentData();
|
539 |
+
return 0;
|
540 |
+
}
|
541 |
+
|
542 |
+
$user = $this->getPersistentData('user_id', $default = 0);
|
543 |
+
$persisted_access_token = $this->getPersistentData('access_token');
|
544 |
+
|
545 |
+
// use access_token to fetch user id if we have a user access_token, or if
|
546 |
+
// the cached access token has changed.
|
547 |
+
$access_token = $this->getAccessToken();
|
548 |
+
if ($access_token &&
|
549 |
+
$access_token != $this->getApplicationAccessToken() &&
|
550 |
+
!($user && $persisted_access_token == $access_token)) {
|
551 |
+
$user = $this->getUserFromAccessToken();
|
552 |
+
if ($user) {
|
553 |
+
$this->setPersistentData('user_id', $user);
|
554 |
+
} else {
|
555 |
+
$this->clearAllPersistentData();
|
556 |
+
}
|
557 |
+
}
|
558 |
+
|
559 |
+
return $user;
|
560 |
+
}
|
561 |
+
|
562 |
+
/**
|
563 |
+
* Get a Login URL for use with redirects. By default, full page redirect is
|
564 |
+
* assumed. If you are using the generated URL with a window.open() call in
|
565 |
+
* JavaScript, you can pass in display=popup as part of the $params.
|
566 |
+
*
|
567 |
+
* The parameters:
|
568 |
+
* - redirect_uri: the url to go to after a successful login
|
569 |
+
* - scope: comma separated list of requested extended perms
|
570 |
+
*
|
571 |
+
* @param array $params Provide custom parameters
|
572 |
+
* @return string The URL for the login flow
|
573 |
+
*/
|
574 |
+
public function getLoginUrl($params=array()) {
|
575 |
+
$this->establishCSRFTokenState();
|
576 |
+
$currentUrl = $this->getCurrentUrl();
|
577 |
+
|
578 |
+
// if 'scope' is passed as an array, convert to comma separated list
|
579 |
+
$scopeParams = isset($params['scope']) ? $params['scope'] : null;
|
580 |
+
if ($scopeParams && is_array($scopeParams)) {
|
581 |
+
$params['scope'] = implode(',', $scopeParams);
|
582 |
+
}
|
583 |
+
|
584 |
+
return $this->getUrl(
|
585 |
+
'www',
|
586 |
+
'dialog/oauth',
|
587 |
+
array_merge(array(
|
588 |
+
'client_id' => $this->getAppId(),
|
589 |
+
'redirect_uri' => $currentUrl, // possibly overwritten
|
590 |
+
'state' => $this->state),
|
591 |
+
$params));
|
592 |
+
}
|
593 |
+
|
594 |
+
/**
|
595 |
+
* Get a Logout URL suitable for use with redirects.
|
596 |
+
*
|
597 |
+
* The parameters:
|
598 |
+
* - next: the url to go to after a successful logout
|
599 |
+
*
|
600 |
+
* @param array $params Provide custom parameters
|
601 |
+
* @return string The URL for the logout flow
|
602 |
+
*/
|
603 |
+
public function getLogoutUrl($params=array()) {
|
604 |
+
return $this->getUrl(
|
605 |
+
'www',
|
606 |
+
'logout.php',
|
607 |
+
array_merge(array(
|
608 |
+
'next' => $this->getCurrentUrl(),
|
609 |
+
'access_token' => $this->getUserAccessToken(),
|
610 |
+
), $params)
|
611 |
+
);
|
612 |
+
}
|
613 |
+
|
614 |
+
/**
|
615 |
+
* Get a login status URL to fetch the status from Facebook.
|
616 |
+
*
|
617 |
+
* The parameters:
|
618 |
+
* - ok_session: the URL to go to if a session is found
|
619 |
+
* - no_session: the URL to go to if the user is not connected
|
620 |
+
* - no_user: the URL to go to if the user is not signed into facebook
|
621 |
+
*
|
622 |
+
* @param array $params Provide custom parameters
|
623 |
+
* @return string The URL for the logout flow
|
624 |
+
*/
|
625 |
+
public function getLoginStatusUrl($params=array()) {
|
626 |
+
return $this->getUrl(
|
627 |
+
'www',
|
628 |
+
'extern/login_status.php',
|
629 |
+
array_merge(array(
|
630 |
+
'api_key' => $this->getAppId(),
|
631 |
+
'no_session' => $this->getCurrentUrl(),
|
632 |
+
'no_user' => $this->getCurrentUrl(),
|
633 |
+
'ok_session' => $this->getCurrentUrl(),
|
634 |
+
'session_version' => 3,
|
635 |
+
), $params)
|
636 |
+
);
|
637 |
+
}
|
638 |
+
|
639 |
+
/**
|
640 |
+
* Make an API call.
|
641 |
+
*
|
642 |
+
* @return mixed The decoded response
|
643 |
+
*/
|
644 |
+
public function api(/* polymorphic */) {
|
645 |
+
$args = func_get_args();
|
646 |
+
if (is_array($args[0])) {
|
647 |
+
return $this->_restserver($args[0]);
|
648 |
+
} else {
|
649 |
+
return call_user_func_array(array($this, '_graph'), $args);
|
650 |
+
}
|
651 |
+
}
|
652 |
+
|
653 |
+
/**
|
654 |
+
* Constructs and returns the name of the cookie that
|
655 |
+
* potentially houses the signed request for the app user.
|
656 |
+
* The cookie is not set by the BaseFacebook class, but
|
657 |
+
* it may be set by the JavaScript SDK.
|
658 |
+
*
|
659 |
+
* @return string the name of the cookie that would house
|
660 |
+
* the signed request value.
|
661 |
+
*/
|
662 |
+
protected function getSignedRequestCookieName() {
|
663 |
+
return 'fbsr_'.$this->getAppId();
|
664 |
+
}
|
665 |
+
|
666 |
+
/**
|
667 |
+
* Constructs and returns the name of the coookie that potentially contain
|
668 |
+
* metadata. The cookie is not set by the BaseFacebook class, but it may be
|
669 |
+
* set by the JavaScript SDK.
|
670 |
+
*
|
671 |
+
* @return string the name of the cookie that would house metadata.
|
672 |
+
*/
|
673 |
+
protected function getMetadataCookieName() {
|
674 |
+
return 'fbm_'.$this->getAppId();
|
675 |
+
}
|
676 |
+
|
677 |
+
/**
|
678 |
+
* Get the authorization code from the query parameters, if it exists,
|
679 |
+
* and otherwise return false to signal no authorization code was
|
680 |
+
* discoverable.
|
681 |
+
*
|
682 |
+
* @return mixed The authorization code, or false if the authorization
|
683 |
+
* code could not be determined.
|
684 |
+
*/
|
685 |
+
protected function getCode() {
|
686 |
+
if (isset($_REQUEST['code'])) {
|
687 |
+
if ($this->state !== null &&
|
688 |
+
isset($_REQUEST['state']) &&
|
689 |
+
$this->state === $_REQUEST['state']) {
|
690 |
+
|
691 |
+
// CSRF state has done its job, so clear it
|
692 |
+
$this->state = null;
|
693 |
+
$this->clearPersistentData('state');
|
694 |
+
return $_REQUEST['code'];
|
695 |
+
} else {
|
696 |
+
self::errorLog('CSRF state token does not match one provided.');
|
697 |
+
return false;
|
698 |
+
}
|
699 |
+
}
|
700 |
+
|
701 |
+
return false;
|
702 |
+
}
|
703 |
+
|
704 |
+
/**
|
705 |
+
* Retrieves the UID with the understanding that
|
706 |
+
* $this->accessToken has already been set and is
|
707 |
+
* seemingly legitimate. It relies on Facebook's Graph API
|
708 |
+
* to retrieve user information and then extract
|
709 |
+
* the user ID.
|
710 |
+
*
|
711 |
+
* @return integer Returns the UID of the Facebook user, or 0
|
712 |
+
* if the Facebook user could not be determined.
|
713 |
+
*/
|
714 |
+
protected function getUserFromAccessToken() {
|
715 |
+
try {
|
716 |
+
$user_info = $this->api('/me');
|
717 |
+
return $user_info['id'];
|
718 |
+
} catch (FacebookApiException $e) {
|
719 |
+
return 0;
|
720 |
+
}
|
721 |
+
}
|
722 |
+
|
723 |
+
/**
|
724 |
+
* Returns the access token that should be used for logged out
|
725 |
+
* users when no authorization code is available.
|
726 |
+
*
|
727 |
+
* @return string The application access token, useful for gathering
|
728 |
+
* public information about users and applications.
|
729 |
+
*/
|
730 |
+
protected function getApplicationAccessToken() {
|
731 |
+
return $this->appId.'|'.$this->appSecret;
|
732 |
+
}
|
733 |
+
|
734 |
+
/**
|
735 |
+
* Lays down a CSRF state token for this process.
|
736 |
+
*
|
737 |
+
* @return void
|
738 |
+
*/
|
739 |
+
protected function establishCSRFTokenState() {
|
740 |
+
if ($this->state === null) {
|
741 |
+
$this->state = md5(uniqid(mt_rand(), true));
|
742 |
+
$this->setPersistentData('state', $this->state);
|
743 |
+
}
|
744 |
+
}
|
745 |
+
|
746 |
+
/**
|
747 |
+
* Retrieves an access token for the given authorization code
|
748 |
+
* (previously generated from www.facebook.com on behalf of
|
749 |
+
* a specific user). The authorization code is sent to graph.facebook.com
|
750 |
+
* and a legitimate access token is generated provided the access token
|
751 |
+
* and the user for which it was generated all match, and the user is
|
752 |
+
* either logged in to Facebook or has granted an offline access permission.
|
753 |
+
*
|
754 |
+
* @param string $code An authorization code.
|
755 |
+
* @return mixed An access token exchanged for the authorization code, or
|
756 |
+
* false if an access token could not be generated.
|
757 |
+
*/
|
758 |
+
protected function getAccessTokenFromCode($code, $redirect_uri = null) {
|
759 |
+
if (empty($code)) {
|
760 |
+
return false;
|
761 |
+
}
|
762 |
+
|
763 |
+
if ($redirect_uri === null) {
|
764 |
+
$redirect_uri = $this->getCurrentUrl();
|
765 |
+
}
|
766 |
+
|
767 |
+
try {
|
768 |
+
// need to circumvent json_decode by calling _oauthRequest
|
769 |
+
// directly, since response isn't JSON format.
|
770 |
+
$access_token_response =
|
771 |
+
$this->_oauthRequest(
|
772 |
+
$this->getUrl('graph', '/oauth/access_token'),
|
773 |
+
$params = array('client_id' => $this->getAppId(),
|
774 |
+
'client_secret' => $this->getAppSecret(),
|
775 |
+
'redirect_uri' => $redirect_uri,
|
776 |
+
'code' => $code));
|
777 |
+
} catch (FacebookApiException $e) {
|
778 |
+
// most likely that user very recently revoked authorization.
|
779 |
+
// In any event, we don't have an access token, so say so.
|
780 |
+
return false;
|
781 |
+
}
|
782 |
+
|
783 |
+
if (empty($access_token_response)) {
|
784 |
+
return false;
|
785 |
+
}
|
786 |
+
|
787 |
+
$response_params = array();
|
788 |
+
parse_str($access_token_response, $response_params);
|
789 |
+
if (!isset($response_params['access_token'])) {
|
790 |
+
return false;
|
791 |
+
}
|
792 |
+
|
793 |
+
return $response_params['access_token'];
|
794 |
+
}
|
795 |
+
|
796 |
+
/**
|
797 |
+
* Invoke the old restserver.php endpoint.
|
798 |
+
*
|
799 |
+
* @param array $params Method call object
|
800 |
+
*
|
801 |
+
* @return mixed The decoded response object
|
802 |
+
* @throws FacebookApiException
|
803 |
+
*/
|
804 |
+
protected function _restserver($params) {
|
805 |
+
// generic application level parameters
|
806 |
+
$params['api_key'] = $this->getAppId();
|
807 |
+
$params['format'] = 'json-strings';
|
808 |
+
|
809 |
+
$result = json_decode($this->_oauthRequest(
|
810 |
+
$this->getApiUrl($params['method']),
|
811 |
+
$params
|
812 |
+
), true);
|
813 |
+
|
814 |
+
// results are returned, errors are thrown
|
815 |
+
if (is_array($result) && isset($result['error_code'])) {
|
816 |
+
$this->throwAPIException($result);
|
817 |
+
// @codeCoverageIgnoreStart
|
818 |
+
}
|
819 |
+
// @codeCoverageIgnoreEnd
|
820 |
+
|
821 |
+
$method = strtolower($params['method']);
|
822 |
+
if ($method === 'auth.expiresession' ||
|
823 |
+
$method === 'auth.revokeauthorization') {
|
824 |
+
$this->destroySession();
|
825 |
+
}
|
826 |
+
|
827 |
+
return $result;
|
828 |
+
}
|
829 |
+
|
830 |
+
/**
|
831 |
+
* Return true if this is video post.
|
832 |
+
*
|
833 |
+
* @param string $path The path
|
834 |
+
* @param string $method The http method (default 'GET')
|
835 |
+
*
|
836 |
+
* @return boolean true if this is video post
|
837 |
+
*/
|
838 |
+
protected function isVideoPost($path, $method = 'GET') {
|
839 |
+
if ($method == 'POST' && preg_match("/^(\/)(.+)(\/)(videos)$/", $path)) {
|
840 |
+
return true;
|
841 |
+
}
|
842 |
+
return false;
|
843 |
+
}
|
844 |
+
|
845 |
+
/**
|
846 |
+
* Invoke the Graph API.
|
847 |
+
*
|
848 |
+
* @param string $path The path (required)
|
849 |
+
* @param string $method The http method (default 'GET')
|
850 |
+
* @param array $params The query/post data
|
851 |
+
*
|
852 |
+
* @return mixed The decoded response object
|
853 |
+
* @throws FacebookApiException
|
854 |
+
*/
|
855 |
+
protected function _graph($path, $method = 'GET', $params = array()) {
|
856 |
+
if (is_array($method) && empty($params)) {
|
857 |
+
$params = $method;
|
858 |
+
$method = 'GET';
|
859 |
+
}
|
860 |
+
$params['method'] = $method; // method override as we always do a POST
|
861 |
+
|
862 |
+
if ($this->isVideoPost($path, $method)) {
|
863 |
+
$domainKey = 'graph_video';
|
864 |
+
} else {
|
865 |
+
$domainKey = 'graph';
|
866 |
+
}
|
867 |
+
|
868 |
+
$result = json_decode($this->_oauthRequest(
|
869 |
+
$this->getUrl($domainKey, $path),
|
870 |
+
$params
|
871 |
+
), true);
|
872 |
+
|
873 |
+
// results are returned, errors are thrown
|
874 |
+
if (is_array($result) && isset($result['error'])) {
|
875 |
+
$this->throwAPIException($result);
|
876 |
+
// @codeCoverageIgnoreStart
|
877 |
+
}
|
878 |
+
// @codeCoverageIgnoreEnd
|
879 |
+
|
880 |
+
return $result;
|
881 |
+
}
|
882 |
+
|
883 |
+
/**
|
884 |
+
* Make a OAuth Request.
|
885 |
+
*
|
886 |
+
* @param string $url The path (required)
|
887 |
+
* @param array $params The query/post data
|
888 |
+
*
|
889 |
+
* @return string The decoded response object
|
890 |
+
* @throws FacebookApiException
|
891 |
+
*/
|
892 |
+
protected function _oauthRequest($url, $params) {
|
893 |
+
if (!isset($params['access_token'])) {
|
894 |
+
$params['access_token'] = $this->getAccessToken();
|
895 |
+
}
|
896 |
+
|
897 |
+
// json_encode all params values that are not strings
|
898 |
+
foreach ($params as $key => $value) {
|
899 |
+
if (!is_string($value)) {
|
900 |
+
$params[$key] = json_encode($value);
|
901 |
+
}
|
902 |
+
}
|
903 |
+
|
904 |
+
return $this->makeRequest($url, $params);
|
905 |
+
}
|
906 |
+
|
907 |
+
/**
|
908 |
+
* Makes an HTTP request. This method can be overridden by subclasses if
|
909 |
+
* developers want to do fancier things or use something other than curl to
|
910 |
+
* make the request.
|
911 |
+
*
|
912 |
+
* @param string $url The URL to make the request to
|
913 |
+
* @param array $params The parameters to use for the POST body
|
914 |
+
* @param CurlHandler $ch Initialized curl handle
|
915 |
+
*
|
916 |
+
* @return string The response text
|
917 |
+
*/
|
918 |
+
protected function makeRequest($url, $params, $ch=null) {
|
919 |
+
if (!$ch) {
|
920 |
+
$ch = curl_init();
|
921 |
+
}
|
922 |
+
|
923 |
+
$opts = self::$CURL_OPTS;
|
924 |
+
if ($this->getFileUploadSupport()) {
|
925 |
+
$opts[CURLOPT_POSTFIELDS] = $params;
|
926 |
+
} else {
|
927 |
+
$opts[CURLOPT_POSTFIELDS] = http_build_query($params, null, '&');
|
928 |
+
}
|
929 |
+
$opts[CURLOPT_URL] = $url;
|
930 |
+
|
931 |
+
// disable the 'Expect: 100-continue' behaviour. This causes CURL to wait
|
932 |
+
// for 2 seconds if the server does not support this header.
|
933 |
+
if (isset($opts[CURLOPT_HTTPHEADER])) {
|
934 |
+
$existing_headers = $opts[CURLOPT_HTTPHEADER];
|
935 |
+
$existing_headers[] = 'Expect:';
|
936 |
+
$opts[CURLOPT_HTTPHEADER] = $existing_headers;
|
937 |
+
} else {
|
938 |
+
$opts[CURLOPT_HTTPHEADER] = array('Expect:');
|
939 |
+
}
|
940 |
+
|
941 |
+
curl_setopt_array($ch, $opts);
|
942 |
+
$result = curl_exec($ch);
|
943 |
+
|
944 |
+
if (curl_errno($ch) == 60) { // CURLE_SSL_CACERT
|
945 |
+
self::errorLog('Invalid or no certificate authority found, '.
|
946 |
+
'using bundled information');
|
947 |
+
curl_setopt($ch, CURLOPT_CAINFO,
|
948 |
+
dirname(__FILE__) . '/fb_ca_chain_bundle.crt');
|
949 |
+
$result = curl_exec($ch);
|
950 |
+
}
|
951 |
+
|
952 |
+
// With dual stacked DNS responses, it's possible for a server to
|
953 |
+
// have IPv6 enabled but not have IPv6 connectivity. If this is
|
954 |
+
// the case, curl will try IPv4 first and if that fails, then it will
|
955 |
+
// fall back to IPv6 and the error EHOSTUNREACH is returned by the
|
956 |
+
// operating system.
|
957 |
+
if ($result === false && empty($opts[CURLOPT_IPRESOLVE])) {
|
958 |
+
$matches = array();
|
959 |
+
$regex = '/Failed to connect to ([^:].*): Network is unreachable/';
|
960 |
+
if (preg_match($regex, curl_error($ch), $matches)) {
|
961 |
+
if (strlen(@inet_pton($matches[1])) === 16) {
|
962 |
+
self::errorLog('Invalid IPv6 configuration on server, '.
|
963 |
+
'Please disable or get native IPv6 on your server.');
|
964 |
+
self::$CURL_OPTS[CURLOPT_IPRESOLVE] = CURL_IPRESOLVE_V4;
|
965 |
+
curl_setopt($ch, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4);
|
966 |
+
$result = curl_exec($ch);
|
967 |
+
}
|
968 |
+
}
|
969 |
+
}
|
970 |
+
|
971 |
+
if ($result === false) {
|
972 |
+
$e = new FacebookApiException(array(
|
973 |
+
'error_code' => curl_errno($ch),
|
974 |
+
'error' => array(
|
975 |
+
'message' => curl_error($ch),
|
976 |
+
'type' => 'CurlException',
|
977 |
+
),
|
978 |
+
));
|
979 |
+
curl_close($ch);
|
980 |
+
throw $e;
|
981 |
+
}
|
982 |
+
curl_close($ch);
|
983 |
+
return $result;
|
984 |
+
}
|
985 |
+
|
986 |
+
/**
|
987 |
+
* Parses a signed_request and validates the signature.
|
988 |
+
*
|
989 |
+
* @param string $signed_request A signed token
|
990 |
+
* @return array The payload inside it or null if the sig is wrong
|
991 |
+
*/
|
992 |
+
protected function parseSignedRequest($signed_request) {
|
993 |
+
list($encoded_sig, $payload) = explode('.', $signed_request, 2);
|
994 |
+
|
995 |
+
// decode the data
|
996 |
+
$sig = self::base64UrlDecode($encoded_sig);
|
997 |
+
$data = json_decode(self::base64UrlDecode($payload), true);
|
998 |
+
|
999 |
+
if (strtoupper($data['algorithm']) !== self::SIGNED_REQUEST_ALGORITHM) {
|
1000 |
+
self::errorLog(
|
1001 |
+
'Unknown algorithm. Expected ' . self::SIGNED_REQUEST_ALGORITHM);
|
1002 |
+
return null;
|
1003 |
+
}
|
1004 |
+
|
1005 |
+
// check sig
|
1006 |
+
$expected_sig = hash_hmac('sha256', $payload,
|
1007 |
+
$this->getAppSecret(), $raw = true);
|
1008 |
+
if ($sig !== $expected_sig) {
|
1009 |
+
self::errorLog('Bad Signed JSON signature!');
|
1010 |
+
return null;
|
1011 |
+
}
|
1012 |
+
|
1013 |
+
return $data;
|
1014 |
+
}
|
1015 |
+
|
1016 |
+
/**
|
1017 |
+
* Makes a signed_request blob using the given data.
|
1018 |
+
*
|
1019 |
+
* @param array The data array.
|
1020 |
+
* @return string The signed request.
|
1021 |
+
*/
|
1022 |
+
protected function makeSignedRequest($data) {
|
1023 |
+
if (!is_array($data)) {
|
1024 |
+
throw new InvalidArgumentException(
|
1025 |
+
'makeSignedRequest expects an array. Got: ' . print_r($data, true));
|
1026 |
+
}
|
1027 |
+
$data['algorithm'] = self::SIGNED_REQUEST_ALGORITHM;
|
1028 |
+
$data['issued_at'] = time();
|
1029 |
+
$json = json_encode($data);
|
1030 |
+
$b64 = self::base64UrlEncode($json);
|
1031 |
+
$raw_sig = hash_hmac('sha256', $b64, $this->getAppSecret(), $raw = true);
|
1032 |
+
$sig = self::base64UrlEncode($raw_sig);
|
1033 |
+
return $sig.'.'.$b64;
|
1034 |
+
}
|
1035 |
+
|
1036 |
+
/**
|
1037 |
+
* Build the URL for api given parameters.
|
1038 |
+
*
|
1039 |
+
* @param $method String the method name.
|
1040 |
+
* @return string The URL for the given parameters
|
1041 |
+
*/
|
1042 |
+
protected function getApiUrl($method) {
|
1043 |
+
static $READ_ONLY_CALLS =
|
1044 |
+
array('admin.getallocation' => 1,
|
1045 |
+
'admin.getappproperties' => 1,
|
1046 |
+
'admin.getbannedusers' => 1,
|
1047 |
+
'admin.getlivestreamvialink' => 1,
|
1048 |
+
'admin.getmetrics' => 1,
|
1049 |
+
'admin.getrestrictioninfo' => 1,
|
1050 |
+
'application.getpublicinfo' => 1,
|
1051 |
+
'auth.getapppublickey' => 1,
|
1052 |
+
'auth.getsession' => 1,
|
1053 |
+
'auth.getsignedpublicsessiondata' => 1,
|
1054 |
+
'comments.get' => 1,
|
1055 |
+
'connect.getunconnectedfriendscount' => 1,
|
1056 |
+
'dashboard.getactivity' => 1,
|
1057 |
+
'dashboard.getcount' => 1,
|
1058 |
+
'dashboard.getglobalnews' => 1,
|
1059 |
+
'dashboard.getnews' => 1,
|
1060 |
+
'dashboard.multigetcount' => 1,
|
1061 |
+
'dashboard.multigetnews' => 1,
|
1062 |
+
'data.getcookies' => 1,
|
1063 |
+
'events.get' => 1,
|
1064 |
+
'events.getmembers' => 1,
|
1065 |
+
'fbml.getcustomtags' => 1,
|
1066 |
+
'feed.getappfriendstories' => 1,
|
1067 |
+
'feed.getregisteredtemplatebundlebyid' => 1,
|
1068 |
+
'feed.getregisteredtemplatebundles' => 1,
|
1069 |
+
'fql.multiquery' => 1,
|
1070 |
+
'fql.query' => 1,
|
1071 |
+
'friends.arefriends' => 1,
|
1072 |
+
'friends.get' => 1,
|
1073 |
+
'friends.getappusers' => 1,
|
1074 |
+
'friends.getlists' => 1,
|
1075 |
+
'friends.getmutualfriends' => 1,
|
1076 |
+
'gifts.get' => 1,
|
1077 |
+
'groups.get' => 1,
|
1078 |
+
'groups.getmembers' => 1,
|
1079 |
+
'intl.gettranslations' => 1,
|
1080 |
+
'links.get' => 1,
|
1081 |
+
'notes.get' => 1,
|
1082 |
+
'notifications.get' => 1,
|
1083 |
+
'pages.getinfo' => 1,
|
1084 |
+
'pages.isadmin' => 1,
|
1085 |
+
'pages.isappadded' => 1,
|
1086 |
+
'pages.isfan' => 1,
|
1087 |
+
'permissions.checkavailableapiaccess' => 1,
|
1088 |
+
'permissions.checkgrantedapiaccess' => 1,
|
1089 |
+
'photos.get' => 1,
|
1090 |
+
'photos.getalbums' => 1,
|
1091 |
+
'photos.gettags' => 1,
|
1092 |
+
'profile.getinfo' => 1,
|
1093 |
+
'profile.getinfooptions' => 1,
|
1094 |
+
'stream.get' => 1,
|
1095 |
+
'stream.getcomments' => 1,
|
1096 |
+
'stream.getfilters' => 1,
|
1097 |
+
'users.getinfo' => 1,
|
1098 |
+
'users.getloggedinuser' => 1,
|
1099 |
+
'users.getstandardinfo' => 1,
|
1100 |
+
'users.hasapppermission' => 1,
|
1101 |
+
'users.isappuser' => 1,
|
1102 |
+
'users.isverified' => 1,
|
1103 |
+
'video.getuploadlimits' => 1);
|
1104 |
+
$name = 'api';
|
1105 |
+
if (isset($READ_ONLY_CALLS[strtolower($method)])) {
|
1106 |
+
$name = 'api_read';
|
1107 |
+
} else if (strtolower($method) == 'video.upload') {
|
1108 |
+
$name = 'api_video';
|
1109 |
+
}
|
1110 |
+
return self::getUrl($name, 'restserver.php');
|
1111 |
+
}
|
1112 |
+
|
1113 |
+
/**
|
1114 |
+
* Build the URL for given domain alias, path and parameters.
|
1115 |
+
*
|
1116 |
+
* @param $name string The name of the domain
|
1117 |
+
* @param $path string Optional path (without a leading slash)
|
1118 |
+
* @param $params array Optional query parameters
|
1119 |
+
*
|
1120 |
+
* @return string The URL for the given parameters
|
1121 |
+
*/
|
1122 |
+
protected function getUrl($name, $path='', $params=array()) {
|
1123 |
+
$url = self::$DOMAIN_MAP[$name];
|
1124 |
+
if ($path) {
|
1125 |
+
if ($path[0] === '/') {
|
1126 |
+
$path = substr($path, 1);
|
1127 |
+
}
|
1128 |
+
$url .= $path;
|
1129 |
+
}
|
1130 |
+
if ($params) {
|
1131 |
+
$url .= '?' . http_build_query($params, null, '&');
|
1132 |
+
}
|
1133 |
+
|
1134 |
+
return $url;
|
1135 |
+
}
|
1136 |
+
|
1137 |
+
protected function getHttpHost() {
|
1138 |
+
if ($this->trustForwarded && isset($_SERVER['HTTP_X_FORWARDED_HOST'])) {
|
1139 |
+
return $_SERVER['HTTP_X_FORWARDED_HOST'];
|
1140 |
+
}
|
1141 |
+
return $_SERVER['HTTP_HOST'];
|
1142 |
+
}
|
1143 |
+
|
1144 |
+
protected function getHttpProtocol() {
|
1145 |
+
if ($this->trustForwarded && isset($_SERVER['HTTP_X_FORWARDED_PROTO'])) {
|
1146 |
+
if ($_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https') {
|
1147 |
+
return 'https';
|
1148 |
+
}
|
1149 |
+
return 'http';
|
1150 |
+
}
|
1151 |
+
/*apache + variants specific way of checking for https*/
|
1152 |
+
if (isset($_SERVER['HTTPS']) &&
|
1153 |
+
($_SERVER['HTTPS'] === 'on' || $_SERVER['HTTPS'] == 1)) {
|
1154 |
+
return 'https';
|
1155 |
+
}
|
1156 |
+
/*nginx way of checking for https*/
|
1157 |
+
if (isset($_SERVER['SERVER_PORT']) &&
|
1158 |
+
($_SERVER['SERVER_PORT'] === '443')) {
|
1159 |
+
return 'https';
|
1160 |
+
}
|
1161 |
+
return 'http';
|
1162 |
+
}
|
1163 |
+
|
1164 |
+
/**
|
1165 |
+
* Get the base domain used for the cookie.
|
1166 |
+
*/
|
1167 |
+
protected function getBaseDomain() {
|
1168 |
+
// The base domain is stored in the metadata cookie if not we fallback
|
1169 |
+
// to the current hostname
|
1170 |
+
$metadata = $this->getMetadataCookie();
|
1171 |
+
if (array_key_exists('base_domain', $metadata) &&
|
1172 |
+
!empty($metadata['base_domain'])) {
|
1173 |
+
return trim($metadata['base_domain'], '.');
|
1174 |
+
}
|
1175 |
+
return $this->getHttpHost();
|
1176 |
+
}
|
1177 |
+
|
1178 |
+
/**
|
1179 |
+
|
1180 |
+
/**
|
1181 |
+
* Returns the Current URL, stripping it of known FB parameters that should
|
1182 |
+
* not persist.
|
1183 |
+
*
|
1184 |
+
* @return string The current URL
|
1185 |
+
*/
|
1186 |
+
protected function getCurrentUrl() {
|
1187 |
+
$protocol = $this->getHttpProtocol() . '://';
|
1188 |
+
$host = $this->getHttpHost();
|
1189 |
+
$currentUrl = $protocol.$host.$_SERVER['REQUEST_URI'];
|
1190 |
+
$parts = parse_url($currentUrl);
|
1191 |
+
|
1192 |
+
$query = '';
|
1193 |
+
if (!empty($parts['query'])) {
|
1194 |
+
// drop known fb params
|
1195 |
+
$params = explode('&', $parts['query']);
|
1196 |
+
$retained_params = array();
|
1197 |
+
foreach ($params as $param) {
|
1198 |
+
if ($this->shouldRetainParam($param)) {
|
1199 |
+
$retained_params[] = $param;
|
1200 |
+
}
|
1201 |
+
}
|
1202 |
+
|
1203 |
+
if (!empty($retained_params)) {
|
1204 |
+
$query = '?'.implode($retained_params, '&');
|
1205 |
+
}
|
1206 |
+
}
|
1207 |
+
|
1208 |
+
// use port if non default
|
1209 |
+
$port =
|
1210 |
+
isset($parts['port']) &&
|
1211 |
+
(($protocol === 'http://' && $parts['port'] !== 80) ||
|
1212 |
+
($protocol === 'https://' && $parts['port'] !== 443))
|
1213 |
+
? ':' . $parts['port'] : '';
|
1214 |
+
|
1215 |
+
// rebuild
|
1216 |
+
return $protocol . $parts['host'] . $port . $parts['path'] . $query;
|
1217 |
+
}
|
1218 |
+
|
1219 |
+
/**
|
1220 |
+
* Returns true if and only if the key or key/value pair should
|
1221 |
+
* be retained as part of the query string. This amounts to
|
1222 |
+
* a brute-force search of the very small list of Facebook-specific
|
1223 |
+
* params that should be stripped out.
|
1224 |
+
*
|
1225 |
+
* @param string $param A key or key/value pair within a URL's query (e.g.
|
1226 |
+
* 'foo=a', 'foo=', or 'foo'.
|
1227 |
+
*
|
1228 |
+
* @return boolean
|
1229 |
+
*/
|
1230 |
+
protected function shouldRetainParam($param) {
|
1231 |
+
foreach (self::$DROP_QUERY_PARAMS as $drop_query_param) {
|
1232 |
+
if (strpos($param, $drop_query_param.'=') === 0) {
|
1233 |
+
return false;
|
1234 |
+
}
|
1235 |
+
}
|
1236 |
+
|
1237 |
+
return true;
|
1238 |
+
}
|
1239 |
+
|
1240 |
+
/**
|
1241 |
+
* Analyzes the supplied result to see if it was thrown
|
1242 |
+
* because the access token is no longer valid. If that is
|
1243 |
+
* the case, then we destroy the session.
|
1244 |
+
*
|
1245 |
+
* @param $result array A record storing the error message returned
|
1246 |
+
* by a failed API call.
|
1247 |
+
*/
|
1248 |
+
protected function throwAPIException($result) {
|
1249 |
+
$e = new FacebookApiException($result);
|
1250 |
+
switch ($e->getType()) {
|
1251 |
+
// OAuth 2.0 Draft 00 style
|
1252 |
+
case 'OAuthException':
|
1253 |
+
// OAuth 2.0 Draft 10 style
|
1254 |
+
case 'invalid_token':
|
1255 |
+
// REST server errors are just Exceptions
|
1256 |
+
case 'Exception':
|
1257 |
+
$message = $e->getMessage();
|
1258 |
+
if ((strpos($message, 'Error validating access token') !== false) ||
|
1259 |
+
(strpos($message, 'Invalid OAuth access token') !== false) ||
|
1260 |
+
(strpos($message, 'An active access token must be used') !== false)
|
1261 |
+
) {
|
1262 |
+
$this->destroySession();
|
1263 |
+
}
|
1264 |
+
break;
|
1265 |
+
}
|
1266 |
+
|
1267 |
+
throw $e;
|
1268 |
+
}
|
1269 |
+
|
1270 |
+
|
1271 |
+
/**
|
1272 |
+
* Prints to the error log if you aren't in command line mode.
|
1273 |
+
*
|
1274 |
+
* @param string $msg Log message
|
1275 |
+
*/
|
1276 |
+
protected static function errorLog($msg) {
|
1277 |
+
// disable error log if we are running in a CLI environment
|
1278 |
+
// @codeCoverageIgnoreStart
|
1279 |
+
if (php_sapi_name() != 'cli') {
|
1280 |
+
error_log($msg);
|
1281 |
+
}
|
1282 |
+
// uncomment this if you want to see the errors on the page
|
1283 |
+
// print 'error_log: '.$msg."\n";
|
1284 |
+
// @codeCoverageIgnoreEnd
|
1285 |
+
}
|
1286 |
+
|
1287 |
+
/**
|
1288 |
+
* Base64 encoding that doesn't need to be urlencode()ed.
|
1289 |
+
* Exactly the same as base64_encode except it uses
|
1290 |
+
* - instead of +
|
1291 |
+
* _ instead of /
|
1292 |
+
* No padded =
|
1293 |
+
*
|
1294 |
+
* @param string $input base64UrlEncoded string
|
1295 |
+
* @return string
|
1296 |
+
*/
|
1297 |
+
protected static function base64UrlDecode($input) {
|
1298 |
+
return base64_decode(strtr($input, '-_', '+/'));
|
1299 |
+
}
|
1300 |
+
|
1301 |
+
/**
|
1302 |
+
* Base64 encoding that doesn't need to be urlencode()ed.
|
1303 |
+
* Exactly the same as base64_encode except it uses
|
1304 |
+
* - instead of +
|
1305 |
+
* _ instead of /
|
1306 |
+
*
|
1307 |
+
* @param string $input string
|
1308 |
+
* @return string base64Url encoded string
|
1309 |
+
*/
|
1310 |
+
protected static function base64UrlEncode($input) {
|
1311 |
+
$str = strtr(base64_encode($input), '+/', '-_');
|
1312 |
+
$str = str_replace('=', '', $str);
|
1313 |
+
return $str;
|
1314 |
+
}
|
1315 |
+
|
1316 |
+
/**
|
1317 |
+
* Destroy the current session
|
1318 |
+
*/
|
1319 |
+
public function destroySession() {
|
1320 |
+
$this->accessToken = null;
|
1321 |
+
$this->signedRequest = null;
|
1322 |
+
$this->user = null;
|
1323 |
+
$this->clearAllPersistentData();
|
1324 |
+
|
1325 |
+
// Javascript sets a cookie that will be used in getSignedRequest that we
|
1326 |
+
// need to clear if we can
|
1327 |
+
$cookie_name = $this->getSignedRequestCookieName();
|
1328 |
+
if (array_key_exists($cookie_name, $_COOKIE)) {
|
1329 |
+
unset($_COOKIE[$cookie_name]);
|
1330 |
+
if (!headers_sent()) {
|
1331 |
+
$base_domain = $this->getBaseDomain();
|
1332 |
+
setcookie($cookie_name, '', 1, '/', '.'.$base_domain);
|
1333 |
+
} else {
|
1334 |
+
// @codeCoverageIgnoreStart
|
1335 |
+
self::errorLog(
|
1336 |
+
'There exists a cookie that we wanted to clear that we couldn\'t '.
|
1337 |
+
'clear because headers was already sent. Make sure to do the first '.
|
1338 |
+
'API call before outputing anything.'
|
1339 |
+
);
|
1340 |
+
// @codeCoverageIgnoreEnd
|
1341 |
+
}
|
1342 |
+
}
|
1343 |
+
}
|
1344 |
+
|
1345 |
+
/**
|
1346 |
+
* Parses the metadata cookie that our Javascript API set
|
1347 |
+
*
|
1348 |
+
* @return an array mapping key to value
|
1349 |
+
*/
|
1350 |
+
protected function getMetadataCookie() {
|
1351 |
+
$cookie_name = $this->getMetadataCookieName();
|
1352 |
+
if (!array_key_exists($cookie_name, $_COOKIE)) {
|
1353 |
+
return array();
|
1354 |
+
}
|
1355 |
+
|
1356 |
+
// The cookie value can be wrapped in "-characters so remove them
|
1357 |
+
$cookie_value = trim($_COOKIE[$cookie_name], '"');
|
1358 |
+
|
1359 |
+
if (empty($cookie_value)) {
|
1360 |
+
return array();
|
1361 |
+
}
|
1362 |
+
|
1363 |
+
$parts = explode('&', $cookie_value);
|
1364 |
+
$metadata = array();
|
1365 |
+
foreach ($parts as $part) {
|
1366 |
+
$pair = explode('=', $part, 2);
|
1367 |
+
if (!empty($pair[0])) {
|
1368 |
+
$metadata[urldecode($pair[0])] =
|
1369 |
+
(count($pair) > 1) ? urldecode($pair[1]) : '';
|
1370 |
+
}
|
1371 |
+
}
|
1372 |
+
|
1373 |
+
return $metadata;
|
1374 |
+
}
|
1375 |
+
|
1376 |
+
protected static function isAllowedDomain($big, $small) {
|
1377 |
+
if ($big === $small) {
|
1378 |
+
return true;
|
1379 |
+
}
|
1380 |
+
return self::endsWith($big, '.'.$small);
|
1381 |
+
}
|
1382 |
+
|
1383 |
+
protected static function endsWith($big, $small) {
|
1384 |
+
$len = strlen($small);
|
1385 |
+
if ($len === 0) {
|
1386 |
+
return true;
|
1387 |
+
}
|
1388 |
+
return substr($big, -$len) === $small;
|
1389 |
+
}
|
1390 |
+
|
1391 |
+
/**
|
1392 |
+
* Each of the following four methods should be overridden in
|
1393 |
+
* a concrete subclass, as they are in the provided Facebook class.
|
1394 |
+
* The Facebook class uses PHP sessions to provide a primitive
|
1395 |
+
* persistent store, but another subclass--one that you implement--
|
1396 |
+
* might use a database, memcache, or an in-memory cache.
|
1397 |
+
*
|
1398 |
+
* @see Facebook
|
1399 |
+
*/
|
1400 |
+
|
1401 |
+
/**
|
1402 |
+
* Stores the given ($key, $value) pair, so that future calls to
|
1403 |
+
* getPersistentData($key) return $value. This call may be in another request.
|
1404 |
+
*
|
1405 |
+
* @param string $key
|
1406 |
+
* @param array $value
|
1407 |
+
*
|
1408 |
+
* @return void
|
1409 |
+
*/
|
1410 |
+
abstract protected function setPersistentData($key, $value);
|
1411 |
+
|
1412 |
+
/**
|
1413 |
+
* Get the data for $key, persisted by BaseFacebook::setPersistentData()
|
1414 |
+
*
|
1415 |
+
* @param string $key The key of the data to retrieve
|
1416 |
+
* @param boolean $default The default value to return if $key is not found
|
1417 |
+
*
|
1418 |
+
* @return mixed
|
1419 |
+
*/
|
1420 |
+
abstract protected function getPersistentData($key, $default = false);
|
1421 |
+
|
1422 |
+
/**
|
1423 |
+
* Clear the data with $key from the persistent storage
|
1424 |
+
*
|
1425 |
+
* @param string $key
|
1426 |
+
* @return void
|
1427 |
+
*/
|
1428 |
+
abstract protected function clearPersistentData($key);
|
1429 |
+
|
1430 |
+
/**
|
1431 |
+
* Clear all data from the persistent storage
|
1432 |
+
*
|
1433 |
+
* @return void
|
1434 |
+
*/
|
1435 |
+
abstract protected function clearAllPersistentData();
|
1436 |
+
}
|
hybridauth/Hybrid/thirdparty/Facebook/facebook.php
ADDED
@@ -0,0 +1,160 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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 |
+
require_once "base_facebook.php";
|
19 |
+
|
20 |
+
/**
|
21 |
+
* Extends the BaseFacebook class with the intent of using
|
22 |
+
* PHP sessions to store user ids and access tokens.
|
23 |
+
*/
|
24 |
+
class Facebook extends BaseFacebook
|
25 |
+
{
|
26 |
+
const FBSS_COOKIE_NAME = 'fbss';
|
27 |
+
|
28 |
+
// We can set this to a high number because the main session
|
29 |
+
// expiration will trump this.
|
30 |
+
const FBSS_COOKIE_EXPIRE = 31556926; // 1 year
|
31 |
+
|
32 |
+
// Stores the shared session ID if one is set.
|
33 |
+
protected $sharedSessionID;
|
34 |
+
|
35 |
+
/**
|
36 |
+
* Identical to the parent constructor, except that
|
37 |
+
* we start a PHP session to store the user ID and
|
38 |
+
* access token if during the course of execution
|
39 |
+
* we discover them.
|
40 |
+
*
|
41 |
+
* @param Array $config the application configuration. Additionally
|
42 |
+
* accepts "sharedSession" as a boolean to turn on a secondary
|
43 |
+
* cookie for environments with a shared session (that is, your app
|
44 |
+
* shares the domain with other apps).
|
45 |
+
* @see BaseFacebook::__construct in facebook.php
|
46 |
+
*/
|
47 |
+
public function __construct($config) {
|
48 |
+
if (!session_id()) {
|
49 |
+
session_start();
|
50 |
+
}
|
51 |
+
parent::__construct($config);
|
52 |
+
if (!empty($config['sharedSession'])) {
|
53 |
+
$this->initSharedSession();
|
54 |
+
}
|
55 |
+
}
|
56 |
+
|
57 |
+
protected static $kSupportedKeys =
|
58 |
+
array('state', 'code', 'access_token', 'user_id');
|
59 |
+
|
60 |
+
protected function initSharedSession() {
|
61 |
+
$cookie_name = $this->getSharedSessionCookieName();
|
62 |
+
if (isset($_COOKIE[$cookie_name])) {
|
63 |
+
$data = $this->parseSignedRequest($_COOKIE[$cookie_name]);
|
64 |
+
if ($data && !empty($data['domain']) &&
|
65 |
+
self::isAllowedDomain($this->getHttpHost(), $data['domain'])) {
|
66 |
+
// good case
|
67 |
+
$this->sharedSessionID = $data['id'];
|
68 |
+
return;
|
69 |
+
}
|
70 |
+
// ignoring potentially unreachable data
|
71 |
+
}
|
72 |
+
// evil/corrupt/missing case
|
73 |
+
$base_domain = $this->getBaseDomain();
|
74 |
+
$this->sharedSessionID = md5(uniqid(mt_rand(), true));
|
75 |
+
$cookie_value = $this->makeSignedRequest(
|
76 |
+
array(
|
77 |
+
'domain' => $base_domain,
|
78 |
+
'id' => $this->sharedSessionID,
|
79 |
+
)
|
80 |
+
);
|
81 |
+
$_COOKIE[$cookie_name] = $cookie_value;
|
82 |
+
if (!headers_sent()) {
|
83 |
+
$expire = time() + self::FBSS_COOKIE_EXPIRE;
|
84 |
+
setcookie($cookie_name, $cookie_value, $expire, '/', '.'.$base_domain);
|
85 |
+
} else {
|
86 |
+
// @codeCoverageIgnoreStart
|
87 |
+
self::errorLog(
|
88 |
+
'Shared session ID cookie could not be set! You must ensure you '.
|
89 |
+
'create the Facebook instance before headers have been sent. This '.
|
90 |
+
'will cause authentication issues after the first request.'
|
91 |
+
);
|
92 |
+
// @codeCoverageIgnoreEnd
|
93 |
+
}
|
94 |
+
}
|
95 |
+
|
96 |
+
/**
|
97 |
+
* Provides the implementations of the inherited abstract
|
98 |
+
* methods. The implementation uses PHP sessions to maintain
|
99 |
+
* a store for authorization codes, user ids, CSRF states, and
|
100 |
+
* access tokens.
|
101 |
+
*/
|
102 |
+
protected function setPersistentData($key, $value) {
|
103 |
+
if (!in_array($key, self::$kSupportedKeys)) {
|
104 |
+
self::errorLog('Unsupported key passed to setPersistentData.');
|
105 |
+
return;
|
106 |
+
}
|
107 |
+
|
108 |
+
$session_var_name = $this->constructSessionVariableName($key);
|
109 |
+
$_SESSION[$session_var_name] = $value;
|
110 |
+
}
|
111 |
+
|
112 |
+
protected function getPersistentData($key, $default = false) {
|
113 |
+
if (!in_array($key, self::$kSupportedKeys)) {
|
114 |
+
self::errorLog('Unsupported key passed to getPersistentData.');
|
115 |
+
return $default;
|
116 |
+
}
|
117 |
+
|
118 |
+
$session_var_name = $this->constructSessionVariableName($key);
|
119 |
+
return isset($_SESSION[$session_var_name]) ?
|
120 |
+
$_SESSION[$session_var_name] : $default;
|
121 |
+
}
|
122 |
+
|
123 |
+
protected function clearPersistentData($key) {
|
124 |
+
if (!in_array($key, self::$kSupportedKeys)) {
|
125 |
+
self::errorLog('Unsupported key passed to clearPersistentData.');
|
126 |
+
return;
|
127 |
+
}
|
128 |
+
|
129 |
+
$session_var_name = $this->constructSessionVariableName($key);
|
130 |
+
unset($_SESSION[$session_var_name]);
|
131 |
+
}
|
132 |
+
|
133 |
+
protected function clearAllPersistentData() {
|
134 |
+
foreach (self::$kSupportedKeys as $key) {
|
135 |
+
$this->clearPersistentData($key);
|
136 |
+
}
|
137 |
+
if ($this->sharedSessionID) {
|
138 |
+
$this->deleteSharedSessionCookie();
|
139 |
+
}
|
140 |
+
}
|
141 |
+
|
142 |
+
protected function deleteSharedSessionCookie() {
|
143 |
+
$cookie_name = $this->getSharedSessionCookieName();
|
144 |
+
unset($_COOKIE[$cookie_name]);
|
145 |
+
$base_domain = $this->getBaseDomain();
|
146 |
+
setcookie($cookie_name, '', 1, '/', '.'.$base_domain);
|
147 |
+
}
|
148 |
+
|
149 |
+
protected function getSharedSessionCookieName() {
|
150 |
+
return self::FBSS_COOKIE_NAME . '_' . $this->getAppId();
|
151 |
+
}
|
152 |
+
|
153 |
+
protected function constructSessionVariableName($key) {
|
154 |
+
$parts = array('fb', $this->getAppId(), $key);
|
155 |
+
if ($this->sharedSessionID) {
|
156 |
+
array_unshift($parts, $this->sharedSessionID);
|
157 |
+
}
|
158 |
+
return implode('_', $parts);
|
159 |
+
}
|
160 |
+
}
|
hybridauth/Hybrid/thirdparty/Facebook/fb_ca_chain_bundle.crt
ADDED
@@ -0,0 +1,3920 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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/GMBWsm2vLV7eJUYs66MmEDNuxUCAKGkq6
|
3571 |
+
ahq97BvIxYSazQ==
|
3572 |
+
-----END CERTIFICATE-----
|
3573 |
+
|
3574 |
+
TWCA Root Certification Authority
|
3575 |
+
=================================
|
3576 |
+
-----BEGIN CERTIFICATE-----
|
3577 |
+
MIIDezCCAmOgAwIBAgIBATANBgkqhkiG9w0BAQUFADBfMQswCQYDVQQGEwJUVzESMBAGA1UECgwJ
|
3578 |
+
VEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NBIFJvb3QgQ2VydGlmaWNh
|
3579 |
+
dGlvbiBBdXRob3JpdHkwHhcNMDgwODI4MDcyNDMzWhcNMzAxMjMxMTU1OTU5WjBfMQswCQYDVQQG
|
3580 |
+
EwJUVzESMBAGA1UECgwJVEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NB
|
3581 |
+
IFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK
|
3582 |
+
AoIBAQCwfnK4pAOU5qfeCTiRShFAh6d8WWQUe7UREN3+v9XAu1bihSX0NXIP+FPQQeFEAcK0HMMx
|
3583 |
+
QhZHhTMidrIKbw/lJVBPhYa+v5guEGcevhEFhgWQxFnQfHgQsIBct+HHK3XLfJ+utdGdIzdjp9xC
|
3584 |
+
oi2SBBtQwXu4PhvJVgSLL1KbralW6cH/ralYhzC2gfeXRfwZVzsrb+RH9JlF/h3x+JejiB03HFyP
|
3585 |
+
4HYlmlD4oFT/RJB2I9IyxsOrBr/8+7/zrX2SYgJbKdM1o5OaQ2RgXbL6Mv87BK9NQGr5x+PvI/1r
|
3586 |
+
y+UPizgN7gr8/g+YnzAx3WxSZfmLgb4i4RxYA7qRG4kHAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIB
|
3587 |
+
BjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqOFsmjd6LWvJPelSDGRjjCDWmujANBgkqhkiG
|
3588 |
+
9w0BAQUFAAOCAQEAPNV3PdrfibqHDAhUaiBQkr6wQT25JmSDCi/oQMCXKCeCMErJk/9q56YAf4lC
|
3589 |
+
mtYR5VPOL8zy2gXE/uJQxDqGfczafhAJO5I1KlOy/usrBdlsXebQ79NqZp4VKIV66IIArB6nCWlW
|
3590 |
+
QtNoURi+VJq/REG6Sb4gumlc7rh3zc5sH62Dlhh9DrUUOYTxKOkto557HnpyWoOzeW/vtPzQCqVY
|
3591 |
+
T0bf+215WfKEIlKuD8z7fDvnaspHYcN6+NOSBB+4IIThNlQWx0DeO4pz3N/GCUzf7Nr/1FNCocny
|
3592 |
+
Yh0igzyXxfkZYiesZSLX0zzG5Y6yU8xJzrww/nsOM5D77dIUkR8Hrw==
|
3593 |
+
-----END CERTIFICATE-----
|
3594 |
+
|
3595 |
+
Security Communication RootCA2
|
3596 |
+
==============================
|
3597 |
+
-----BEGIN CERTIFICATE-----
|
3598 |
+
MIIDdzCCAl+gAwIBAgIBADANBgkqhkiG9w0BAQsFADBdMQswCQYDVQQGEwJKUDElMCMGA1UEChMc
|
3599 |
+
U0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEnMCUGA1UECxMeU2VjdXJpdHkgQ29tbXVuaWNh
|
3600 |
+
dGlvbiBSb290Q0EyMB4XDTA5MDUyOTA1MDAzOVoXDTI5MDUyOTA1MDAzOVowXTELMAkGA1UEBhMC
|
3601 |
+
SlAxJTAjBgNVBAoTHFNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4xJzAlBgNVBAsTHlNlY3Vy
|
3602 |
+
aXR5IENvbW11bmljYXRpb24gUm9vdENBMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB
|
3603 |
+
ANAVOVKxUrO6xVmCxF1SrjpDZYBLx/KWvNs2l9amZIyoXvDjChz335c9S672XewhtUGrzbl+dp++
|
3604 |
+
+T42NKA7wfYxEUV0kz1XgMX5iZnK5atq1LXaQZAQwdbWQonCv/Q4EpVMVAX3NuRFg3sUZdbcDE3R
|
3605 |
+
3n4MqzvEFb46VqZab3ZpUql6ucjrappdUtAtCms1FgkQhNBqyjoGADdH5H5XTz+L62e4iKrFvlNV
|
3606 |
+
spHEfbmwhRkGeC7bYRr6hfVKkaHnFtWOojnflLhwHyg/i/xAXmODPIMqGplrz95Zajv8bxbXH/1K
|
3607 |
+
EOtOghY6rCcMU/Gt1SSwawNQwS08Ft1ENCcadfsCAwEAAaNCMEAwHQYDVR0OBBYEFAqFqXdlBZh8
|
3608 |
+
QIH4D5csOPEK7DzPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEB
|
3609 |
+
CwUAA4IBAQBMOqNErLlFsceTfsgLCkLfZOoc7llsCLqJX2rKSpWeeo8HxdpFcoJxDjrSzG+ntKEj
|
3610 |
+
u/Ykn8sX/oymzsLS28yN/HH8AynBbF0zX2S2ZTuJbxh2ePXcokgfGT+Ok+vx+hfuzU7jBBJV1uXk
|
3611 |
+
3fs+BXziHV7Gp7yXT2g69ekuCkO2r1dcYmh8t/2jioSgrGK+KwmHNPBqAbubKVY8/gA3zyNs8U6q
|
3612 |
+
tnRGEmyR7jTV7JqR50S+kDFy1UkC9gLl9B/rfNmWVan/7Ir5mUf/NVoCqgTLiluHcSmRvaS0eg29
|
3613 |
+
mvVXIwAHIRc/SjnRBUkLp7Y3gaVdjKozXoEofKd9J+sAro03
|
3614 |
+
-----END CERTIFICATE-----
|
3615 |
+
|
3616 |
+
EC-ACC
|
3617 |
+
======
|
3618 |
+
-----BEGIN CERTIFICATE-----
|
3619 |
+
MIIFVjCCBD6gAwIBAgIQ7is969Qh3hSoYqwE893EATANBgkqhkiG9w0BAQUFADCB8zELMAkGA1UE
|
3620 |
+
BhMCRVMxOzA5BgNVBAoTMkFnZW5jaWEgQ2F0YWxhbmEgZGUgQ2VydGlmaWNhY2lvIChOSUYgUS0w
|
3621 |
+
ODAxMTc2LUkpMSgwJgYDVQQLEx9TZXJ2ZWlzIFB1YmxpY3MgZGUgQ2VydGlmaWNhY2lvMTUwMwYD
|
3622 |
+
VQQLEyxWZWdldSBodHRwczovL3d3dy5jYXRjZXJ0Lm5ldC92ZXJhcnJlbCAoYykwMzE1MDMGA1UE
|
3623 |
+
CxMsSmVyYXJxdWlhIEVudGl0YXRzIGRlIENlcnRpZmljYWNpbyBDYXRhbGFuZXMxDzANBgNVBAMT
|
3624 |
+
BkVDLUFDQzAeFw0wMzAxMDcyMzAwMDBaFw0zMTAxMDcyMjU5NTlaMIHzMQswCQYDVQQGEwJFUzE7
|
3625 |
+
MDkGA1UEChMyQWdlbmNpYSBDYXRhbGFuYSBkZSBDZXJ0aWZpY2FjaW8gKE5JRiBRLTA4MDExNzYt
|
3626 |
+
SSkxKDAmBgNVBAsTH1NlcnZlaXMgUHVibGljcyBkZSBDZXJ0aWZpY2FjaW8xNTAzBgNVBAsTLFZl
|
3627 |
+
Z2V1IGh0dHBzOi8vd3d3LmNhdGNlcnQubmV0L3ZlcmFycmVsIChjKTAzMTUwMwYDVQQLEyxKZXJh
|
3628 |
+
cnF1aWEgRW50aXRhdHMgZGUgQ2VydGlmaWNhY2lvIENhdGFsYW5lczEPMA0GA1UEAxMGRUMtQUND
|
3629 |
+
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsyLHT+KXQpWIR4NA9h0X84NzJB5R85iK
|
3630 |
+
w5K4/0CQBXCHYMkAqbWUZRkiFRfCQ2xmRJoNBD45b6VLeqpjt4pEndljkYRm4CgPukLjbo73FCeT
|
3631 |
+
ae6RDqNfDrHrZqJyTxIThmV6PttPB/SnCWDaOkKZx7J/sxaVHMf5NLWUhdWZXqBIoH7nF2W4onW4
|
3632 |
+
HvPlQn2v7fOKSGRdghST2MDk/7NQcvJ29rNdQlB50JQ+awwAvthrDk4q7D7SzIKiGGUzE3eeml0a
|
3633 |
+
E9jD2z3Il3rucO2n5nzbcc8tlGLfbdb1OL4/pYUKGbio2Al1QnDE6u/LDsg0qBIimAy4E5S2S+zw
|
3634 |
+
0JDnJwIDAQABo4HjMIHgMB0GA1UdEQQWMBSBEmVjX2FjY0BjYXRjZXJ0Lm5ldDAPBgNVHRMBAf8E
|
3635 |
+
BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUoMOLRKo3pUW/l4Ba0fF4opvpXY0wfwYD
|
3636 |
+
VR0gBHgwdjB0BgsrBgEEAfV4AQMBCjBlMCwGCCsGAQUFBwIBFiBodHRwczovL3d3dy5jYXRjZXJ0
|
3637 |
+
Lm5ldC92ZXJhcnJlbDA1BggrBgEFBQcCAjApGidWZWdldSBodHRwczovL3d3dy5jYXRjZXJ0Lm5l
|
3638 |
+
dC92ZXJhcnJlbCAwDQYJKoZIhvcNAQEFBQADggEBAKBIW4IB9k1IuDlVNZyAelOZ1Vr/sXE7zDkJ
|
3639 |
+
lF7W2u++AVtd0x7Y/X1PzaBB4DSTv8vihpw3kpBWHNzrKQXlxJ7HNd+KDM3FIUPpqojlNcAZQmNa
|
3640 |
+
Al6kSBg6hW/cnbw/nZzBh7h6YQjpdwt/cKt63dmXLGQehb+8dJahw3oS7AwaboMMPOhyRp/7SNVe
|
3641 |
+
l+axofjk70YllJyJ22k4vuxcDlbHZVHlUIiIv0LVKz3l+bqeLrPK9HOSAgu+TGbrIP65y7WZf+a2
|
3642 |
+
E/rKS03Z7lNGBjvGTq2TWoF+bCpLagVFjPIhpDGQh2xlnJ2lYJU6Un/10asIbvPuW/mIPX64b24D
|
3643 |
+
5EI=
|
3644 |
+
-----END CERTIFICATE-----
|
3645 |
+
|
3646 |
+
Hellenic Academic and Research Institutions RootCA 2011
|
3647 |
+
=======================================================
|
3648 |
+
-----BEGIN CERTIFICATE-----
|
3649 |
+
MIIEMTCCAxmgAwIBAgIBADANBgkqhkiG9w0BAQUFADCBlTELMAkGA1UEBhMCR1IxRDBCBgNVBAoT
|
3650 |
+
O0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9y
|
3651 |
+
aXR5MUAwPgYDVQQDEzdIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25z
|
3652 |
+
IFJvb3RDQSAyMDExMB4XDTExMTIwNjEzNDk1MloXDTMxMTIwMTEzNDk1MlowgZUxCzAJBgNVBAYT
|
3653 |
+
AkdSMUQwQgYDVQQKEztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25z
|
3654 |
+
IENlcnQuIEF1dGhvcml0eTFAMD4GA1UEAxM3SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNo
|
3655 |
+
IEluc3RpdHV0aW9ucyBSb290Q0EgMjAxMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB
|
3656 |
+
AKlTAOMupvaO+mDYLZU++CwqVE7NuYRhlFhPjz2L5EPzdYmNUeTDN9KKiE15HrcS3UN4SoqS5tdI
|
3657 |
+
1Q+kOilENbgH9mgdVc04UfCMJDGFr4PJfel3r+0ae50X+bOdOFAPplp5kYCvN66m0zH7tSYJnTxa
|
3658 |
+
71HFK9+WXesyHgLacEnsbgzImjeN9/E2YEsmLIKe0HjzDQ9jpFEw4fkrJxIH2Oq9GGKYsFk3fb7u
|
3659 |
+
8yBRQlqD75O6aRXxYp2fmTmCobd0LovUxQt7L/DICto9eQqakxylKHJzkUOap9FNhYS5qXSPFEDH
|
3660 |
+
3N6sQWRstBmbAmNtJGSPRLIl6s5ddAxjMlyNh+UCAwEAAaOBiTCBhjAPBgNVHRMBAf8EBTADAQH/
|
3661 |
+
MAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQUppFC/RNhSiOeCKQp5dgTBCPuQSUwRwYDVR0eBEAwPqA8
|
3662 |
+
MAWCAy5ncjAFggMuZXUwBoIELmVkdTAGggQub3JnMAWBAy5ncjAFgQMuZXUwBoEELmVkdTAGgQQu
|
3663 |
+
b3JnMA0GCSqGSIb3DQEBBQUAA4IBAQAf73lB4XtuP7KMhjdCSk4cNx6NZrokgclPEg8hwAOXhiVt
|
3664 |
+
XdMiKahsog2p6z0GW5k6x8zDmjR/qw7IThzh+uTczQ2+vyT+bOdrwg3IBp5OjWEopmr95fZi6hg8
|
3665 |
+
TqBTnbI6nOulnJEWtk2C4AwFSKls9cz4y51JtPACpf1wA+2KIaWuE4ZJwzNzvoc7dIsXRSZMFpGD
|
3666 |
+
/md9zU1jZ/rzAxKWeAaNsWftjj++n08C9bMJL/NMh98qy5V8AcysNnq/onN694/BtZqhFLKPM58N
|
3667 |
+
7yLcZnuEvUUXBj08yrl3NI/K6s8/MT7jiOOASSXIl7WdmplNsDz4SgCbZN2fOUvRJ9e4
|
3668 |
+
-----END CERTIFICATE-----
|
3669 |
+
|
3670 |
+
Actalis Authentication Root CA
|
3671 |
+
==============================
|
3672 |
+
-----BEGIN CERTIFICATE-----
|
3673 |
+
MIIFuzCCA6OgAwIBAgIIVwoRl0LE48wwDQYJKoZIhvcNAQELBQAwazELMAkGA1UEBhMCSVQxDjAM
|
3674 |
+
BgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8wMzM1ODUyMDk2NzEnMCUGA1UE
|
3675 |
+
AwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290IENBMB4XDTExMDkyMjExMjIwMloXDTMwMDky
|
3676 |
+
MjExMjIwMlowazELMAkGA1UEBhMCSVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlz
|
3677 |
+
IFMucC5BLi8wMzM1ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290
|
3678 |
+
IENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAp8bEpSmkLO/lGMWwUKNvUTufClrJ
|
3679 |
+
wkg4CsIcoBh/kbWHuUA/3R1oHwiD1S0eiKD4j1aPbZkCkpAW1V8IbInX4ay8IMKx4INRimlNAJZa
|
3680 |
+
by/ARH6jDuSRzVju3PvHHkVH3Se5CAGfpiEd9UEtL0z9KK3giq0itFZljoZUj5NDKd45RnijMCO6
|
3681 |
+
zfB9E1fAXdKDa0hMxKufgFpbOr3JpyI/gCczWw63igxdBzcIy2zSekciRDXFzMwujt0q7bd9Zg1f
|
3682 |
+
YVEiVRvjRuPjPdA1YprbrxTIW6HMiRvhMCb8oJsfgadHHwTrozmSBp+Z07/T6k9QnBn+locePGX2
|
3683 |
+
oxgkg4YQ51Q+qDp2JE+BIcXjDwL4k5RHILv+1A7TaLndxHqEguNTVHnd25zS8gebLra8Pu2Fbe8l
|
3684 |
+
EfKXGkJh90qX6IuxEAf6ZYGyojnP9zz/GPvG8VqLWeICrHuS0E4UT1lF9gxeKF+w6D9Fz8+vm2/7
|
3685 |
+
hNN3WpVvrJSEnu68wEqPSpP4RCHiMUVhUE4Q2OM1fEwZtN4Fv6MGn8i1zeQf1xcGDXqVdFUNaBr8
|
3686 |
+
EBtiZJ1t4JWgw5QHVw0U5r0F+7if5t+L4sbnfpb2U8WANFAoWPASUHEXMLrmeGO89LKtmyuy/uE5
|
3687 |
+
jF66CyCU3nuDuP/jVo23Eek7jPKxwV2dpAtMK9myGPW1n0sCAwEAAaNjMGEwHQYDVR0OBBYEFFLY
|
3688 |
+
iDrIn3hm7YnzezhwlMkCAjbQMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUUtiIOsifeGbt
|
3689 |
+
ifN7OHCUyQICNtAwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4ICAQALe3KHwGCmSUyI
|
3690 |
+
WOYdiPcUZEim2FgKDk8TNd81HdTtBjHIgT5q1d07GjLukD0R0i70jsNjLiNmsGe+b7bAEzlgqqI0
|
3691 |
+
JZN1Ut6nna0Oh4lScWoWPBkdg/iaKWW+9D+a2fDzWochcYBNy+A4mz+7+uAwTc+G02UQGRjRlwKx
|
3692 |
+
K3JCaKygvU5a2hi/a5iB0P2avl4VSM0RFbnAKVy06Ij3Pjaut2L9HmLecHgQHEhb2rykOLpn7VU+
|
3693 |
+
Xlff1ANATIGk0k9jpwlCCRT8AKnCgHNPLsBA2RF7SOp6AsDT6ygBJlh0wcBzIm2Tlf05fbsq4/aC
|
3694 |
+
4yyXX04fkZT6/iyj2HYauE2yOE+b+h1IYHkm4vP9qdCa6HCPSXrW5b0KDtst842/6+OkfcvHlXHo
|
3695 |
+
2qN8xcL4dJIEG4aspCJTQLas/kx2z/uUMsA1n3Y/buWQbqCmJqK4LL7RK4X9p2jIugErsWx0Hbhz
|
3696 |
+
lefut8cl8ABMALJ+tguLHPPAUJ4lueAI3jZm/zel0btUZCzJJ7VLkn5l/9Mt4blOvH+kQSGQQXem
|
3697 |
+
OR/qnuOf0GZvBeyqdn6/axag67XH/JJULysRJyU3eExRarDzzFhdFPFqSBX/wge2sY0PjlxQRrM9
|
3698 |
+
vwGYT7JZVEc+NHt4bVaTLnPqZih4zR0Uv6CPLy64Lo7yFIrM6bV8+2ydDKXhlg==
|
3699 |
+
-----END CERTIFICATE-----
|
3700 |
+
|
3701 |
+
Trustis FPS Root CA
|
3702 |
+
===================
|
3703 |
+
-----BEGIN CERTIFICATE-----
|
3704 |
+
MIIDZzCCAk+gAwIBAgIQGx+ttiD5JNM2a/fH8YygWTANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQG
|
3705 |
+
EwJHQjEYMBYGA1UEChMPVHJ1c3RpcyBMaW1pdGVkMRwwGgYDVQQLExNUcnVzdGlzIEZQUyBSb290
|
3706 |
+
IENBMB4XDTAzMTIyMzEyMTQwNloXDTI0MDEyMTExMzY1NFowRTELMAkGA1UEBhMCR0IxGDAWBgNV
|
3707 |
+
BAoTD1RydXN0aXMgTGltaXRlZDEcMBoGA1UECxMTVHJ1c3RpcyBGUFMgUm9vdCBDQTCCASIwDQYJ
|
3708 |
+
KoZIhvcNAQEBBQADggEPADCCAQoCggEBAMVQe547NdDfxIzNjpvto8A2mfRC6qc+gIMPpqdZh8mQ
|
3709 |
+
RUN+AOqGeSoDvT03mYlmt+WKVoaTnGhLaASMk5MCPjDSNzoiYYkchU59j9WvezX2fihHiTHcDnlk
|
3710 |
+
H5nSW7r+f2C/revnPDgpai/lkQtV/+xvWNUtyd5MZnGPDNcE2gfmHhjjvSkCqPoc4Vu5g6hBSLwa
|
3711 |
+
cY3nYuUtsuvffM/bq1rKMfFMIvMFE/eC+XN5DL7XSxzA0RU8k0Fk0ea+IxciAIleH2ulrG6nS4zt
|
3712 |
+
o3Lmr2NNL4XSFDWaLk6M6jKYKIahkQlBOrTh4/L68MkKokHdqeMDx4gVOxzUGpTXn2RZEm0CAwEA
|
3713 |
+
AaNTMFEwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBS6+nEleYtXQSUhhgtx67JkDoshZzAd
|
3714 |
+
BgNVHQ4EFgQUuvpxJXmLV0ElIYYLceuyZA6LIWcwDQYJKoZIhvcNAQEFBQADggEBAH5Y//01GX2c
|
3715 |
+
GE+esCu8jowU/yyg2kdbw++BLa8F6nRIW/M+TgfHbcWzk88iNVy2P3UnXwmWzaD+vkAMXBJV+JOC
|
3716 |
+
yinpXj9WV4s4NvdFGkwozZ5BuO1WTISkQMi4sKUraXAEasP41BIy+Q7DsdwyhEQsb8tGD+pmQQ9P
|
3717 |
+
8Vilpg0ND2HepZ5dfWWhPBfnqFVO76DH7cZEf1T1o+CP8HxVIo8ptoGj4W1OLBuAZ+ytIJ8MYmHV
|
3718 |
+
l/9D7S3B2l0pKoU/rGXuhg8FjZBf3+6f9L/uHfuY5H+QK4R4EA5sSVPvFVtlRkpdr7r7OnIdzfYl
|
3719 |
+
iB6XzCGcKQENZetX2fNXlrtIzYE=
|
3720 |
+
-----END CERTIFICATE-----
|
3721 |
+
|
3722 |
+
StartCom Certification Authority
|
3723 |
+
================================
|
3724 |
+
-----BEGIN CERTIFICATE-----
|
3725 |
+
MIIHhzCCBW+gAwIBAgIBLTANBgkqhkiG9w0BAQsFADB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMN
|
3726 |
+
U3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmlu
|
3727 |
+
ZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0
|
3728 |
+
NjM3WhcNMzYwOTE3MTk0NjM2WjB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRk
|
3729 |
+
LjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMg
|
3730 |
+
U3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw
|
3731 |
+
ggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZkpMyONvg45iPwbm2xPN1y
|
3732 |
+
o4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rfOQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/
|
3733 |
+
Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/CJi/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/d
|
3734 |
+
eMotHweXMAEtcnn6RtYTKqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt
|
3735 |
+
2PZE4XNiHzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMMAv+Z
|
3736 |
+
6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w+2OqqGwaVLRcJXrJ
|
3737 |
+
osmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/
|
3738 |
+
untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVc
|
3739 |
+
UjyJthkqcwEKDwOzEmDyei+B26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT
|
3740 |
+
37uMdBNSSwIDAQABo4ICEDCCAgwwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYD
|
3741 |
+
VR0OBBYEFE4L7xqkQFulF2mHMMo0aEPQQa7yMB8GA1UdIwQYMBaAFE4L7xqkQFulF2mHMMo0aEPQ
|
3742 |
+
Qa7yMIIBWgYDVR0gBIIBUTCCAU0wggFJBgsrBgEEAYG1NwEBATCCATgwLgYIKwYBBQUHAgEWImh0
|
3743 |
+
dHA6Ly93d3cuc3RhcnRzc2wuY29tL3BvbGljeS5wZGYwNAYIKwYBBQUHAgEWKGh0dHA6Ly93d3cu
|
3744 |
+
c3RhcnRzc2wuY29tL2ludGVybWVkaWF0ZS5wZGYwgc8GCCsGAQUFBwICMIHCMCcWIFN0YXJ0IENv
|
3745 |
+
bW1lcmNpYWwgKFN0YXJ0Q29tKSBMdGQuMAMCAQEagZZMaW1pdGVkIExpYWJpbGl0eSwgcmVhZCB0
|
3746 |
+
aGUgc2VjdGlvbiAqTGVnYWwgTGltaXRhdGlvbnMqIG9mIHRoZSBTdGFydENvbSBDZXJ0aWZpY2F0
|
3747 |
+
aW9uIEF1dGhvcml0eSBQb2xpY3kgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuc3RhcnRzc2wuY29t
|
3748 |
+
L3BvbGljeS5wZGYwEQYJYIZIAYb4QgEBBAQDAgAHMDgGCWCGSAGG+EIBDQQrFilTdGFydENvbSBG
|
3749 |
+
cmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTANBgkqhkiG9w0BAQsFAAOCAgEAjo/n3JR5
|
3750 |
+
fPGFf59Jb2vKXfuM/gTFwWLRfUKKvFO3lANmMD+x5wqnUCBVJX92ehQN6wQOQOY+2IirByeDqXWm
|
3751 |
+
N3PH/UvSTa0XQMhGvjt/UfzDtgUx3M2FIk5xt/JxXrAaxrqTi3iSSoX4eA+D/i+tLPfkpLst0OcN
|
3752 |
+
Org+zvZ49q5HJMqjNTbOx8aHmNrs++myziebiMMEofYLWWivydsQD032ZGNcpRJvkrKTlMeIFw6T
|
3753 |
+
tn5ii5B/q06f/ON1FE8qMt9bDeD1e5MNq6HPh+GlBEXoPBKlCcWw0bdT82AUuoVpaiF8H3VhFyAX
|
3754 |
+
e2w7QSlc4axa0c2Mm+tgHRns9+Ww2vl5GKVFP0lDV9LdJNUso/2RjSe15esUBppMeyG7Oq0wBhjA
|
3755 |
+
2MFrLH9ZXF2RsXAiV+uKa0hK1Q8p7MZAwC+ITGgBF3f0JBlPvfrhsiAhS90a2Cl9qrjeVOwhVYBs
|
3756 |
+
HvUwyKMQ5bLmKhQxw4UtjJixhlpPiVktucf3HMiKf8CdBUrmQk9io20ppB+Fq9vlgcitKj1MXVuE
|
3757 |
+
JnHEhV5xJMqlG2zYYdMa4FTbzrqpMrUi9nNBCV24F10OD5mQ1kfabwo6YigUZ4LZ8dCAWZvLMdib
|
3758 |
+
D4x3TrVoivJs9iQOLWxwxXPR3hTQcY+203sC9uO41Alua551hDnmfyWl8kgAwKQB2j8=
|
3759 |
+
-----END CERTIFICATE-----
|
3760 |
+
|
3761 |
+
StartCom Certification Authority G2
|
3762 |
+
===================================
|
3763 |
+
-----BEGIN CERTIFICATE-----
|
3764 |
+
MIIFYzCCA0ugAwIBAgIBOzANBgkqhkiG9w0BAQsFADBTMQswCQYDVQQGEwJJTDEWMBQGA1UEChMN
|
3765 |
+
U3RhcnRDb20gTHRkLjEsMCoGA1UEAxMjU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg
|
3766 |
+
RzIwHhcNMTAwMTAxMDEwMDAxWhcNMzkxMjMxMjM1OTAxWjBTMQswCQYDVQQGEwJJTDEWMBQGA1UE
|
3767 |
+
ChMNU3RhcnRDb20gTHRkLjEsMCoGA1UEAxMjU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3Jp
|
3768 |
+
dHkgRzIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2iTZbB7cgNr2Cu+EWIAOVeq8O
|
3769 |
+
o1XJJZlKxdBWQYeQTSFgpBSHO839sj60ZwNq7eEPS8CRhXBF4EKe3ikj1AENoBB5uNsDvfOpL9HG
|
3770 |
+
4A/LnooUCri99lZi8cVytjIl2bLzvWXFDSxu1ZJvGIsAQRSCb0AgJnooD/Uefyf3lLE3PbfHkffi
|
3771 |
+
Aez9lInhzG7TNtYKGXmu1zSCZf98Qru23QumNK9LYP5/Q0kGi4xDuFby2X8hQxfqp0iVAXV16iul
|
3772 |
+
Q5XqFYSdCI0mblWbq9zSOdIxHWDirMxWRST1HFSr7obdljKF+ExP6JV2tgXdNiNnvP8V4so75qbs
|
3773 |
+
O+wmETRIjfaAKxojAuuKHDp2KntWFhxyKrOq42ClAJ8Em+JvHhRYW6Vsi1g8w7pOOlz34ZYrPu8H
|
3774 |
+
vKTlXcxNnw3h3Kq74W4a7I/htkxNeXJdFzULHdfBR9qWJODQcqhaX2YtENwvKhOuJv4KHBnM0D4L
|
3775 |
+
nMgJLvlblnpHnOl68wVQdJVznjAJ85eCXuaPOQgeWeU1FEIT/wCc976qUM/iUUjXuG+v+E5+M5iS
|
3776 |
+
FGI6dWPPe/regjupuznixL0sAA7IF6wT700ljtizkC+p2il9Ha90OrInwMEePnWjFqmveiJdnxMa
|
3777 |
+
z6eg6+OGCtP95paV1yPIN93EfKo2rJgaErHgTuixO/XWb/Ew1wIDAQABo0IwQDAPBgNVHRMBAf8E
|
3778 |
+
BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUS8W0QGutHLOlHGVuRjaJhwUMDrYwDQYJ
|
3779 |
+
KoZIhvcNAQELBQADggIBAHNXPyzVlTJ+N9uWkusZXn5T50HsEbZH77Xe7XRcxfGOSeD8bpkTzZ+K
|
3780 |
+
2s06Ctg6Wgk/XzTQLwPSZh0avZyQN8gMjgdalEVGKua+etqhqaRpEpKwfTbURIfXUfEpY9Z1zRbk
|
3781 |
+
J4kd+MIySP3bmdCPX1R0zKxnNBFi2QwKN4fRoxdIjtIXHfbX/dtl6/2o1PXWT6RbdejF0mCy2wl+
|
3782 |
+
JYt7ulKSnj7oxXehPOBKc2thz4bcQ///If4jXSRK9dNtD2IEBVeC2m6kMyV5Sy5UGYvMLD0w6dEG
|
3783 |
+
/+gyRr61M3Z3qAFdlsHB1b6uJcDJHgoJIIihDsnzb02CVAAgp9KP5DlUFy6NHrgbuxu9mk47EDTc
|
3784 |
+
nIhT76IxW1hPkWLIwpqazRVdOKnWvvgTtZ8SafJQYqz7Fzf07rh1Z2AQ+4NQ+US1dZxAF7L+/Xld
|
3785 |
+
blhYXzD8AK6vM8EOTmy6p6ahfzLbOOCxchcKK5HsamMm7YnUeMx0HgX4a/6ManY5Ka5lIxKVCCIc
|
3786 |
+
l85bBu4M4ru8H0ST9tg4RQUh7eStqxK2A6RCLi3ECToDZ2mEmuFZkIoohdVddLHRDiBYmxOlsGOm
|
3787 |
+
7XtH/UVVMKTumtTm4ofvmMkyghEpIrwACjFeLQ/Ajulrso8uBtjRkcfGEvRM/TAXw8HaOFvjqerm
|
3788 |
+
obp573PYtlNXLfbQ4ddI
|
3789 |
+
-----END CERTIFICATE-----
|
3790 |
+
|
3791 |
+
Buypass Class 2 Root CA
|
3792 |
+
=======================
|
3793 |
+
-----BEGIN CERTIFICATE-----
|
3794 |
+
MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU
|
3795 |
+
QnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3MgQ2xhc3MgMiBSb290IENBMB4X
|
3796 |
+
DTEwMTAyNjA4MzgwM1oXDTQwMTAyNjA4MzgwM1owTjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1
|
3797 |
+
eXBhc3MgQVMtOTgzMTYzMzI3MSAwHgYDVQQDDBdCdXlwYXNzIENsYXNzIDIgUm9vdCBDQTCCAiIw
|
3798 |
+
DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANfHXvfBB9R3+0Mh9PT1aeTuMgHbo4Yf5FkNuud1
|
3799 |
+
g1Lr6hxhFUi7HQfKjK6w3Jad6sNgkoaCKHOcVgb/S2TwDCo3SbXlzwx87vFKu3MwZfPVL4O2fuPn
|
3800 |
+
9Z6rYPnT8Z2SdIrkHJasW4DptfQxh6NR/Md+oW+OU3fUl8FVM5I+GC911K2GScuVr1QGbNgGE41b
|
3801 |
+
/+EmGVnAJLqBcXmQRFBoJJRfuLMR8SlBYaNByyM21cHxMlAQTn/0hpPshNOOvEu/XAFOBz3cFIqU
|
3802 |
+
CqTqc/sLUegTBxj6DvEr0VQVfTzh97QZQmdiXnfgolXsttlpF9U6r0TtSsWe5HonfOV116rLJeff
|
3803 |
+
awrbD02TTqigzXsu8lkBarcNuAeBfos4GzjmCleZPe4h6KP1DBbdi+w0jpwqHAAVF41og9JwnxgI
|
3804 |
+
zRFo1clrUs3ERo/ctfPYV3Me6ZQ5BL/T3jjetFPsaRyifsSP5BtwrfKi+fv3FmRmaZ9JUaLiFRhn
|
3805 |
+
Bkp/1Wy1TbMz4GHrXb7pmA8y1x1LPC5aAVKRCfLf6o3YBkBjqhHk/sM3nhRSP/TizPJhk9H9Z2vX
|
3806 |
+
Uq6/aKtAQ6BXNVN48FP4YUIHZMbXb5tMOA1jrGKvNouicwoN9SG9dKpN6nIDSdvHXx1iY8f93ZHs
|
3807 |
+
M+71bbRuMGjeyNYmsHVee7QHIJihdjK4TWxPAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYD
|
3808 |
+
VR0OBBYEFMmAd+BikoL1RpzzuvdMw964o605MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsF
|
3809 |
+
AAOCAgEAU18h9bqwOlI5LJKwbADJ784g7wbylp7ppHR/ehb8t/W2+xUbP6umwHJdELFx7rxP462s
|
3810 |
+
A20ucS6vxOOto70MEae0/0qyexAQH6dXQbLArvQsWdZHEIjzIVEpMMpghq9Gqx3tOluwlN5E40EI
|
3811 |
+
osHsHdb9T7bWR9AUC8rmyrV7d35BH16Dx7aMOZawP5aBQW9gkOLo+fsicdl9sz1Gv7SEr5AcD48S
|
3812 |
+
aq/v7h56rgJKihcrdv6sVIkkLE8/trKnToyokZf7KcZ7XC25y2a2t6hbElGFtQl+Ynhw/qlqYLYd
|
3813 |
+
DnkM/crqJIByw5c/8nerQyIKx+u2DISCLIBrQYoIwOula9+ZEsuK1V6ADJHgJgg2SMX6OBE1/yWD
|
3814 |
+
LfJ6v9r9jv6ly0UsH8SIU653DtmadsWOLB2jutXsMq7Aqqz30XpN69QH4kj3Io6wpJ9qzo6ysmD0
|
3815 |
+
oyLQI+uUWnpp3Q+/QFesa1lQ2aOZ4W7+jQF5JyMV3pKdewlNWudLSDBaGOYKbeaP4NK75t98biGC
|
3816 |
+
wWg5TbSYWGZizEqQXsP6JwSxeRV0mcy+rSDeJmAc61ZRpqPq5KM/p/9h3PFaTWwyI0PurKju7koS
|
3817 |
+
CTxdccK+efrCh2gdC/1cacwG0Jp9VJkqyTkaGa9LKkPzY11aWOIv4x3kqdbQCtCev9eBCfHJxyYN
|
3818 |
+
rJgWVqA=
|
3819 |
+
-----END CERTIFICATE-----
|
3820 |
+
|
3821 |
+
Buypass Class 3 Root CA
|
3822 |
+
=======================
|
3823 |
+
-----BEGIN CERTIFICATE-----
|
3824 |
+
MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU
|
3825 |
+
QnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3MgQ2xhc3MgMyBSb290IENBMB4X
|
3826 |
+
DTEwMTAyNjA4Mjg1OFoXDTQwMTAyNjA4Mjg1OFowTjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1
|
3827 |
+
eXBhc3MgQVMtOTgzMTYzMzI3MSAwHgYDVQQDDBdCdXlwYXNzIENsYXNzIDMgUm9vdCBDQTCCAiIw
|
3828 |
+
DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAKXaCpUWUOOV8l6ddjEGMnqb8RB2uACatVI2zSRH
|
3829 |
+
sJ8YZLya9vrVediQYkwiL944PdbgqOkcLNt4EemOaFEVcsfzM4fkoF0LXOBXByow9c3EN3coTRiR
|
3830 |
+
5r/VUv1xLXA+58bEiuPwKAv0dpihi4dVsjoT/Lc+JzeOIuOoTyrvYLs9tznDDgFHmV0ST9tD+leh
|
3831 |
+
7fmdvhFHJlsTmKtdFoqwNxxXnUX/iJY2v7vKB3tvh2PX0DJq1l1sDPGzbjniazEuOQAnFN44wOwZ
|
3832 |
+
ZoYS6J1yFhNkUsepNxz9gjDthBgd9K5c/3ATAOux9TN6S9ZV+AWNS2mw9bMoNlwUxFFzTWsL8TQH
|
3833 |
+
2xc519woe2v1n/MuwU8XKhDzzMro6/1rqy6any2CbgTUUgGTLT2G/H783+9CHaZr77kgxve9oKeV
|
3834 |
+
/afmiSTYzIw0bOIjL9kSGiG5VZFvC5F5GQytQIgLcOJ60g7YaEi7ghM5EFjp2CoHxhLbWNvSO1UQ
|
3835 |
+
RwUVZ2J+GGOmRj8JDlQyXr8NYnon74Do29lLBlo3WiXQCBJ31G8JUJc9yB3D34xFMFbG02SrZvPA
|
3836 |
+
Xpacw8Tvw3xrizp5f7NJzz3iiZ+gMEuFuZyUJHmPfWupRWgPK9Dx2hzLabjKSWJtyNBjYt1gD1iq
|
3837 |
+
j6G8BaVmos8bdrKEZLFMOVLAMLrwjEsCsLa3AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYD
|
3838 |
+
VR0OBBYEFEe4zf/lb+74suwvTg75JbCOPGvDMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsF
|
3839 |
+
AAOCAgEAACAjQTUEkMJAYmDv4jVM1z+s4jSQuKFvdvoWFqRINyzpkMLyPPgKn9iB5btb2iUspKdV
|
3840 |
+
cSQy9sgL8rxq+JOssgfCX5/bzMiKqr5qb+FJEMwx14C7u8jYog5kV+qi9cKpMRXSIGrs/CIBKM+G
|
3841 |
+
uIAeqcwRpTzyFrNHnfzSgCHEy9BHcEGhyoMZCCxt8l13nIoUE9Q2HJLw5QY33KbmkJs4j1xrG0aG
|
3842 |
+
Q0JfPgEHU1RdZX33inOhmlRaHylDFCfChQ+1iHsaO5S3HWCntZznKWlXWpuTekMwGwPXYshApqr8
|
3843 |
+
ZORK15FTAaggiG6cX0S5y2CBNOxv033aSF/rtJC8LakcC6wc1aJoIIAE1vyxjy+7SjENSoYc6+I2
|
3844 |
+
KSb12tjE8nVhz36udmNKekBlk4f4HoCMhuWG1o8O/FMsYOgWYRqiPkN7zTlgVGr18okmAWiDSKIz
|
3845 |
+
6MkEkbIRNBE+6tBDGR8Dk5AM/1E9V/RBbuHLoL7ryWPNbczk+DaqaJ3tvV2XcEQNtg413OEMXbug
|
3846 |
+
UZTLfhbrES+jkkXITHHZvMmZUldGL1DPvTVp9D0VzgalLA8+9oG6lLvDu79leNKGef9JOxqDDPDe
|
3847 |
+
eOzI8k1MGt6CKfjBWtrt7uYnXuhF0J0cUahoq0Tj0Itq4/g7u9xN12TyUb7mqqta6THuBrxzvxNi
|
3848 |
+
Cp/HuZc=
|
3849 |
+
-----END CERTIFICATE-----
|
3850 |
+
|
3851 |
+
TÜRKTRUST Elektronik Sertifika Hizmet Sağlayıcısı
|
3852 |
+
======================================================
|
3853 |
+
-----BEGIN CERTIFICATE-----
|
3854 |
+
MIIEPTCCAyWgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBvzE/MD0GA1UEAww2VMOcUktUUlVTVCBF
|
3855 |
+
bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGEwJUUjEP
|
3856 |
+
MA0GA1UEBwwGQW5rYXJhMV4wXAYDVQQKDFVUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUg
|
3857 |
+
QmlsacWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLiAoYykgQXJhbMSxayAyMDA3MB4X
|
3858 |
+
DTA3MTIyNTE4MzcxOVoXDTE3MTIyMjE4MzcxOVowgb8xPzA9BgNVBAMMNlTDnFJLVFJVU1QgRWxl
|
3859 |
+
a3Ryb25payBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsTELMAkGA1UEBhMCVFIxDzAN
|
3860 |
+
BgNVBAcMBkFua2FyYTFeMFwGA1UECgxVVMOcUktUUlVTVCBCaWxnaSDEsGxldGnFn2ltIHZlIEJp
|
3861 |
+
bGnFn2ltIEfDvHZlbmxpxJ9pIEhpem1ldGxlcmkgQS7Fni4gKGMpIEFyYWzEsWsgMjAwNzCCASIw
|
3862 |
+
DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKu3PgqMyKVYFeaK7yc9SrToJdPNM8Ig3BnuiD9N
|
3863 |
+
YvDdE3ePYakqtdTyuTFYKTsvP2qcb3N2Je40IIDu6rfwxArNK4aUyeNgsURSsloptJGXg9i3phQv
|
3864 |
+
KUmi8wUG+7RP2qFsmmaf8EMJyupyj+sA1zU511YXRxcw9L6/P8JorzZAwan0qafoEGsIiveGHtya
|
3865 |
+
KhUG9qPw9ODHFNRRf8+0222vR5YXm3dx2KdxnSQM9pQ/hTEST7ruToK4uT6PIzdezKKqdfcYbwnT
|
3866 |
+
rqdUKDT74eA7YH2gvnmJhsifLfkKS8RQouf9eRbHegsYz85M733WB2+Y8a+xwXrXgTW4qhe04MsC
|
3867 |
+
AwEAAaNCMEAwHQYDVR0OBBYEFCnFkKslrxHkYb+j/4hhkeYO/pyBMA4GA1UdDwEB/wQEAwIBBjAP
|
3868 |
+
BgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBBQUAA4IBAQAQDdr4Ouwo0RSVgrESLFF6QSU2TJ/s
|
3869 |
+
Px+EnWVUXKgWAkD6bho3hO9ynYYKVZ1WKKxmLNA6VpM0ByWtCLCPyA8JWcqdmBzlVPi5RX9ql2+I
|
3870 |
+
aE1KBiY3iAIOtsbWcpnOa3faYjGkVh+uX4132l32iPwa2Z61gfAyuOOI0JzzaqC5mxRZNTZPz/OO
|
3871 |
+
Xl0XrRWV2N2y1RVuAE6zS89mlOTgzbUF2mNXi+WzqtvALhyQRNsaXRik7r4EW5nVcV9VZWRi1aKb
|
3872 |
+
BFmGyGJ353yCRWo9F7/snXUMrqNvWtMvmDb08PUZqxFdyKbjKlhqQgnDvZImZjINXQhVdP+MmNAK
|
3873 |
+
poRq0Tl9
|
3874 |
+
-----END CERTIFICATE-----
|
3875 |
+
|
3876 |
+
T-TeleSec GlobalRoot Class 3
|
3877 |
+
============================
|
3878 |
+
-----BEGIN CERTIFICATE-----
|
3879 |
+
MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoM
|
3880 |
+
IlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBU
|
3881 |
+
cnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwHhcNMDgx
|
3882 |
+
MDAxMTAyOTU2WhcNMzMxMDAxMjM1OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lz
|
3883 |
+
dGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBD
|
3884 |
+
ZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwggEiMA0GCSqGSIb3
|
3885 |
+
DQEBAQUAA4IBDwAwggEKAoIBAQC9dZPwYiJvJK7genasfb3ZJNW4t/zN8ELg63iIVl6bmlQdTQyK
|
3886 |
+
9tPPcPRStdiTBONGhnFBSivwKixVA9ZIw+A5OO3yXDw/RLyTPWGrTs0NvvAgJ1gORH8EGoel15YU
|
3887 |
+
NpDQSXuhdfsaa3Ox+M6pCSzyU9XDFES4hqX2iys52qMzVNn6chr3IhUciJFrf2blw2qAsCTz34ZF
|
3888 |
+
iP0Zf3WHHx+xGwpzJFu5ZeAsVMhg02YXP+HMVDNzkQI6pn97djmiH5a2OK61yJN0HZ65tOVgnS9W
|
3889 |
+
0eDrXltMEnAMbEQgqxHY9Bn20pxSN+f6tsIxO0rUFJmtxxr1XV/6B7h8DR/Wgx6zAgMBAAGjQjBA
|
3890 |
+
MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS1A/d2O2GCahKqGFPr
|
3891 |
+
AyGUv/7OyjANBgkqhkiG9w0BAQsFAAOCAQEAVj3vlNW92nOyWL6ukK2YJ5f+AbGwUgC4TeQbIXQb
|
3892 |
+
fsDuXmkqJa9c1h3a0nnJ85cp4IaH3gRZD/FZ1GSFS5mvJQQeyUapl96Cshtwn5z2r3Ex3XsFpSzT
|
3893 |
+
ucpH9sry9uetuUg/vBa3wW306gmv7PO15wWeph6KU1HWk4HMdJP2udqmJQV0eVp+QD6CSyYRMG7h
|
3894 |
+
P0HHRwA11fXT91Q+gT3aSWqas+8QPebrb9HIIkfLzM8BMZLZGOMivgkeGj5asuRrDFR6fUNOuIml
|
3895 |
+
e9eiPZaGzPImNC1qkp2aGtAw4l1OBLBfiyB+d8E9lYLRRpo7PHi4b6HQDWSieB4pTpPDpFQUWw==
|
3896 |
+
-----END CERTIFICATE-----
|
3897 |
+
|
3898 |
+
EE Certification Centre Root CA
|
3899 |
+
===============================
|
3900 |
+
-----BEGIN CERTIFICATE-----
|
3901 |
+
MIIEAzCCAuugAwIBAgIQVID5oHPtPwBMyonY43HmSjANBgkqhkiG9w0BAQUFADB1MQswCQYDVQQG
|
3902 |
+
EwJFRTEiMCAGA1UECgwZQVMgU2VydGlmaXRzZWVyaW1pc2tlc2t1czEoMCYGA1UEAwwfRUUgQ2Vy
|
3903 |
+
dGlmaWNhdGlvbiBDZW50cmUgUm9vdCBDQTEYMBYGCSqGSIb3DQEJARYJcGtpQHNrLmVlMCIYDzIw
|
3904 |
+
MTAxMDMwMTAxMDMwWhgPMjAzMDEyMTcyMzU5NTlaMHUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKDBlB
|
3905 |
+
UyBTZXJ0aWZpdHNlZXJpbWlza2Vza3VzMSgwJgYDVQQDDB9FRSBDZXJ0aWZpY2F0aW9uIENlbnRy
|
3906 |
+
ZSBSb290IENBMRgwFgYJKoZIhvcNAQkBFglwa2lAc2suZWUwggEiMA0GCSqGSIb3DQEBAQUAA4IB
|
3907 |
+
DwAwggEKAoIBAQDIIMDs4MVLqwd4lfNE7vsLDP90jmG7sWLqI9iroWUyeuuOF0+W2Ap7kaJjbMeM
|
3908 |
+
TC55v6kF/GlclY1i+blw7cNRfdCT5mzrMEvhvH2/UpvObntl8jixwKIy72KyaOBhU8E2lf/slLo2
|
3909 |
+
rpwcpzIP5Xy0xm90/XsY6KxX7QYgSzIwWFv9zajmofxwvI6Sc9uXp3whrj3B9UiHbCe9nyV0gVWw
|
3910 |
+
93X2PaRka9ZP585ArQ/dMtO8ihJTmMmJ+xAdTX7Nfh9WDSFwhfYggx/2uh8Ej+p3iDXE/+pOoYtN
|
3911 |
+
P2MbRMNE1CV2yreN1x5KZmTNXMWcg+HCCIia7E6j8T4cLNlsHaFLAgMBAAGjgYowgYcwDwYDVR0T
|
3912 |
+
AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBLyWj7qVhy/zQas8fElyalL1BSZ
|
3913 |
+
MEUGA1UdJQQ+MDwGCCsGAQUFBwMCBggrBgEFBQcDAQYIKwYBBQUHAwMGCCsGAQUFBwMEBggrBgEF
|
3914 |
+
BQcDCAYIKwYBBQUHAwkwDQYJKoZIhvcNAQEFBQADggEBAHv25MANqhlHt01Xo/6tu7Fq1Q+e2+Rj
|
3915 |
+
xY6hUFaTlrg4wCQiZrxTFGGVv9DHKpY5P30osxBAIWrEr7BSdxjhlthWXePdNl4dp1BUoMUq5KqM
|
3916 |
+
lIpPnTX/dqQGE5Gion0ARD9V04I8GtVbvFZMIi5GQ4okQC3zErg7cBqklrkar4dBGmoYDQZPxz5u
|
3917 |
+
uSlNDUmJEYcyW+ZLBMjkXOZ0c5RdFpgTlf7727FE5TpwrDdr5rMzcijJs1eg9gIWiAYLtqZLICjU
|
3918 |
+
3j2LrTcFU3T+bsy8QxdxXvnFzBqpYe73dgzzcvRyrc9yAjYHR8/vGVCJYMzpJJUPwssd8m92kMfM
|
3919 |
+
dcGWxZ0=
|
3920 |
+
-----END CERTIFICATE-----
|
hybridauth/Hybrid/thirdparty/LastFM/LastFM.php
ADDED
@@ -0,0 +1,381 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
// https://raw.github.com/fsobczak/PHP-LastFm-Minimal-API/master/LastFM.php
|
3 |
+
// modified
|
4 |
+
|
5 |
+
/*
|
6 |
+
* This is minimal PHP library - it implements all the necessary
|
7 |
+
* stuff, and ONLY that.
|
8 |
+
*
|
9 |
+
* Implemented:
|
10 |
+
* - authentication flow
|
11 |
+
* - api calls wrapper
|
12 |
+
* - error wrapper
|
13 |
+
*/
|
14 |
+
|
15 |
+
/**
|
16 |
+
* Thrown when an API call returns an exception.
|
17 |
+
*
|
18 |
+
* @author Filip Sobczak <f@digitalinvaders.pl>
|
19 |
+
*/
|
20 |
+
class LastFMException extends Exception {
|
21 |
+
|
22 |
+
/**
|
23 |
+
* The result from the API server that represents the exception information.
|
24 |
+
*/
|
25 |
+
protected $result;
|
26 |
+
|
27 |
+
/**
|
28 |
+
* Make a new API Exception with the given result.
|
29 |
+
*
|
30 |
+
* @param Array $result the result from the API server
|
31 |
+
*/
|
32 |
+
public function __construct($result) {
|
33 |
+
$this->result = $result;
|
34 |
+
|
35 |
+
$code = isset($result['error']) ? $result['error'] : 0;
|
36 |
+
|
37 |
+
if (isset($result['message'])) {
|
38 |
+
$msg = $result['message'];
|
39 |
+
} else {
|
40 |
+
$msg = 'Unknown Error. Check getResult()';
|
41 |
+
}
|
42 |
+
|
43 |
+
parent::__construct($msg, $code);
|
44 |
+
}
|
45 |
+
|
46 |
+
/**
|
47 |
+
* Return the associated result object returned by the API server.
|
48 |
+
*
|
49 |
+
* @returns Array the result from the API server
|
50 |
+
*/
|
51 |
+
public function getResult() {
|
52 |
+
return $this->result;
|
53 |
+
}
|
54 |
+
|
55 |
+
/**
|
56 |
+
* To make debugging easier.
|
57 |
+
*
|
58 |
+
* @returns String the string representation of the error
|
59 |
+
*/
|
60 |
+
public function __toString() {
|
61 |
+
$str = '';
|
62 |
+
if ($this->code != 0) {
|
63 |
+
$str .= $this->code . ': ';
|
64 |
+
}
|
65 |
+
return $str . $this->message;
|
66 |
+
}
|
67 |
+
|
68 |
+
}
|
69 |
+
|
70 |
+
class LastFMInvalidSessionException extends LastFMException {
|
71 |
+
public function __construct($result) {
|
72 |
+
parent::__construct($result);
|
73 |
+
}
|
74 |
+
}
|
75 |
+
|
76 |
+
/**
|
77 |
+
* Provides access to the LastFM platform.
|
78 |
+
*
|
79 |
+
* @author Filip Sobczak <f@digitalinvaders.pl>
|
80 |
+
*/
|
81 |
+
class LastFM {
|
82 |
+
const VERSION = '0.9';
|
83 |
+
|
84 |
+
/**
|
85 |
+
* Default options for curl.
|
86 |
+
*/
|
87 |
+
public static $CURL_OPTS = array(
|
88 |
+
CURLOPT_CONNECTTIMEOUT => 10,
|
89 |
+
CURLOPT_RETURNTRANSFER => true,
|
90 |
+
CURLOPT_TIMEOUT => 60,
|
91 |
+
CURLOPT_USERAGENT => 'lastfm-php-0.9',
|
92 |
+
);
|
93 |
+
/**
|
94 |
+
* The Application API Secret.
|
95 |
+
*/
|
96 |
+
protected $apiSecret;
|
97 |
+
/**
|
98 |
+
* The Application API Key.
|
99 |
+
*/
|
100 |
+
protected $apiKey;
|
101 |
+
/**
|
102 |
+
* The active user session key, if one is available.
|
103 |
+
*/
|
104 |
+
protected $sk;
|
105 |
+
public static $DOMAIN_MAP = array(
|
106 |
+
'www' => 'https://www.last.fm/',
|
107 |
+
'webservice' => 'https://ws.audioscrobbler.com/2.0/',
|
108 |
+
);
|
109 |
+
|
110 |
+
const method_auth = 1;
|
111 |
+
const method_write = 2;
|
112 |
+
const method_get_auth = 3;
|
113 |
+
const method_unknown = 4;
|
114 |
+
|
115 |
+
/*
|
116 |
+
* Some methods require authentication (type auth),
|
117 |
+
* they all send api_sig and sk
|
118 |
+
* some methods are used to get authenticated (type get_auth)
|
119 |
+
* they all send api_sig
|
120 |
+
* some methods are used to write data (type write)
|
121 |
+
* they all send api_sig and sk, and use POST http method
|
122 |
+
*
|
123 |
+
* All letters are small because users might use
|
124 |
+
* variations of letter sizes, and we need to
|
125 |
+
* find these values fast, so strtolower is executed on method name.
|
126 |
+
*/
|
127 |
+
public static $METHOD_TYPE =
|
128 |
+
array(
|
129 |
+
'auth.getmobilesession' => self::method_get_auth,
|
130 |
+
'auth.getsession' => self::method_get_auth,
|
131 |
+
'auth.gettoken' => self::method_get_auth,
|
132 |
+
'album.addtags' => self::method_write,
|
133 |
+
'album.gettags' => self::method_auth,
|
134 |
+
'album.removetag' => self::method_write,
|
135 |
+
'album.share' => self::method_write,
|
136 |
+
'artist.addtags' => self::method_write,
|
137 |
+
'artist.gettags' => self::method_auth,
|
138 |
+
'artist.removetag' => self::method_write,
|
139 |
+
'artist.share' => self::method_write,
|
140 |
+
'artist.shout' => self::method_write,
|
141 |
+
'event.attend' => self::method_write,
|
142 |
+
'event.share' => self::method_write,
|
143 |
+
'event.shout' => self::method_write,
|
144 |
+
'library.addalbum' => self::method_write,
|
145 |
+
'library.addartist' => self::method_write,
|
146 |
+
'library.addtrack' => self::method_write,
|
147 |
+
'library.removealbum' => self::method_write,
|
148 |
+
'library.removeartist' => self::method_write,
|
149 |
+
'library.removescrobble' => self::method_write,
|
150 |
+
'library.removetrack' => self::method_write,
|
151 |
+
'playlist.addtrack' => self::method_write,
|
152 |
+
'playlist.create' => self::method_write,
|
153 |
+
'radio.getplaylist' => self::method_auth,
|
154 |
+
'radio.tune' => self::method_write,
|
155 |
+
'track.addtags' => self::method_write,
|
156 |
+
'track.ban' => self::method_write,
|
157 |
+
'track.gettags' => self::method_auth,
|
158 |
+
'track.love' => self::method_write,
|
159 |
+
'track.removetag' => self::method_write,
|
160 |
+
'track.scrobble' => self::method_write,
|
161 |
+
'track.share' => self::method_write,
|
162 |
+
'track.unban' => self::method_write,
|
163 |
+
'track.unlove' => self::method_write,
|
164 |
+
'track.updatenowplaying' => self::method_write,
|
165 |
+
'user.getrecentstations' => self::method_auth,
|
166 |
+
'user.getrecommendedartists' => self::method_auth,
|
167 |
+
'user.getrecommendedevents' => self::method_auth,
|
168 |
+
'user.shout' => self::method_write,
|
169 |
+
);
|
170 |
+
|
171 |
+
/**
|
172 |
+
* Initialize LastFM application.
|
173 |
+
*
|
174 |
+
* @param type $config configuration
|
175 |
+
*/
|
176 |
+
public function __construct($config) {
|
177 |
+
//$this->setAppId($config['appId']);
|
178 |
+
$this->setApiKey($config['api_key']);
|
179 |
+
$this->setApiSecret($config['api_secret']);
|
180 |
+
if (isset($config['sk'])) {
|
181 |
+
$this->setSessionKey($config['sk']);
|
182 |
+
}
|
183 |
+
}
|
184 |
+
|
185 |
+
public function setApiSecret($apiSecret) {
|
186 |
+
$this->apiSecret = $apiSecret;
|
187 |
+
return $this;
|
188 |
+
}
|
189 |
+
|
190 |
+
public function getApiSecret() {
|
191 |
+
return $this->apiSecret;
|
192 |
+
}
|
193 |
+
|
194 |
+
public function setApiKey($apiKey) {
|
195 |
+
$this->apiKey = $apiKey;
|
196 |
+
return $this;
|
197 |
+
}
|
198 |
+
|
199 |
+
public function getApiKey() {
|
200 |
+
return $this->apiKey;
|
201 |
+
}
|
202 |
+
|
203 |
+
public function setSessionKey($sk) {
|
204 |
+
$this->sk = $sk;
|
205 |
+
return $this;
|
206 |
+
}
|
207 |
+
|
208 |
+
public function getSessionKey() {
|
209 |
+
return $this->sk;
|
210 |
+
}
|
211 |
+
|
212 |
+
private function methodType($method) {
|
213 |
+
if (isset(self::$METHOD_TYPE[strtolower($method)])) {
|
214 |
+
return self::$METHOD_TYPE[strtolower($method)];
|
215 |
+
} else {
|
216 |
+
return self::method_unknown;
|
217 |
+
}
|
218 |
+
}
|
219 |
+
|
220 |
+
/**
|
221 |
+
* Get a Login URL for use with redirects.
|
222 |
+
*
|
223 |
+
* The parameters:
|
224 |
+
* - api_key: application api key
|
225 |
+
*
|
226 |
+
* @param Array $callback override default redirect
|
227 |
+
* @return String the URL for the login flow
|
228 |
+
*/
|
229 |
+
public function getLoginUrl($callback=array()) {
|
230 |
+
$params = array('api_key' => $this->getApiKey());
|
231 |
+
if ($callback)
|
232 |
+
$params['cb'] = $callback;
|
233 |
+
return $this->getUrl('www', 'api/auth', $params);
|
234 |
+
}
|
235 |
+
|
236 |
+
/**
|
237 |
+
* @param type $token 32-char ASCII MD5 hash, gained by granting permissions
|
238 |
+
*/
|
239 |
+
public function fetchSession($token = '') {
|
240 |
+
if (!$token) {
|
241 |
+
if (isset($_GET['token']))
|
242 |
+
$token = $_GET['token'];
|
243 |
+
}
|
244 |
+
$result = $this->api('auth.getSession', array('token' => $token));
|
245 |
+
//print_r($result);
|
246 |
+
//print_r($result); print_r($result['session']['key']); exit;
|
247 |
+
$name = $result['session']['name'];
|
248 |
+
$sessionKey = $result['session']['key'];
|
249 |
+
$this->setSessionKey($sessionKey);
|
250 |
+
|
251 |
+
return array('name' => $name, 'sk' => $sessionKey);
|
252 |
+
}
|
253 |
+
|
254 |
+
/**
|
255 |
+
* Make an API call
|
256 |
+
*
|
257 |
+
* @param Array $params method call object
|
258 |
+
* @return the decoded response object
|
259 |
+
* @throws LastFMApiException
|
260 |
+
*/
|
261 |
+
public function api($method, $params = array()) {
|
262 |
+
// generic application level parameters
|
263 |
+
$params['api_key'] = $this->getApiKey();
|
264 |
+
$params['format'] = 'json';
|
265 |
+
|
266 |
+
// required api method
|
267 |
+
$params['method'] = $method;
|
268 |
+
|
269 |
+
if ($this->methodType($method))
|
270 |
+
$methodType = $this->methodType($method);
|
271 |
+
|
272 |
+
|
273 |
+
|
274 |
+
if ($methodType == self::method_auth || $methodType == self::method_write) {
|
275 |
+
if (!isset($params['sk'])) {
|
276 |
+
$params['sk'] = $this->getSessionKey();
|
277 |
+
}
|
278 |
+
if (!$params['sk']) {
|
279 |
+
throw new LastFMException(array("message" => "No session key provided"));
|
280 |
+
}
|
281 |
+
} else {
|
282 |
+
if (isset($params['sk']))
|
283 |
+
unset($params['sk']);
|
284 |
+
}
|
285 |
+
|
286 |
+
if ($methodType == self::method_get_auth || $methodType == self::method_write) {
|
287 |
+
$params['api_sig'] = $this->generateSignature($params);
|
288 |
+
}
|
289 |
+
|
290 |
+
$raw = $this->makeRequest(self::getUrl('webservice'), $params);
|
291 |
+
$result = json_decode($raw, true);
|
292 |
+
|
293 |
+
if (is_array($result) && isset($result['error'])) {
|
294 |
+
if ($result['error'] == 9) {
|
295 |
+
// Invalid session key - Please re-authenticate
|
296 |
+
// this is different so that when user invalidates
|
297 |
+
// session the situation can be handled easily
|
298 |
+
throw new LastFMInvalidSessionException($result);
|
299 |
+
} else
|
300 |
+
throw new LastFMException($result);
|
301 |
+
}
|
302 |
+
return $result;
|
303 |
+
}
|
304 |
+
|
305 |
+
/**
|
306 |
+
* Makes an HTTP request.
|
307 |
+
*
|
308 |
+
* @param String $url the URL to make the request to
|
309 |
+
* @param Array $params the parameters to use for the POST body
|
310 |
+
* @return String the response text
|
311 |
+
*/
|
312 |
+
protected function makeRequest($url, $params) {
|
313 |
+
|
314 |
+
$ch = curl_init();
|
315 |
+
$opts = self::$CURL_OPTS;
|
316 |
+
$opts[CURLOPT_POSTFIELDS] = http_build_query($params, null, '&');
|
317 |
+
$opts[CURLOPT_URL] = $url;
|
318 |
+
|
319 |
+
curl_setopt_array($ch, $opts);
|
320 |
+
|
321 |
+
// mod:by:me
|
322 |
+
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
|
323 |
+
|
324 |
+
$result = curl_exec($ch);
|
325 |
+
|
326 |
+
if ($result === false) {
|
327 |
+
$e = new LastFMException(array(
|
328 |
+
'error' => curl_errno($ch),
|
329 |
+
'message' => curl_error($ch),
|
330 |
+
));
|
331 |
+
curl_close($ch);
|
332 |
+
throw $e;
|
333 |
+
}
|
334 |
+
|
335 |
+
curl_close($ch);
|
336 |
+
return $result;
|
337 |
+
}
|
338 |
+
|
339 |
+
/**
|
340 |
+
* Build the URL for given domain alias, path and parameters.
|
341 |
+
*
|
342 |
+
* @param $name String the name of the domain
|
343 |
+
* @param $path String optional path (without a leading slash)
|
344 |
+
* @param $params Array optional query parameters
|
345 |
+
* @return String the URL for the given parameters
|
346 |
+
*/
|
347 |
+
protected function getUrl($name, $path='', $params=array()) {
|
348 |
+
$url = self::$DOMAIN_MAP[$name];
|
349 |
+
if ($path) {
|
350 |
+
if ($path[0] === '/') {
|
351 |
+
$path = substr($path, 1);
|
352 |
+
}
|
353 |
+
$url .= $path;
|
354 |
+
}
|
355 |
+
if ($params) {
|
356 |
+
$url .= '?' . http_build_query($params, null, '&');
|
357 |
+
}
|
358 |
+
return $url;
|
359 |
+
}
|
360 |
+
|
361 |
+
/**
|
362 |
+
* Generate a signature for the given params and secret.
|
363 |
+
*
|
364 |
+
* @param Array $params the parameters to sign
|
365 |
+
* @return String the generated signature
|
366 |
+
*/
|
367 |
+
protected function generateSignature($params) {
|
368 |
+
// work with sorted data
|
369 |
+
ksort($params);
|
370 |
+
|
371 |
+
$base_string = '';
|
372 |
+
foreach ($params as $key => $value) {
|
373 |
+
if ($key == 'format' || $key == 'callback')
|
374 |
+
continue;
|
375 |
+
$base_string .= $key . $value;
|
376 |
+
}
|
377 |
+
$base_string .= $this->getApiSecret();
|
378 |
+
return md5(utf8_encode($base_string));
|
379 |
+
}
|
380 |
+
|
381 |
+
}
|
hybridauth/Hybrid/thirdparty/LinkedIn/LinkedIn.php
ADDED
@@ -0,0 +1,2639 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
// http://code.google.com/p/simple-linkedinphp/
|
3 |
+
// 3.2.0 - November 29, 2011
|
4 |
+
// hacked into the code to handel new scope (r_basicprofile+r_emailaddress) - until Paul update linkedinphp library!
|
5 |
+
|
6 |
+
/**
|
7 |
+
* This file defines the 'LinkedIn' class. This class is designed to be a
|
8 |
+
* simple, stand-alone implementation of the LinkedIn API functions.
|
9 |
+
*
|
10 |
+
* COPYRIGHT:
|
11 |
+
*
|
12 |
+
* Copyright (C) 2011, fiftyMission Inc.
|
13 |
+
*
|
14 |
+
* Permission is hereby granted, free of charge, to any person obtaining a
|
15 |
+
* copy of this software and associated documentation files (the "Software"),
|
16 |
+
* to deal in the Software without restriction, including without limitation
|
17 |
+
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
18 |
+
* and/or sell copies of the Software, and to permit persons to whom the
|
19 |
+
* Software is furnished to do so, subject to the following conditions:
|
20 |
+
*
|
21 |
+
* The above copyright notice and this permission notice shall be included in
|
22 |
+
* all copies or substantial portions of the Software.
|
23 |
+
*
|
24 |
+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
25 |
+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
26 |
+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
27 |
+
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
28 |
+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
29 |
+
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
30 |
+
* IN THE SOFTWARE.
|
31 |
+
*
|
32 |
+
* SOURCE CODE LOCATION:
|
33 |
+
*
|
34 |
+
* http://code.google.com/p/simple-linkedinphp/
|
35 |
+
*
|
36 |
+
* REQUIREMENTS:
|
37 |
+
*
|
38 |
+
* 1. You must have cURL installed on the server and available to PHP.
|
39 |
+
* 2. You must be running PHP 5+.
|
40 |
+
*
|
41 |
+
* QUICK START:
|
42 |
+
*
|
43 |
+
* There are two files needed to enable LinkedIn API functionality from PHP; the
|
44 |
+
* stand-alone OAuth library, and this LinkedIn class. The latest version of
|
45 |
+
* the stand-alone OAuth library can be found on Google Code:
|
46 |
+
*
|
47 |
+
* http://code.google.com/p/oauth/
|
48 |
+
*
|
49 |
+
* Install these two files on your server in a location that is accessible to
|
50 |
+
* the scripts you wish to use them in. Make sure to change the file
|
51 |
+
* permissions such that your web server can read the files.
|
52 |
+
*
|
53 |
+
* Next, make sure the path to the OAuth library is correct (you can change this
|
54 |
+
* as needed, depending on your file organization scheme, etc).
|
55 |
+
*
|
56 |
+
* Finally, test the class by attempting to connect to LinkedIn using the
|
57 |
+
* associated demo.php page, also located at the Google Code location
|
58 |
+
* referenced above.
|
59 |
+
*
|
60 |
+
* RESOURCES:
|
61 |
+
*
|
62 |
+
* REST API Documentation: http://developer.linkedin.com/rest
|
63 |
+
*
|
64 |
+
* @version 3.2.0 - November 8, 2011
|
65 |
+
* @author Paul Mennega <paul@fiftymission.net>
|
66 |
+
* @copyright Copyright 2011, fiftyMission Inc.
|
67 |
+
* @license http://www.opensource.org/licenses/mit-license.php The MIT License
|
68 |
+
*/
|
69 |
+
|
70 |
+
/**
|
71 |
+
* 'LinkedInException' class declaration.
|
72 |
+
*
|
73 |
+
* This class extends the base 'Exception' class.
|
74 |
+
*
|
75 |
+
* @access public
|
76 |
+
* @package classpackage
|
77 |
+
*/
|
78 |
+
class LinkedInException extends Exception {}
|
79 |
+
|
80 |
+
/**
|
81 |
+
* 'LinkedIn' class declaration.
|
82 |
+
*
|
83 |
+
* This class provides generalized LinkedIn oauth functionality.
|
84 |
+
*
|
85 |
+
* @access public
|
86 |
+
* @package classpackage
|
87 |
+
*/
|
88 |
+
class LinkedIn {
|
89 |
+
// api/oauth settings
|
90 |
+
const _API_OAUTH_REALM = 'http://api.linkedin.com';
|
91 |
+
const _API_OAUTH_VERSION = '1.0';
|
92 |
+
|
93 |
+
// the default response format from LinkedIn
|
94 |
+
const _DEFAULT_RESPONSE_FORMAT = 'xml';
|
95 |
+
|
96 |
+
// helper constants used to standardize LinkedIn <-> API communication. See demo page for usage.
|
97 |
+
const _GET_RESPONSE = 'lResponse';
|
98 |
+
const _GET_TYPE = 'lType';
|
99 |
+
|
100 |
+
// Invitation API constants.
|
101 |
+
const _INV_SUBJECT = 'Invitation to connect';
|
102 |
+
const _INV_BODY_LENGTH = 200;
|
103 |
+
|
104 |
+
// API methods
|
105 |
+
const _METHOD_TOKENS = 'POST';
|
106 |
+
|
107 |
+
// Network API constants.
|
108 |
+
const _NETWORK_LENGTH = 1000;
|
109 |
+
const _NETWORK_HTML = '<a>';
|
110 |
+
|
111 |
+
// response format type constants, see http://developer.linkedin.com/docs/DOC-1203
|
112 |
+
const _RESPONSE_JSON = 'JSON';
|
113 |
+
const _RESPONSE_JSONP = 'JSONP';
|
114 |
+
const _RESPONSE_XML = 'XML';
|
115 |
+
|
116 |
+
// Share API constants
|
117 |
+
const _SHARE_COMMENT_LENGTH = 700;
|
118 |
+
const _SHARE_CONTENT_TITLE_LENGTH = 200;
|
119 |
+
const _SHARE_CONTENT_DESC_LENGTH = 400;
|
120 |
+
|
121 |
+
// LinkedIn API end-points
|
122 |
+
const _URL_ACCESS = 'https://api.linkedin.com/uas/oauth/accessToken';
|
123 |
+
const _URL_API = 'https://api.linkedin.com';
|
124 |
+
const _URL_AUTH = 'https://www.linkedin.com/uas/oauth/authenticate?oauth_token=';
|
125 |
+
// const _URL_REQUEST = 'https://api.linkedin.com/uas/oauth/requestToken';
|
126 |
+
const _URL_REQUEST = 'https://api.linkedin.com/uas/oauth/requestToken?scope=r_basicprofile+r_emailaddress+rw_nus+r_network';
|
127 |
+
const _URL_REVOKE = 'https://api.linkedin.com/uas/oauth/invalidateToken';
|
128 |
+
|
129 |
+
// Library version
|
130 |
+
const _VERSION = '3.2.0';
|
131 |
+
|
132 |
+
// oauth properties
|
133 |
+
protected $callback;
|
134 |
+
protected $token = NULL;
|
135 |
+
|
136 |
+
// application properties
|
137 |
+
protected $application_key,
|
138 |
+
$application_secret;
|
139 |
+
|
140 |
+
// the format of the data to return
|
141 |
+
protected $response_format = self::_DEFAULT_RESPONSE_FORMAT;
|
142 |
+
|
143 |
+
// last request fields
|
144 |
+
public $last_request_headers,
|
145 |
+
$last_request_url;
|
146 |
+
|
147 |
+
/**
|
148 |
+
* Create a LinkedIn object, used for OAuth-based authentication and
|
149 |
+
* communication with the LinkedIn API.
|
150 |
+
*
|
151 |
+
* @param arr $config
|
152 |
+
* The 'start-up' object properties:
|
153 |
+
* - appKey => The application's API key
|
154 |
+
* - appSecret => The application's secret key
|
155 |
+
* - callbackUrl => [OPTIONAL] the callback URL
|
156 |
+
*
|
157 |
+
* @return obj
|
158 |
+
* A new LinkedIn object.
|
159 |
+
*/
|
160 |
+
public function __construct($config) {
|
161 |
+
if(!is_array($config)) {
|
162 |
+
// bad data passed
|
163 |
+
throw new LinkedInException('LinkedIn->__construct(): bad data passed, $config must be of type array.');
|
164 |
+
}
|
165 |
+
$this->setApplicationKey($config['appKey']);
|
166 |
+
$this->setApplicationSecret($config['appSecret']);
|
167 |
+
$this->setCallbackUrl($config['callbackUrl']);
|
168 |
+
}
|
169 |
+
|
170 |
+
/**
|
171 |
+
* The class destructor.
|
172 |
+
*
|
173 |
+
* Explicitly clears LinkedIn object from memory upon destruction.
|
174 |
+
*/
|
175 |
+
public function __destruct() {
|
176 |
+
unset($this);
|
177 |
+
}
|
178 |
+
|
179 |
+
/**
|
180 |
+
* Bookmark a job.
|
181 |
+
*
|
182 |
+
* Calling this method causes the current user to add a bookmark for the
|
183 |
+
* specified job:
|
184 |
+
*
|
185 |
+
* http://developer.linkedin.com/docs/DOC-1323
|
186 |
+
*
|
187 |
+
* @param str $jid
|
188 |
+
* Job ID you want to bookmark.
|
189 |
+
*
|
190 |
+
* @return arr
|
191 |
+
* Array containing retrieval success, LinkedIn response.
|
192 |
+
*/
|
193 |
+
public function bookmarkJob($jid) {
|
194 |
+
// check passed data
|
195 |
+
if(!is_string($jid)) {
|
196 |
+
// bad data passed
|
197 |
+
throw new LinkedInException('LinkedIn->bookmarkJob(): bad data passed, $jid must be of type string.');
|
198 |
+
}
|
199 |
+
|
200 |
+
// construct and send the request
|
201 |
+
$query = self::_URL_API . '/v1/people/~/job-bookmarks';
|
202 |
+
$response = $this->fetch('POST', $query, '<job-bookmark><job><id>' . trim($jid) . '</id></job></job-bookmark>');
|
203 |
+
|
204 |
+
/**
|
205 |
+
* Check for successful request (a 201 response from LinkedIn server)
|
206 |
+
* per the documentation linked in method comments above.
|
207 |
+
*/
|
208 |
+
return $this->checkResponse(201, $response);
|
209 |
+
}
|
210 |
+
|
211 |
+
/**
|
212 |
+
* Get list of jobs you have bookmarked.
|
213 |
+
*
|
214 |
+
* Returns a list of jobs the current user has bookmarked, per:
|
215 |
+
*
|
216 |
+
* http://developer.linkedin.com/docs/DOC-1323
|
217 |
+
*
|
218 |
+
* @return arr
|
219 |
+
* Array containing retrieval success, LinkedIn response.
|
220 |
+
*/
|
221 |
+
public function bookmarkedJobs() {
|
222 |
+
// construct and send the request
|
223 |
+
$query = self::_URL_API . '/v1/people/~/job-bookmarks';
|
224 |
+
$response = $this->fetch('GET', $query);
|
225 |
+
|
226 |
+
/**
|
227 |
+
* Check for successful request (a 200 response from LinkedIn server)
|
228 |
+
* per the documentation linked in method comments above.
|
229 |
+
*/
|
230 |
+
return $this->checkResponse(200, $response);
|
231 |
+
}
|
232 |
+
|
233 |
+
/**
|
234 |
+
* Custom addition to make code compatible with PHP 5.2
|
235 |
+
*/
|
236 |
+
private function intWalker($value, $key) {
|
237 |
+
if(!is_int($value)) {
|
238 |
+
throw new LinkedInException('LinkedIn->checkResponse(): $http_code_required must be an integer or an array of integer values');
|
239 |
+
}
|
240 |
+
}
|
241 |
+
|
242 |
+
/**
|
243 |
+
* Used to check whether a response LinkedIn object has the required http_code or not and
|
244 |
+
* returns an appropriate LinkedIn object.
|
245 |
+
*
|
246 |
+
* @param var $http_code_required
|
247 |
+
* The required http response from LinkedIn, passed in either as an integer,
|
248 |
+
* or an array of integers representing the expected values.
|
249 |
+
* @param arr $response
|
250 |
+
* An array containing a LinkedIn response.
|
251 |
+
*
|
252 |
+
* @return boolean
|
253 |
+
* TRUE or FALSE depending on if the passed LinkedIn response matches the expected response.
|
254 |
+
*/
|
255 |
+
private function checkResponse($http_code_required, $response) {
|
256 |
+
// check passed data
|
257 |
+
if(is_array($http_code_required)) {
|
258 |
+
array_walk($http_code_required, array($this, 'intWalker'));
|
259 |
+
} else {
|
260 |
+
if(!is_int($http_code_required)) {
|
261 |
+
throw new LinkedInException('LinkedIn->checkResponse(): $http_code_required must be an integer or an array of integer values');
|
262 |
+
} else {
|
263 |
+
$http_code_required = array($http_code_required);
|
264 |
+
}
|
265 |
+
}
|
266 |
+
if(!is_array($response)) {
|
267 |
+
throw new LinkedInException('LinkedIn->checkResponse(): $response must be an array');
|
268 |
+
}
|
269 |
+
|
270 |
+
// check for a match
|
271 |
+
if(in_array($response['info']['http_code'], $http_code_required)) {
|
272 |
+
// response found
|
273 |
+
$response['success'] = TRUE;
|
274 |
+
} else {
|
275 |
+
// response not found
|
276 |
+
$response['success'] = FALSE;
|
277 |
+
$response['error'] = 'HTTP response from LinkedIn end-point was not code ' . implode(', ', $http_code_required);
|
278 |
+
}
|
279 |
+
return $response;
|
280 |
+
}
|
281 |
+
|
282 |
+
/**
|
283 |
+
* Close a job.
|
284 |
+
*
|
285 |
+
* Calling this method causes the passed job to be closed, per:
|
286 |
+
*
|
287 |
+
* http://developer.linkedin.com/docs/DOC-1151
|
288 |
+
*
|
289 |
+
* @param str $jid
|
290 |
+
* Job ID you want to close.
|
291 |
+
*
|
292 |
+
* @return arr
|
293 |
+
* Array containing retrieval success, LinkedIn response.
|
294 |
+
*/
|
295 |
+
public function closeJob($jid) {
|
296 |
+
// check passed data
|
297 |
+
if(!is_string($jid)) {
|
298 |
+
// bad data passed
|
299 |
+
throw new LinkedInException('LinkedIn->closeJob(): bad data passed, $jid must be of string value.');
|
300 |
+
}
|
301 |
+
|
302 |
+
// construct and send the request
|
303 |
+
$query = self::_URL_API . '/v1/jobs/partner-job-id=' . trim($jid);
|
304 |
+
$response = $this->fetch('DELETE', $query);
|
305 |
+
|
306 |
+
/**
|
307 |
+
* Check for successful request (a 204 response from LinkedIn server)
|
308 |
+
* per the documentation linked in method comments above.
|
309 |
+
*/
|
310 |
+
return $this->checkResponse(204, $response);
|
311 |
+
}
|
312 |
+
|
313 |
+
/**
|
314 |
+
* Share comment posting method.
|
315 |
+
*
|
316 |
+
* Post a comment on an existing connections shared content. API details can
|
317 |
+
* be found here:
|
318 |
+
*
|
319 |
+
* http://developer.linkedin.com/docs/DOC-1043
|
320 |
+
*
|
321 |
+
* @param str $uid
|
322 |
+
* The LinkedIn update ID.
|
323 |
+
* @param str $comment
|
324 |
+
* The share comment to be posted.
|
325 |
+
*
|
326 |
+
* @return arr
|
327 |
+
* Array containing retrieval success, LinkedIn response.
|
328 |
+
*/
|
329 |
+
public function comment($uid, $comment) {
|
330 |
+
// check passed data
|
331 |
+
if(!is_string($uid)) {
|
332 |
+
// bad data passed
|
333 |
+
throw new LinkedInException('LinkedIn->comment(): bad data passed, $uid must be of type string.');
|
334 |
+
}
|
335 |
+
if(!is_string($comment)) {
|
336 |
+
// nothing/non-string passed, raise an exception
|
337 |
+
throw new LinkedInException('LinkedIn->comment(): bad data passed, $comment must be a non-zero length string.');
|
338 |
+
}
|
339 |
+
|
340 |
+
/**
|
341 |
+
* Share comment rules:
|
342 |
+
*
|
343 |
+
* 1) No HTML permitted.
|
344 |
+
* 2) Comment cannot be longer than 700 characters.
|
345 |
+
*/
|
346 |
+
$comment = substr(trim(htmlspecialchars(strip_tags($comment))), 0, self::_SHARE_COMMENT_LENGTH);
|
347 |
+
$data = '<?xml version="1.0" encoding="UTF-8"?>
|
348 |
+
<update-comment>
|
349 |
+
<comment>' . $comment . '</comment>
|
350 |
+
</update-comment>';
|
351 |
+
|
352 |
+
// construct and send the request
|
353 |
+
$query = self::_URL_API . '/v1/people/~/network/updates/key=' . $uid . '/update-comments';
|
354 |
+
$response = $this->fetch('POST', $query, $data);
|
355 |
+
|
356 |
+
/**
|
357 |
+
* Check for successful request (a 201 response from LinkedIn server)
|
358 |
+
* per the documentation linked in method comments above.
|
359 |
+
*/
|
360 |
+
return $this->checkResponse(201, $response);
|
361 |
+
}
|
362 |
+
|
363 |
+
/**
|
364 |
+
* Share comment retrieval.
|
365 |
+
*
|
366 |
+
* Return all comments associated with a given network update:
|
367 |
+
*
|
368 |
+
* http://developer.linkedin.com/docs/DOC-1043
|
369 |
+
*
|
370 |
+
* @param str $uid
|
371 |
+
* The LinkedIn update ID.
|
372 |
+
*
|
373 |
+
* @return arr
|
374 |
+
* Array containing retrieval success, LinkedIn response.
|
375 |
+
*/
|
376 |
+
public function comments($uid) {
|
377 |
+
// check passed data
|
378 |
+
if(!is_string($uid)) {
|
379 |
+
// bad data passed
|
380 |
+
throw new LinkedInException('LinkedIn->comments(): bad data passed, $uid must be of type string.');
|
381 |
+
}
|
382 |
+
|
383 |
+
// construct and send the request
|
384 |
+
$query = self::_URL_API . '/v1/people/~/network/updates/key=' . $uid . '/update-comments';
|
385 |
+
$response = $this->fetch('GET', $query);
|
386 |
+
|
387 |
+
/**
|
388 |
+
* Check for successful request (a 200 response from LinkedIn server)
|
389 |
+
* per the documentation linked in method comments above.
|
390 |
+
*/
|
391 |
+
return $this->checkResponse(200, $response);
|
392 |
+
}
|
393 |
+
|
394 |
+
/**
|
395 |
+
* Company profile retrieval function.
|
396 |
+
*
|
397 |
+
* Takes a string of parameters as input and requests company profile data
|
398 |
+
* from the LinkedIn Company Profile API. See the official documentation for
|
399 |
+
* $options 'field selector' formatting:
|
400 |
+
*
|
401 |
+
* http://developer.linkedin.com/docs/DOC-1014
|
402 |
+
* http://developer.linkedin.com/docs/DOC-1259
|
403 |
+
*
|
404 |
+
* @param str $options
|
405 |
+
* Data retrieval options.
|
406 |
+
* @param bool $by_email
|
407 |
+
* [OPTIONAL] Search by email domain?
|
408 |
+
*
|
409 |
+
* @return arr
|
410 |
+
* Array containing retrieval success, LinkedIn response.
|
411 |
+
*/
|
412 |
+
public function company($options, $by_email = FALSE) {
|
413 |
+
// check passed data
|
414 |
+
if(!is_string($options)) {
|
415 |
+
// bad data passed
|
416 |
+
throw new LinkedInException('LinkedIn->company(): bad data passed, $options must be of type string.');
|
417 |
+
}
|
418 |
+
if(!is_bool($by_email)) {
|
419 |
+
// bad data passed
|
420 |
+
throw new LinkedInException('LinkedIn->company(): bad data passed, $by_email must be of type boolean.');
|
421 |
+
}
|
422 |
+
|
423 |
+
// construct and send the request
|
424 |
+
$query = self::_URL_API . '/v1/companies' . ($by_email ? '' : '/') . trim($options);
|
425 |
+
$response = $this->fetch('GET', $query);
|
426 |
+
|
427 |
+
/**
|
428 |
+
* Check for successful request (a 200 response from LinkedIn server)
|
429 |
+
* per the documentation linked in method comments above.
|
430 |
+
*/
|
431 |
+
return $this->checkResponse(200, $response);
|
432 |
+
}
|
433 |
+
|
434 |
+
/**
|
435 |
+
* Company products and their associated recommendations.
|
436 |
+
*
|
437 |
+
* The product data type contains details about a company's product or
|
438 |
+
* service, including recommendations from LinkedIn members, and replies from
|
439 |
+
* company representatives.
|
440 |
+
*
|
441 |
+
* http://developer.linkedin.com/docs/DOC-1327
|
442 |
+
*
|
443 |
+
* @param str $cid
|
444 |
+
* Company ID you want the producte for.
|
445 |
+
* @param str $options
|
446 |
+
* [OPTIONAL] Data retrieval options.
|
447 |
+
*
|
448 |
+
* @return arr
|
449 |
+
* Array containing retrieval success, LinkedIn response.
|
450 |
+
*/
|
451 |
+
public function companyProducts($cid, $options = '') {
|
452 |
+
// check passed data
|
453 |
+
if(!is_string($cid)) {
|
454 |
+
// bad data passed
|
455 |
+
throw new LinkedInException('LinkedIn->companyProducts(): bad data passed, $cid must be of type string.');
|
456 |
+
}
|
457 |
+
if(!is_string($options)) {
|
458 |
+
// bad data passed
|
459 |
+
throw new LinkedInException('LinkedIn->companyProducts(): bad data passed, $options must be of type string.');
|
460 |
+
}
|
461 |
+
|
462 |
+
// construct and send the request
|
463 |
+
$query = self::_URL_API . '/v1/companies/' . trim($cid) . '/products' . trim($options);
|
464 |
+
$response = $this->fetch('GET', $query);
|
465 |
+
|
466 |
+
/**
|
467 |
+
* Check for successful request (a 200 response from LinkedIn server)
|
468 |
+
* per the documentation linked in method comments above.
|
469 |
+
*/
|
470 |
+
return $this->checkResponse(200, $response);
|
471 |
+
}
|
472 |
+
|
473 |
+
/**
|
474 |
+
* Connection retrieval function.
|
475 |
+
*
|
476 |
+
* Takes a string of parameters as input and requests connection-related data
|
477 |
+
* from the Linkedin Connections API. See the official documentation for
|
478 |
+
* $options 'field selector' formatting:
|
479 |
+
*
|
480 |
+
* http://developer.linkedin.com/docs/DOC-1014
|
481 |
+
*
|
482 |
+
* @param str $options
|
483 |
+
* [OPTIONAL] Data retrieval options.
|
484 |
+
*
|
485 |
+
* @return arr
|
486 |
+
* Array containing retrieval success, LinkedIn response.
|
487 |
+
*/
|
488 |
+
public function connections($options = '~/connections') {
|
489 |
+
// check passed data
|
490 |
+
if(!is_string($options)) {
|
491 |
+
// bad data passed
|
492 |
+
throw new LinkedInException('LinkedIn->connections(): bad data passed, $options must be of type string.');
|
493 |
+
}
|
494 |
+
|
495 |
+
// construct and send the request
|
496 |
+
$query = self::_URL_API . '/v1/people/' . trim($options);
|
497 |
+
$response = $this->fetch('GET', $query);
|
498 |
+
|
499 |
+
/**
|
500 |
+
* Check for successful request (a 200 response from LinkedIn server)
|
501 |
+
* per the documentation linked in method comments above.
|
502 |
+
*/
|
503 |
+
return $this->checkResponse(200, $response);
|
504 |
+
}
|
505 |
+
|
506 |
+
/**
|
507 |
+
* This creates a post in the specified group with the specified title and specified summary.
|
508 |
+
*
|
509 |
+
* http://developer.linkedin.com/documents/groups-api
|
510 |
+
*
|
511 |
+
* @param str $gid
|
512 |
+
* The group id.
|
513 |
+
* @param str $title
|
514 |
+
* The title of the post. This must be non-empty.
|
515 |
+
* @param str $summary
|
516 |
+
* [OPTIONAL] The content or summary of the post. This can be empty.
|
517 |
+
*
|
518 |
+
* @return arr
|
519 |
+
* Array containing retrieval success, LinkedIn response.
|
520 |
+
*/
|
521 |
+
public function createPost($gid, $title, $summary = '') {
|
522 |
+
if(!is_string($gid)) {
|
523 |
+
throw new LinkedInException('LinkedIn->createPost(): bad data passed, $gid must be of type string.');
|
524 |
+
}
|
525 |
+
if(!is_string($title) || empty($title)) {
|
526 |
+
throw new LinkedInException('LinkedIn->createPost(): bad data passed, $title must be a non-empty string.');
|
527 |
+
}
|
528 |
+
if(!is_string($summary)) {
|
529 |
+
throw new LinkedInException('LinkedIn->createPost(): bad data passed, $summary must be of type string.');
|
530 |
+
}
|
531 |
+
|
532 |
+
// construct the XML
|
533 |
+
$data = '<?xml version="1.0" encoding="UTF-8"?>
|
534 |
+
<post>
|
535 |
+
<title>'. $title . '</title>
|
536 |
+
<summary>' . $summary . '</summary>
|
537 |
+
</post>';
|
538 |
+
|
539 |
+
// construct and send the request
|
540 |
+
$query = self::_URL_API . '/v1/groups/' . trim($gid) . '/posts';
|
541 |
+
$response = $this->fetch('POST', $query, $data);
|
542 |
+
|
543 |
+
/**
|
544 |
+
* Check for successful request (a 201 response from LinkedIn server)
|
545 |
+
* per the documentation linked in method comments above.
|
546 |
+
*/
|
547 |
+
return $this->checkResponse(201, $response);
|
548 |
+
}
|
549 |
+
|
550 |
+
/**
|
551 |
+
* This deletes the specified post if you are the owner or moderator that post.
|
552 |
+
* Otherwise, it just flags the post as inappropriate.
|
553 |
+
*
|
554 |
+
* https://developer.linkedin.com/documents/groups-api
|
555 |
+
*
|
556 |
+
* @param str $pid
|
557 |
+
* The post id.
|
558 |
+
*
|
559 |
+
* @return arr
|
560 |
+
* Array containing retrieval success, LinkedIn response.
|
561 |
+
*/
|
562 |
+
public function deletePost($pid) {
|
563 |
+
if(!is_string($pid)) {
|
564 |
+
throw new LinkedInException('LinkedIn->deletePost(): bad data passed, $pid must be of type string');
|
565 |
+
}
|
566 |
+
|
567 |
+
// construct and send the request
|
568 |
+
$query = self::_URL_API . '/v1/posts/' . trim($pid);
|
569 |
+
$response = $this->fetch('DELETE', $query);
|
570 |
+
|
571 |
+
/**
|
572 |
+
* Check for successful request (a 204 response from LinkedIn server)
|
573 |
+
* per the documentation linked in method comments above.
|
574 |
+
*/
|
575 |
+
return $this->checkResponse(204, $response);
|
576 |
+
}
|
577 |
+
|
578 |
+
/**
|
579 |
+
* Edit a job.
|
580 |
+
*
|
581 |
+
* Calling this method causes the passed job to be edited, with the passed
|
582 |
+
* XML instructing which fields to change, per:
|
583 |
+
*
|
584 |
+
* http://developer.linkedin.com/docs/DOC-1154
|
585 |
+
* http://developer.linkedin.com/docs/DOC-1142
|
586 |
+
*
|
587 |
+
* @param str $jid
|
588 |
+
* Job ID you want to renew.
|
589 |
+
* @param str $xml
|
590 |
+
* The XML containing the job fields to edit.
|
591 |
+
*
|
592 |
+
* @return arr
|
593 |
+
* Array containing retrieval success, LinkedIn response.
|
594 |
+
*/
|
595 |
+
public function editJob($jid, $xml) {
|
596 |
+
// check passed data
|
597 |
+
if(!is_string($jid)) {
|
598 |
+
// bad data passed
|
599 |
+
throw new LinkedInException('LinkedIn->editJob(): bad data passed, $jid must be of string value.');
|
600 |
+
}
|
601 |
+
if(is_string($xml)) {
|
602 |
+
$xml = trim(stripslashes($xml));
|
603 |
+
} else {
|
604 |
+
// bad data passed
|
605 |
+
throw new LinkedInException('LinkedIn->editJob(): bad data passed, $xml must be of string value.');
|
606 |
+
}
|
607 |
+
|
608 |
+
// construct and send the request
|
609 |
+
$query = self::_URL_API . '/v1/jobs/partner-job-id=' . trim($jid);
|
610 |
+
$response = $this->fetch('PUT', $query, $xml);
|
611 |
+
|
612 |
+
/**
|
613 |
+
* Check for successful request (a 200 response from LinkedIn server)
|
614 |
+
* per the documentation linked in method comments above.
|
615 |
+
*/
|
616 |
+
return $this->checkResponse(200, $response);
|
617 |
+
}
|
618 |
+
|
619 |
+
/**
|
620 |
+
* General data send/request method.
|
621 |
+
*
|
622 |
+
* @param str $method
|
623 |
+
* The data communication method.
|
624 |
+
* @param str $url
|
625 |
+
* The Linkedin API endpoint to connect with.
|
626 |
+
* @param str $data
|
627 |
+
* [OPTIONAL] The data to send to LinkedIn.
|
628 |
+
* @param arr $parameters
|
629 |
+
* [OPTIONAL] Addition OAuth parameters to send to LinkedIn.
|
630 |
+
*
|
631 |
+
* @return arr
|
632 |
+
* Array containing:
|
633 |
+
*
|
634 |
+
* array(
|
635 |
+
* 'info' => Connection information,
|
636 |
+
* 'linkedin' => LinkedIn response,
|
637 |
+
* 'oauth' => The OAuth request string that was sent to LinkedIn
|
638 |
+
* )
|
639 |
+
*/
|
640 |
+
protected function fetch($method, $url, $data = NULL, $parameters = array()) {
|
641 |
+
// check for cURL
|
642 |
+
if(!extension_loaded('curl')) {
|
643 |
+
// cURL not present
|
644 |
+
throw new LinkedInException('LinkedIn->fetch(): PHP cURL extension does not appear to be loaded/present.');
|
645 |
+
}
|
646 |
+
|
647 |
+
try {
|
648 |
+
// generate OAuth values
|
649 |
+
$oauth_consumer = new OAuthConsumer($this->getApplicationKey(), $this->getApplicationSecret(), $this->getCallbackUrl());
|
650 |
+
$oauth_token = $this->getToken();
|
651 |
+
$oauth_token = (!is_null($oauth_token)) ? new OAuthToken($oauth_token['oauth_token'], $oauth_token['oauth_token_secret']) : NULL;
|
652 |
+
$defaults = array(
|
653 |
+
'oauth_version' => self::_API_OAUTH_VERSION
|
654 |
+
);
|
655 |
+
$parameters = array_merge($defaults, $parameters);
|
656 |
+
|
657 |
+
// generate OAuth request
|
658 |
+
$oauth_req = OAuthRequest::from_consumer_and_token($oauth_consumer, $oauth_token, $method, $url, $parameters);
|
659 |
+
$oauth_req->sign_request(new OAuthSignatureMethod_HMAC_SHA1(), $oauth_consumer, $oauth_token);
|
660 |
+
|
661 |
+
// start cURL, checking for a successful initiation
|
662 |
+
if(!$handle = curl_init()) {
|
663 |
+
// cURL failed to start
|
664 |
+
throw new LinkedInException('LinkedIn->fetch(): cURL did not initialize properly.');
|
665 |
+
}
|
666 |
+
|
667 |
+
// set cURL options, based on parameters passed
|
668 |
+
curl_setopt($handle, CURLOPT_CUSTOMREQUEST, $method);
|
669 |
+
curl_setopt($handle, CURLOPT_RETURNTRANSFER, TRUE);
|
670 |
+
curl_setopt($handle, CURLOPT_SSL_VERIFYPEER, FALSE);
|
671 |
+
curl_setopt($handle, CURLOPT_URL, $url);
|
672 |
+
curl_setopt($handle, CURLOPT_VERBOSE, FALSE);
|
673 |
+
|
674 |
+
// configure the header we are sending to LinkedIn - http://developer.linkedin.com/docs/DOC-1203
|
675 |
+
$header = array($oauth_req->to_header(self::_API_OAUTH_REALM));
|
676 |
+
if(is_null($data)) {
|
677 |
+
// not sending data, identify the content type
|
678 |
+
$header[] = 'Content-Type: text/plain; charset=UTF-8';
|
679 |
+
switch($this->getResponseFormat()) {
|
680 |
+
case self::_RESPONSE_JSON:
|
681 |
+
$header[] = 'x-li-format: json';
|
682 |
+
break;
|
683 |
+
case self::_RESPONSE_JSONP:
|
684 |
+
$header[] = 'x-li-format: jsonp';
|
685 |
+
break;
|
686 |
+
}
|
687 |
+
} else {
|
688 |
+
$header[] = 'Content-Type: text/xml; charset=UTF-8';
|
689 |
+
curl_setopt($handle, CURLOPT_POSTFIELDS, $data);
|
690 |
+
}
|
691 |
+
curl_setopt($handle, CURLOPT_HTTPHEADER, $header);
|
692 |
+
|
693 |
+
// set the last url, headers
|
694 |
+
$this->last_request_url = $url;
|
695 |
+
$this->last_request_headers = $header;
|
696 |
+
|
697 |
+
// gather the response
|
698 |
+
$return_data['linkedin'] = curl_exec($handle);
|
699 |
+
$return_data['info'] = curl_getinfo($handle);
|
700 |
+
$return_data['oauth']['header'] = $oauth_req->to_header(self::_API_OAUTH_REALM);
|
701 |
+
$return_data['oauth']['string'] = $oauth_req->base_string;
|
702 |
+
|
703 |
+
// check for throttling
|
704 |
+
if(self::isThrottled($return_data['linkedin'])) {
|
705 |
+
throw new LinkedInException('LinkedIn->fetch(): throttling limit for this user/application has been reached for LinkedIn resource - ' . $url);
|
706 |
+
}
|
707 |
+
|
708 |
+
//TODO - add check for NO response (http_code = 0) from cURL
|
709 |
+
|
710 |
+
// close cURL connection
|
711 |
+
curl_close($handle);
|
712 |
+
|
713 |
+
// no exceptions thrown, return the data
|
714 |
+
return $return_data;
|
715 |
+
} catch(OAuthException $e) {
|
716 |
+
// oauth exception raised
|
717 |
+
throw new LinkedInException('OAuth exception caught: ' . $e->getMessage());
|
718 |
+
}
|
719 |
+
}
|
720 |
+
|
721 |
+
/**
|
722 |
+
* This flags a specified post as specified by type.
|
723 |
+
*
|
724 |
+
* http://developer.linkedin.com/documents/groups-api
|
725 |
+
*
|
726 |
+
* @param str $pid
|
727 |
+
* The post id.
|
728 |
+
* @param str $type
|
729 |
+
* The type to flag the post as.
|
730 |
+
*
|
731 |
+
* @return arr
|
732 |
+
* Array containing retrieval success, LinkedIn response.
|
733 |
+
*/
|
734 |
+
public function flagPost($pid, $type) {
|
735 |
+
if(!is_string($pid)) {
|
736 |
+
throw new LinkedInException('LinkedIn->flagPost(): bad data passed, $pid must be of type string');
|
737 |
+
}
|
738 |
+
if(!is_string($type)) {
|
739 |
+
throw new LinkedInException('LinkedIn->flagPost(): bad data passed, $like must be of type string');
|
740 |
+
}
|
741 |
+
//Constructing the xml
|
742 |
+
$data = '<?xml version="1.0" encoding="UTF-8"?>';
|
743 |
+
switch($type) {
|
744 |
+
case 'promotion':
|
745 |
+
$data .= '<code>promotion</code>';
|
746 |
+
break;
|
747 |
+
case 'job':
|
748 |
+
$data .= '<code>job</code>';
|
749 |
+
break;
|
750 |
+
default:
|
751 |
+
throw new LinkedInException('LinkedIn->flagPost(): invalid value for $type, must be one of: "promotion", "job"');
|
752 |
+
break;
|
753 |
+
}
|
754 |
+
|
755 |
+
// construct and send the request
|
756 |
+
$query = self::_URL_API . '/v1/posts/' . $pid . '/category/code';
|
757 |
+
$response = $this->fetch('PUT', $query, $data);
|
758 |
+
|
759 |
+
/**
|
760 |
+
* Check for successful request (a 204 response from LinkedIn server)
|
761 |
+
* per the documentation linked in method comments above.
|
762 |
+
*/
|
763 |
+
return $this->checkResponse(204, $response);
|
764 |
+
}
|
765 |
+
|
766 |
+
/**
|
767 |
+
* Follow a company.
|
768 |
+
*
|
769 |
+
* Calling this method causes the current user to start following the
|
770 |
+
* specified company, per:
|
771 |
+
*
|
772 |
+
* http://developer.linkedin.com/docs/DOC-1324
|
773 |
+
*
|
774 |
+
* @param str $cid
|
775 |
+
* Company ID you want to follow.
|
776 |
+
*
|
777 |
+
* @return arr
|
778 |
+
* Array containing retrieval success, LinkedIn response.
|
779 |
+
*/
|
780 |
+
public function followCompany($cid) {
|
781 |
+
// check passed data
|
782 |
+
if(!is_string($cid)) {
|
783 |
+
// bad data passed
|
784 |
+
throw new LinkedInException('LinkedIn->followCompany(): bad data passed, $cid must be of type string.');
|
785 |
+
}
|
786 |
+
|
787 |
+
// construct and send the request
|
788 |
+
$query = self::_URL_API . '/v1/people/~/following/companies';
|
789 |
+
$response = $this->fetch('POST', $query, '<company><id>' . trim($cid) . '</id></company>');
|
790 |
+
|
791 |
+
/**
|
792 |
+
* Check for successful request (a 201 response from LinkedIn server)
|
793 |
+
* per the documentation linked in method comments above.
|
794 |
+
*/
|
795 |
+
return $this->checkResponse(201, $response);
|
796 |
+
}
|
797 |
+
|
798 |
+
/**
|
799 |
+
* Follows/Unfollows the specified post.
|
800 |
+
*
|
801 |
+
* https://developer.linkedin.com/documents/groups-api
|
802 |
+
*
|
803 |
+
* @param str $pid
|
804 |
+
* The post id.
|
805 |
+
* @param bool $follow
|
806 |
+
* Determines whether to follow or unfollow the post. TRUE = follow, FALSE = unfollow
|
807 |
+
*
|
808 |
+
* @return arr
|
809 |
+
* Array containing retrieval success, LinkedIn response.
|
810 |
+
*/
|
811 |
+
|
812 |
+
public function followPost($pid, $follow) {
|
813 |
+
if(!is_string($pid)) {
|
814 |
+
throw new LinkedInException('LinkedIn->followPost(): bad data passed, $pid must be of type string');
|
815 |
+
}
|
816 |
+
if(!($follow === TRUE || $follow === FALSE)) {
|
817 |
+
throw new LinkedInException('LinkedIn->followPost(): bad data passed, $follow must be of type boolean');
|
818 |
+
}
|
819 |
+
|
820 |
+
// construct the XML
|
821 |
+
$data = '<?xml version="1.0" encoding="UTF-8"?>
|
822 |
+
<is-following>'. (($follow) ? 'true' : 'false'). '</is-following>';
|
823 |
+
|
824 |
+
// construct and send the request
|
825 |
+
$query = self::_URL_API . '/v1/posts/' . trim($pid) . '/relation-to-viewer/is-following';
|
826 |
+
$response = $this->fetch('PUT', $query, $data);
|
827 |
+
|
828 |
+
/**
|
829 |
+
* Check for successful request (a 204 response from LinkedIn server)
|
830 |
+
* per the documentation linked in method comments above.
|
831 |
+
*/
|
832 |
+
return $this->checkResponse(204, $response);
|
833 |
+
}
|
834 |
+
|
835 |
+
/**
|
836 |
+
* Get list of companies you follow.
|
837 |
+
*
|
838 |
+
* Returns a list of companies the current user is currently following, per:
|
839 |
+
*
|
840 |
+
* http://developer.linkedin.com/docs/DOC-1324
|
841 |
+
*
|
842 |
+
* @return arr
|
843 |
+
* Array containing retrieval success, LinkedIn response.
|
844 |
+
*/
|
845 |
+
public function followedCompanies() {
|
846 |
+
// construct and send the request
|
847 |
+
$query = self::_URL_API . '/v1/people/~/following/companies';
|
848 |
+
$response = $this->fetch('GET', $query);
|
849 |
+
|
850 |
+
/**
|
851 |
+
* Check for successful request (a 200 response from LinkedIn server)
|
852 |
+
* per the documentation linked in method comments above.
|
853 |
+
*/
|
854 |
+
return $this->checkResponse(200, $response);
|
855 |
+
}
|
856 |
+
|
857 |
+
/**
|
858 |
+
* Get the application_key property.
|
859 |
+
*
|
860 |
+
* @return str
|
861 |
+
* The application key.
|
862 |
+
*/
|
863 |
+
public function getApplicationKey() {
|
864 |
+
return $this->application_key;
|
865 |
+
}
|
866 |
+
|
867 |
+
/**
|
868 |
+
* Get the application_secret property.
|
869 |
+
*
|
870 |
+
* @return str
|
871 |
+
* The application secret.
|
872 |
+
*/
|
873 |
+
public function getApplicationSecret() {
|
874 |
+
return $this->application_secret;
|
875 |
+
}
|
876 |
+
|
877 |
+
/**
|
878 |
+
* Get the callback property.
|
879 |
+
*
|
880 |
+
* @return str
|
881 |
+
* The callback url.
|
882 |
+
*/
|
883 |
+
public function getCallbackUrl() {
|
884 |
+
return $this->callback;
|
885 |
+
}
|
886 |
+
|
887 |
+
/**
|
888 |
+
* Get the response_format property.
|
889 |
+
*
|
890 |
+
* @return str
|
891 |
+
* The response format.
|
892 |
+
*/
|
893 |
+
public function getResponseFormat() {
|
894 |
+
return $this->response_format;
|
895 |
+
}
|
896 |
+
|
897 |
+
/**
|
898 |
+
* Get the token_access property.
|
899 |
+
*
|
900 |
+
* @return arr
|
901 |
+
* The access token.
|
902 |
+
*/
|
903 |
+
public function getToken() {
|
904 |
+
return $this->token;
|
905 |
+
}
|
906 |
+
|
907 |
+
/**
|
908 |
+
* [DEPRECATED] Get the token_access property.
|
909 |
+
*
|
910 |
+
* @return arr
|
911 |
+
* The access token.
|
912 |
+
*/
|
913 |
+
public function getTokenAccess() {
|
914 |
+
return $this->getToken();
|
915 |
+
}
|
916 |
+
|
917 |
+
/**
|
918 |
+
*
|
919 |
+
* Get information about a specific group.
|
920 |
+
*
|
921 |
+
* http://developer.linkedin.com/documents/groups-api
|
922 |
+
*
|
923 |
+
* @param str $gid
|
924 |
+
* The group id.
|
925 |
+
*
|
926 |
+
* @param str $options
|
927 |
+
* [OPTIONAL] Field selectors for the group.
|
928 |
+
*
|
929 |
+
* @return arr
|
930 |
+
* Array containing retrieval success, LinkedIn response.
|
931 |
+
*/
|
932 |
+
|
933 |
+
public function group($gid, $options = '') {
|
934 |
+
if(!is_string($gid)){
|
935 |
+
throw new LinkedInException('LinkedIn->group(): bad data passed, $gid must be of type string.');
|
936 |
+
}
|
937 |
+
if(!is_string($options)) {
|
938 |
+
throw new LinkedInException('LinkedIn->group(): bad data passed, $options must be of type string');
|
939 |
+
}
|
940 |
+
|
941 |
+
// construct and send the request
|
942 |
+
$query = self::_URL_API . '/v1/groups/' . trim($gid) . trim($options);
|
943 |
+
$response = $this->fetch('GET', $query);
|
944 |
+
|
945 |
+
/**
|
946 |
+
* Check for successful request (a 200 response from LinkedIn server)
|
947 |
+
* per the documentation linked in method comments above.
|
948 |
+
*/
|
949 |
+
return $this->checkResponse(200, $response);
|
950 |
+
}
|
951 |
+
|
952 |
+
/**
|
953 |
+
* This returns all the groups the user is a member of.
|
954 |
+
*
|
955 |
+
* http://developer.linkedin.com/documents/groups-api
|
956 |
+
*
|
957 |
+
* @param str $options
|
958 |
+
* [OPTIONAL] Field selectors for the groups.
|
959 |
+
*
|
960 |
+
* @return arr
|
961 |
+
* Array containing retrieval success, LinkedIn response.
|
962 |
+
*/
|
963 |
+
public function groupMemberships($options = '') {
|
964 |
+
if(!is_string($options)) {
|
965 |
+
throw new LinkedInException('LinkedIn->groupMemberships(): bad data passed, $options must be of type string');
|
966 |
+
}
|
967 |
+
|
968 |
+
// construct and send the request
|
969 |
+
$query = self::_URL_API . '/v1/people/~/group-memberships' . trim($options) . '?membership-state=member';
|
970 |
+
$response = $this->fetch('GET', $query);
|
971 |
+
|
972 |
+
/**
|
973 |
+
* Check for successful request (a 200 response from LinkedIn server)
|
974 |
+
* per the documentation linked in method comments above.
|
975 |
+
*/
|
976 |
+
return $this->checkResponse(200, $response);
|
977 |
+
}
|
978 |
+
|
979 |
+
/**
|
980 |
+
* This gets a specified post made within a group.
|
981 |
+
*
|
982 |
+
* http://developer.linkedin.com/documents/groups-api
|
983 |
+
*
|
984 |
+
* @param str $pid
|
985 |
+
* The post id.
|
986 |
+
* @param str $options
|
987 |
+
* [OPTIONAL] Field selectors for the post.
|
988 |
+
*
|
989 |
+
* @return arr
|
990 |
+
* Array containing retrieval success, LinkedIn response.
|
991 |
+
*/
|
992 |
+
public function groupPost($pid, $options = '') {
|
993 |
+
if(!is_string($pid)) {
|
994 |
+
throw new LinkedInException('LinkedIn->groupPost(): bad data passed, $pid must be of type string.');
|
995 |
+
}
|
996 |
+
if(!is_string($options)) {
|
997 |
+
throw new LinkedInException('LinkedIn->groupPost(): bad data passed, $options must be of type string.');
|
998 |
+
}
|
999 |
+
|
1000 |
+
// construct and send the request
|
1001 |
+
$query = self::_URL_API . '/v1/posts/' . trim($pid) . trim($options);
|
1002 |
+
$response = $this->fetch('GET', $query);
|
1003 |
+
|
1004 |
+
/**
|
1005 |
+
* Check for successful request (a 200 response from LinkedIn server)
|
1006 |
+
* per the documentation linked in method comments above.
|
1007 |
+
*/
|
1008 |
+
return $this->checkResponse(200, $response);
|
1009 |
+
}
|
1010 |
+
|
1011 |
+
/**
|
1012 |
+
* This returns all the comments made on the specified post within a group.
|
1013 |
+
*
|
1014 |
+
* http://developer.linkedin.com/documents/groups-api
|
1015 |
+
*
|
1016 |
+
* @param str $pid
|
1017 |
+
* The post id.
|
1018 |
+
* @param str $options
|
1019 |
+
* [OPTIONAL] Field selectors for the post comments.
|
1020 |
+
*
|
1021 |
+
* @return arr
|
1022 |
+
* Array containing retrieval success, LinkedIn response.
|
1023 |
+
*/
|
1024 |
+
public function groupPostComments($pid, $options = ''){
|
1025 |
+
if(!is_string($pid)){
|
1026 |
+
throw new LinkedInException('LinkedIn->groupPostComments(): bad data passed, $pid must be of type string.');
|
1027 |
+
}
|
1028 |
+
if(!is_string($options)) {
|
1029 |
+
throw new LinkedInException('LinkedIn->groupPostComments(): bad data passed, $options must be of type string.');
|
1030 |
+
}
|
1031 |
+
|
1032 |
+
// construct and send the request
|
1033 |
+
$query = self::_URL_API . '/v1/posts/' . trim($pid) . '/comments' . trim($options);
|
1034 |
+
$response = $this->fetch('GET', $query);
|
1035 |
+
|
1036 |
+
/**
|
1037 |
+
* Check for successful request (a 200 response from LinkedIn server)
|
1038 |
+
* per the documentation linked in method comments above.
|
1039 |
+
*/
|
1040 |
+
return $this->checkResponse(200, $response);
|
1041 |
+
}
|
1042 |
+
|
1043 |
+
/**
|
1044 |
+
* This returns all the posts within a group.
|
1045 |
+
*
|
1046 |
+
* http://developer.linkedin.com/documents/groups-api
|
1047 |
+
*
|
1048 |
+
* @param str $gid
|
1049 |
+
* The group id.
|
1050 |
+
*
|
1051 |
+
* @return arr
|
1052 |
+
* Array containing retrieval success, LinkedIn response.
|
1053 |
+
*/
|
1054 |
+
public function groupPosts($gid, $options = '') {
|
1055 |
+
if(!is_string($gid)){
|
1056 |
+
throw new LinkedInException('LinkedIn->groupPosts(): bad data passed, $gid must be of type string');
|
1057 |
+
}
|
1058 |
+
if(!is_string($options)){
|
1059 |
+
throw new LinkedInException('LinkedIn->groupPosts(): bad data passed, $options must be of type string');
|
1060 |
+
}
|
1061 |
+
|
1062 |
+
// construct and send the request
|
1063 |
+
$query = self::_URL_API . '/v1/groups/' . trim($gid) .'/posts' . trim($options);
|
1064 |
+
$response = $this->fetch('GET', $query);
|
1065 |
+
|
1066 |
+
/**
|
1067 |
+
* Check for successful request (a 200 response from LinkedIn server)
|
1068 |
+
* per the documentation linked in method comments above.
|
1069 |
+
*/
|
1070 |
+
return $this->checkResponse(200, $response);
|
1071 |
+
}
|
1072 |
+
|
1073 |
+
/**
|
1074 |
+
* This returns the group settings of the specified group
|
1075 |
+
*
|
1076 |
+
* http://developer.linkedin.com/documents/groups-api
|
1077 |
+
*
|
1078 |
+
* @param str $gid
|
1079 |
+
* The group id.
|
1080 |
+
* @param str $options
|
1081 |
+
* [OPTIONAL] Field selectors for the group.
|
1082 |
+
*
|
1083 |
+
* @return arr
|
1084 |
+
* Array containing retrieval success, LinkedIn response.
|
1085 |
+
*/
|
1086 |
+
public function groupSettings($gid, $options = '') {
|
1087 |
+
if(!is_string($gid)) {
|
1088 |
+
throw new LinkedInException('LinkedIn->groupSettings(): bad data passed, $gid must be of type string');
|
1089 |
+
}
|
1090 |
+
if(!is_string($options)) {
|
1091 |
+
throw new LinkedInException('LinkedIn->groupSettings(): bad data passed, $options must be of type string');
|
1092 |
+
}
|
1093 |
+
|
1094 |
+
// construct and send the request
|
1095 |
+
$query = self::_URL_API . '/v1/people/~/group-memberships/' . trim($gid) . trim($options);
|
1096 |
+
$response = $this->fetch('GET', $query);
|
1097 |
+
|
1098 |
+
/**
|
1099 |
+
* Check for successful request (a 200 response from LinkedIn server)
|
1100 |
+
* per the documentation linked in method comments above.
|
1101 |
+
*/
|
1102 |
+
return $this->checkResponse(200, $response);
|
1103 |
+
}
|
1104 |
+
|
1105 |
+
/**
|
1106 |
+
* Send connection invitations.
|
1107 |
+
*
|
1108 |
+
* Send an invitation to connect to your network, either by email address or
|
1109 |
+
* by LinkedIn ID. Details on the API here:
|
1110 |
+
*
|
1111 |
+
* http://developer.linkedin.com/docs/DOC-1012
|
1112 |
+
*
|
1113 |
+
* @param str $method
|
1114 |
+
* The invitation method to process.
|
1115 |
+
* @param str $recipient
|
1116 |
+
* The email/id to send the invitation to.
|
1117 |
+
* @param str $subject
|
1118 |
+
* The subject of the invitation to send.
|
1119 |
+
* @param str $body
|
1120 |
+
* The body of the invitation to send.
|
1121 |
+
* @param str $type
|
1122 |
+
* [OPTIONAL] The invitation request type (only friend is supported at this time by the Invite API).
|
1123 |
+
*
|
1124 |
+
* @return arr
|
1125 |
+
* Array containing retrieval success, LinkedIn response.
|
1126 |
+
*/
|
1127 |
+
public function invite($method, $recipient, $subject, $body, $type = 'friend') {
|
1128 |
+
/**
|
1129 |
+
* Clean up the passed data per these rules:
|
1130 |
+
*
|
1131 |
+
* 1) Message must be sent to one recipient (only a single recipient permitted for the Invitation API)
|
1132 |
+
* 2) No HTML permitted
|
1133 |
+
* 3) 200 characters max in the invitation subject
|
1134 |
+
* 4) Only able to connect as a friend at this point
|
1135 |
+
*/
|
1136 |
+
// check passed data
|
1137 |
+
if(empty($recipient)) {
|
1138 |
+
throw new LinkedInException('LinkedIn->invite(): you must provide an invitation recipient.');
|
1139 |
+
}
|
1140 |
+
switch($method) {
|
1141 |
+
case 'email':
|
1142 |
+
if(is_array($recipient)) {
|
1143 |
+
$recipient = array_map('trim', $recipient);
|
1144 |
+
} else {
|
1145 |
+
// bad format for recipient for email method
|
1146 |
+
throw new LinkedInException('LinkedIn->invite(): invitation recipient email/name array is malformed.');
|
1147 |
+
}
|
1148 |
+
break;
|
1149 |
+
case 'id':
|
1150 |
+
$recipient = trim($recipient);
|
1151 |
+
if(!self::isId($recipient)) {
|
1152 |
+
// bad format for recipient for id method
|
1153 |
+
throw new LinkedInException('LinkedIn->invite(): invitation recipient ID does not match LinkedIn format.');
|
1154 |
+
}
|
1155 |
+
break;
|
1156 |
+
default:
|
1157 |
+
throw new LinkedInException('LinkedIn->invite(): bad invitation method, must be one of: email, id.');
|
1158 |
+
break;
|
1159 |
+
}
|
1160 |
+
if(!empty($subject)) {
|
1161 |
+
$subject = trim(htmlspecialchars(strip_tags(stripslashes($subject))));
|
1162 |
+
} else {
|
1163 |
+
throw new LinkedInException('LinkedIn->invite(): message subject is empty.');
|
1164 |
+
}
|
1165 |
+
if(!empty($body)) {
|
1166 |
+
$body = trim(htmlspecialchars(strip_tags(stripslashes($body))));
|
1167 |
+
if(strlen($body) > self::_INV_BODY_LENGTH) {
|
1168 |
+
throw new LinkedInException('LinkedIn->invite(): message body length is too long - max length is ' . self::_INV_BODY_LENGTH . ' characters.');
|
1169 |
+
}
|
1170 |
+
} else {
|
1171 |
+
throw new LinkedInException('LinkedIn->invite(): message body is empty.');
|
1172 |
+
}
|
1173 |
+
switch($type) {
|
1174 |
+
case 'friend':
|
1175 |
+
break;
|
1176 |
+
default:
|
1177 |
+
throw new LinkedInException('LinkedIn->invite(): bad invitation type, must be one of: friend.');
|
1178 |
+
break;
|
1179 |
+
}
|
1180 |
+
|
1181 |
+
// construct the xml data
|
1182 |
+
$data = '<?xml version="1.0" encoding="UTF-8"?>
|
1183 |
+
<mailbox-item>
|
1184 |
+
<recipients>
|
1185 |
+
<recipient>';
|
1186 |
+
switch($method) {
|
1187 |
+
case 'email':
|
1188 |
+
// email-based invitation
|
1189 |
+
$data .= '<person path="/people/email=' . $recipient['email'] . '">
|
1190 |
+
<first-name>' . htmlspecialchars($recipient['first-name']) . '</first-name>
|
1191 |
+
<last-name>' . htmlspecialchars($recipient['last-name']) . '</last-name>
|
1192 |
+
</person>';
|
1193 |
+
break;
|
1194 |
+
case 'id':
|
1195 |
+
// id-based invitation
|
1196 |
+
$data .= '<person path="/people/id=' . $recipient . '"/>';
|
1197 |
+
break;
|
1198 |
+
}
|
1199 |
+
$data .= ' </recipient>
|
1200 |
+
</recipients>
|
1201 |
+
<subject>' . $subject . '</subject>
|
1202 |
+
<body>' . $body . '</body>
|
1203 |
+
<item-content>
|
1204 |
+
<invitation-request>
|
1205 |
+
<connect-type>';
|
1206 |
+
switch($type) {
|
1207 |
+
case 'friend':
|
1208 |
+
$data .= 'friend';
|
1209 |
+
break;
|
1210 |
+
}
|
1211 |
+
$data .= ' </connect-type>';
|
1212 |
+
switch($method) {
|
1213 |
+
case 'id':
|
1214 |
+
// id-based invitation, we need to get the authorization information
|
1215 |
+
$query = 'id=' . $recipient . ':(api-standard-profile-request)';
|
1216 |
+
$response = self::profile($query);
|
1217 |
+
if($response['info']['http_code'] == 200) {
|
1218 |
+
$response['linkedin'] = self::xmlToArray($response['linkedin']);
|
1219 |
+
if($response['linkedin'] === FALSE) {
|
1220 |
+
// bad XML data
|
1221 |
+
throw new LinkedInException('LinkedIn->invite(): LinkedIn returned bad XML data.');
|
1222 |
+
}
|
1223 |
+
$authentication = explode(':', $response['linkedin']['person']['children']['api-standard-profile-request']['children']['headers']['children']['http-header']['children']['value']['content']);
|
1224 |
+
|
1225 |
+
// complete the xml
|
1226 |
+
$data .= '<authorization>
|
1227 |
+
<name>' . $authentication[0] . '</name>
|
1228 |
+
<value>' . $authentication[1] . '</value>
|
1229 |
+
</authorization>';
|
1230 |
+
} else {
|
1231 |
+
// bad response from the profile request, not a valid ID?
|
1232 |
+
throw new LinkedInException('LinkedIn->invite(): could not send invitation, LinkedIn says: ' . print_r($response['linkedin'], TRUE));
|
1233 |
+
}
|
1234 |
+
break;
|
1235 |
+
}
|
1236 |
+
$data .= ' </invitation-request>
|
1237 |
+
</item-content>
|
1238 |
+
</mailbox-item>';
|
1239 |
+
|
1240 |
+
// send request
|
1241 |
+
$query = self::_URL_API . '/v1/people/~/mailbox';
|
1242 |
+
$response = $this->fetch('POST', $query, $data);
|
1243 |
+
|
1244 |
+
/**
|
1245 |
+
* Check for successful request (a 201 response from LinkedIn server)
|
1246 |
+
* per the documentation linked in method comments above.
|
1247 |
+
*/
|
1248 |
+
return $this->checkResponse(201, $response);
|
1249 |
+
}
|
1250 |
+
|
1251 |
+
/**
|
1252 |
+
* LinkedIn ID validation.
|
1253 |
+
*
|
1254 |
+
* Checks the passed string $id to see if it has a valid LinkedIn ID format,
|
1255 |
+
* which is, as of October 15th, 2010:
|
1256 |
+
*
|
1257 |
+
* 10 alpha-numeric mixed-case characters, plus underscores and dashes.
|
1258 |
+
*
|
1259 |
+
* @param str $id
|
1260 |
+
* A possible LinkedIn ID.
|
1261 |
+
*
|
1262 |
+
* @return bool
|
1263 |
+
* TRUE/FALSE depending on valid ID format determination.
|
1264 |
+
*/
|
1265 |
+
public static function isId($id) {
|
1266 |
+
// check passed data
|
1267 |
+
if(!is_string($id)) {
|
1268 |
+
// bad data passed
|
1269 |
+
throw new LinkedInException('LinkedIn->isId(): bad data passed, $id must be of type string.');
|
1270 |
+
}
|
1271 |
+
|
1272 |
+
$pattern = '/^[a-z0-9_\-]{10}$/i';
|
1273 |
+
if($match = preg_match($pattern, $id)) {
|
1274 |
+
// we have a match
|
1275 |
+
$return_data = TRUE;
|
1276 |
+
} else {
|
1277 |
+
// no match
|
1278 |
+
$return_data = FALSE;
|
1279 |
+
}
|
1280 |
+
return $return_data;
|
1281 |
+
}
|
1282 |
+
|
1283 |
+
/**
|
1284 |
+
* Throttling check.
|
1285 |
+
*
|
1286 |
+
* Checks the passed LinkedIn response to see if we have hit a throttling
|
1287 |
+
* limit:
|
1288 |
+
*
|
1289 |
+
* http://developer.linkedin.com/docs/DOC-1112
|
1290 |
+
*
|
1291 |
+
* @param arr $response
|
1292 |
+
* The LinkedIn response.
|
1293 |
+
*
|
1294 |
+
* @return bool
|
1295 |
+
* TRUE/FALSE depending on content of response.
|
1296 |
+
*/
|
1297 |
+
public static function isThrottled($response) {
|
1298 |
+
$return_data = FALSE;
|
1299 |
+
|
1300 |
+
// check the variable
|
1301 |
+
if(!empty($response) && is_string($response)) {
|
1302 |
+
// we have an array and have a properly formatted LinkedIn response
|
1303 |
+
|
1304 |
+
// store the response in a temp variable
|
1305 |
+
$temp_response = self::xmlToArray($response);
|
1306 |
+
if($temp_response !== FALSE) {
|
1307 |
+
// check to see if we have an error
|
1308 |
+
if(array_key_exists('error', $temp_response) && ($temp_response['error']['children']['status']['content'] == 403) && preg_match('/throttle/i', $temp_response['error']['children']['message']['content'])) {
|
1309 |
+
// we have an error, it is 403 and we have hit a throttle limit
|
1310 |
+
$return_data = TRUE;
|
1311 |
+
}
|
1312 |
+
}
|
1313 |
+
}
|
1314 |
+
return $return_data;
|
1315 |
+
}
|
1316 |
+
|
1317 |
+
/**
|
1318 |
+
* Job posting detail info retrieval function.
|
1319 |
+
*
|
1320 |
+
* The Jobs API returns detailed information about job postings on LinkedIn.
|
1321 |
+
* Find the job summary, description, location, and apply our professional graph
|
1322 |
+
* to present the relationship between the current member and the job poster or
|
1323 |
+
* hiring manager.
|
1324 |
+
*
|
1325 |
+
* http://developer.linkedin.com/docs/DOC-1322
|
1326 |
+
*
|
1327 |
+
* @param str $jid
|
1328 |
+
* ID of the job you want to look up.
|
1329 |
+
* @param str $options
|
1330 |
+
* [OPTIONAL] Data retrieval options.
|
1331 |
+
*
|
1332 |
+
* @return arr
|
1333 |
+
* Array containing retrieval success, LinkedIn response.
|
1334 |
+
*/
|
1335 |
+
public function job($jid, $options = '') {
|
1336 |
+
// check passed data
|
1337 |
+
if(!is_string($jid)) {
|
1338 |
+
// bad data passed
|
1339 |
+
throw new LinkedInException('LinkedIn->job(): bad data passed, $jid must be of type string.');
|
1340 |
+
}
|
1341 |
+
if(!is_string($options)) {
|
1342 |
+
// bad data passed
|
1343 |
+
throw new LinkedInException('LinkedIn->job(): bad data passed, $options must be of type string.');
|
1344 |
+
}
|
1345 |
+
|
1346 |
+
// construct and send the request
|
1347 |
+
$query = self::_URL_API . '/v1/jobs/' . trim($jid) . trim($options);
|
1348 |
+
$response = $this->fetch('GET', $query);
|
1349 |
+
|
1350 |
+
/**
|
1351 |
+
* Check for successful request (a 200 response from LinkedIn server)
|
1352 |
+
* per the documentation linked in method comments above.
|
1353 |
+
*/
|
1354 |
+
return $this->checkResponse(200, $response);
|
1355 |
+
}
|
1356 |
+
|
1357 |
+
/**
|
1358 |
+
* Join the specified group, per:
|
1359 |
+
*
|
1360 |
+
* http://developer.linkedin.com/documents/groups-api
|
1361 |
+
*
|
1362 |
+
* @param str $gid
|
1363 |
+
* The group id.
|
1364 |
+
*
|
1365 |
+
* @return arr
|
1366 |
+
* Array containing retrieval success, LinkedIn response.
|
1367 |
+
*/
|
1368 |
+
public function joinGroup($gid) {
|
1369 |
+
if(!is_string($gid)) {
|
1370 |
+
throw new LinkedInException('LinkedIn->joinGroup(): bad data passed, $gid must be of type string.');
|
1371 |
+
}
|
1372 |
+
|
1373 |
+
// constructing the XML
|
1374 |
+
$data = '<?xml version="1.0" encoding="UTF-8"?>
|
1375 |
+
<group-membership>
|
1376 |
+
<membership-state>
|
1377 |
+
<code>member</code>
|
1378 |
+
</membership-state>
|
1379 |
+
</group-membership>';
|
1380 |
+
|
1381 |
+
// construct and send the request
|
1382 |
+
$query = self::_URL_API . '/v1/people/~/group-memberships/' . trim($gid);
|
1383 |
+
$response = $this->fetch('PUT', $query, $data);
|
1384 |
+
|
1385 |
+
/**
|
1386 |
+
* Check for successful request (a 200 or 201 response from LinkedIn server)
|
1387 |
+
* per the documentation linked in method comments above.
|
1388 |
+
*/
|
1389 |
+
return $this->checkResponse(array(200, 201), $response);
|
1390 |
+
}
|
1391 |
+
|
1392 |
+
/**
|
1393 |
+
* Returns the last request header from the previous call to the
|
1394 |
+
* LinkedIn API.
|
1395 |
+
*
|
1396 |
+
* @returns str
|
1397 |
+
* The header, in string format.
|
1398 |
+
*/
|
1399 |
+
public function lastRequestHeader() {
|
1400 |
+
return $this->last_request_headers;
|
1401 |
+
}
|
1402 |
+
|
1403 |
+
/**
|
1404 |
+
* Returns the last request url from the previous call to the
|
1405 |
+
* LinkedIn API.
|
1406 |
+
*
|
1407 |
+
* @returns str
|
1408 |
+
* The url, in string format.
|
1409 |
+
*/
|
1410 |
+
public function lastRequestUrl() {
|
1411 |
+
return $this->last_request_url;
|
1412 |
+
}
|
1413 |
+
|
1414 |
+
/**
|
1415 |
+
* Leave the specified group, per:.
|
1416 |
+
*
|
1417 |
+
* http://developer.linkedin.com/documents/groups-api
|
1418 |
+
*
|
1419 |
+
* @param str $gid
|
1420 |
+
* The group id.
|
1421 |
+
*
|
1422 |
+
* @return arr
|
1423 |
+
* Array containing retrieval success, LinkedIn response.
|
1424 |
+
*/
|
1425 |
+
public function leaveGroup($gid){
|
1426 |
+
if(!is_string($gid)) {
|
1427 |
+
throw new LinkedInException('LinkedIn->leaveGroup(): bad data passed, $gid must be of type string');
|
1428 |
+
}
|
1429 |
+
|
1430 |
+
// construct and send the request
|
1431 |
+
$query = self::_URL_API . '/v1/people/~/group-memberships/' .trim($gid);
|
1432 |
+
$response = $this->fetch('DELETE', $query);
|
1433 |
+
|
1434 |
+
/**
|
1435 |
+
* Check for successful request (a 204 response from LinkedIn server)
|
1436 |
+
* per the documentation linked in method comments above.
|
1437 |
+
*/
|
1438 |
+
return $this->checkResponse(204, $response);
|
1439 |
+
}
|
1440 |
+
|
1441 |
+
/**
|
1442 |
+
* Like another user's network update, per:
|
1443 |
+
*
|
1444 |
+
* http://developer.linkedin.com/docs/DOC-1043
|
1445 |
+
*
|
1446 |
+
* @param str $uid
|
1447 |
+
* The LinkedIn update ID.
|
1448 |
+
*
|
1449 |
+
* @return arr
|
1450 |
+
* Array containing retrieval success, LinkedIn response.
|
1451 |
+
*/
|
1452 |
+
public function like($uid) {
|
1453 |
+
// check passed data
|
1454 |
+
if(!is_string($uid)) {
|
1455 |
+
// bad data passed
|
1456 |
+
throw new LinkedInException('LinkedIn->like(): bad data passed, $uid must be of type string.');
|
1457 |
+
}
|
1458 |
+
|
1459 |
+
// construct the XML
|
1460 |
+
$data = '<?xml version="1.0" encoding="UTF-8"?>
|
1461 |
+
<is-liked>true</is-liked>';
|
1462 |
+
|
1463 |
+
// construct and send the request
|
1464 |
+
$query = self::_URL_API . '/v1/people/~/network/updates/key=' . $uid . '/is-liked';
|
1465 |
+
$response = $this->fetch('PUT', $query, $data);
|
1466 |
+
|
1467 |
+
/**
|
1468 |
+
* Check for successful request (a 201 response from LinkedIn server)
|
1469 |
+
* per the documentation linked in method comments above.
|
1470 |
+
*/
|
1471 |
+
return $this->checkResponse(201, $response);
|
1472 |
+
}
|
1473 |
+
|
1474 |
+
/**
|
1475 |
+
* Likes/unlikes the specified post, per:
|
1476 |
+
*
|
1477 |
+
* http://developer.linkedin.com/documents/groups-api
|
1478 |
+
*
|
1479 |
+
* @param str $pid
|
1480 |
+
* The post id.
|
1481 |
+
* @param bool $like
|
1482 |
+
* Determines whether to like or unlike. TRUE = like, FALSE = unlike.
|
1483 |
+
*
|
1484 |
+
* @return arr
|
1485 |
+
* Array containing retrieval success, LinkedIn response.
|
1486 |
+
*/
|
1487 |
+
public function likePost($pid, $like) {
|
1488 |
+
if(!is_string($pid)) {
|
1489 |
+
throw new LinkedInException ('LinkedIn->likePost(): bad data passed, $pid must be of type string');
|
1490 |
+
}
|
1491 |
+
if(!($like === TRUE || $like === FALSE)) {
|
1492 |
+
throw new LinkedInException('LinkedIn->likePost(): bad data passed, $like must be of type boolean');
|
1493 |
+
}
|
1494 |
+
|
1495 |
+
// construct the XML
|
1496 |
+
$data = '<?xml version="1.0" encoding="UTF-8"?>
|
1497 |
+
<is-liked>'.(($like) ? 'true': 'false').'</is-liked>';
|
1498 |
+
|
1499 |
+
// construct and send the request
|
1500 |
+
$query = self::_URL_API . '/v1/posts/' . trim($pid) . '/relation-to-viewer/is-liked';
|
1501 |
+
$response = $this->fetch('PUT', $query, $data);
|
1502 |
+
|
1503 |
+
/**
|
1504 |
+
* Check for successful request (a 204 response from LinkedIn server)
|
1505 |
+
* per the documentation linked in method comments above.
|
1506 |
+
*/
|
1507 |
+
return $this->checkResponse(204, $response);
|
1508 |
+
}
|
1509 |
+
|
1510 |
+
/**
|
1511 |
+
* Retrieve network update likes.
|
1512 |
+
*
|
1513 |
+
* Return all likes associated with a given network update:
|
1514 |
+
*
|
1515 |
+
* http://developer.linkedin.com/docs/DOC-1043
|
1516 |
+
*
|
1517 |
+
* @param str $uid
|
1518 |
+
* The LinkedIn update ID.
|
1519 |
+
*
|
1520 |
+
* @return arr
|
1521 |
+
* Array containing retrieval success, LinkedIn response.
|
1522 |
+
*/
|
1523 |
+
public function likes($uid) {
|
1524 |
+
// check passed data
|
1525 |
+
if(!is_string($uid)) {
|
1526 |
+
// bad data passed
|
1527 |
+
throw new LinkedInException('LinkedIn->likes(): bad data passed, $uid must be of type string.');
|
1528 |
+
}
|
1529 |
+
|
1530 |
+
// construct and send the request
|
1531 |
+
$query = self::_URL_API . '/v1/people/~/network/updates/key=' . $uid . '/likes';
|
1532 |
+
$response = $this->fetch('GET', $query);
|
1533 |
+
|
1534 |
+
/**
|
1535 |
+
* Check for successful request (a 200 response from LinkedIn server)
|
1536 |
+
* per the documentation linked in method comments above.
|
1537 |
+
*/
|
1538 |
+
return $this->checkResponse(200, $response);
|
1539 |
+
}
|
1540 |
+
|
1541 |
+
/**
|
1542 |
+
* Connection messaging method.
|
1543 |
+
*
|
1544 |
+
* Send a message to your network connection(s), optionally copying yourself.
|
1545 |
+
* Full details from LinkedIn on this functionality can be found here:
|
1546 |
+
*
|
1547 |
+
* http://developer.linkedin.com/docs/DOC-1044
|
1548 |
+
*
|
1549 |
+
* @param arr $recipients
|
1550 |
+
* The connection(s) to send the message to.
|
1551 |
+
* @param str $subject
|
1552 |
+
* The subject of the message to send.
|
1553 |
+
* @param str $body
|
1554 |
+
* The body of the message to send.
|
1555 |
+
* @param bool $copy_self
|
1556 |
+
* [OPTIONAL] Also update the teathered Twitter account.
|
1557 |
+
*
|
1558 |
+
* @return arr
|
1559 |
+
* Array containing retrieval success, LinkedIn response.
|
1560 |
+
*/
|
1561 |
+
public function message($recipients, $subject, $body, $copy_self = FALSE) {
|
1562 |
+
/**
|
1563 |
+
* Clean up the passed data per these rules:
|
1564 |
+
*
|
1565 |
+
* 1) Message must be sent to at least one recipient
|
1566 |
+
* 2) No HTML permitted
|
1567 |
+
*/
|
1568 |
+
if(!empty($subject) && is_string($subject)) {
|
1569 |
+
$subject = trim(strip_tags(stripslashes($subject)));
|
1570 |
+
} else {
|
1571 |
+
throw new LinkedInException('LinkedIn->message(): bad data passed, $subject must be of type string.');
|
1572 |
+
}
|
1573 |
+
if(!empty($body) && is_string($body)) {
|
1574 |
+
$body = trim(strip_tags(stripslashes($body)));
|
1575 |
+
} else {
|
1576 |
+
throw new LinkedInException('LinkedIn->message(): bad data passed, $body must be of type string.');
|
1577 |
+
}
|
1578 |
+
if(!is_array($recipients) || count($recipients) < 1) {
|
1579 |
+
// no recipients, and/or bad data
|
1580 |
+
throw new LinkedInException('LinkedIn->message(): at least one message recipient required.');
|
1581 |
+
}
|
1582 |
+
|
1583 |
+
// construct the xml data
|
1584 |
+
$data = '<?xml version="1.0" encoding="UTF-8"?>
|
1585 |
+
<mailbox-item>
|
1586 |
+
<recipients>';
|
1587 |
+
$data .= ($copy_self) ? '<recipient><person path="/people/~"/></recipient>' : '';
|
1588 |
+
for($i = 0; $i < count($recipients); $i++) {
|
1589 |
+
if(is_string($recipients[$i])) {
|
1590 |
+
$data .= '<recipient><person path="/people/' . trim($recipients[$i]) . '"/></recipient>';
|
1591 |
+
} else {
|
1592 |
+
throw new LinkedInException ('LinkedIn->message(): bad data passed, $recipients must be an array of type string.');
|
1593 |
+
}
|
1594 |
+
}
|
1595 |
+
$data .= ' </recipients>
|
1596 |
+
<subject>' . htmlspecialchars($subject) . '</subject>
|
1597 |
+
<body>' . htmlspecialchars($body) . '</body>
|
1598 |
+
</mailbox-item>';
|
1599 |
+
|
1600 |
+
// send request
|
1601 |
+
$query = self::_URL_API . '/v1/people/~/mailbox';
|
1602 |
+
$response = $this->fetch('POST', $query, $data);
|
1603 |
+
|
1604 |
+
/**
|
1605 |
+
* Check for successful request (a 201 response from LinkedIn server)
|
1606 |
+
* per the documentation linked in method comments above.
|
1607 |
+
*/
|
1608 |
+
return $this->checkResponse(201, $response);
|
1609 |
+
}
|
1610 |
+
|
1611 |
+
/**
|
1612 |
+
* Job posting method.
|
1613 |
+
*
|
1614 |
+
* Post a job to LinkedIn, assuming that you have access to this feature.
|
1615 |
+
* Full details from LinkedIn on this functionality can be found here:
|
1616 |
+
*
|
1617 |
+
* http://developer.linkedin.com/community/jobs?view=documents
|
1618 |
+
*
|
1619 |
+
* @param str $xml
|
1620 |
+
* The XML defining a job to post.
|
1621 |
+
*
|
1622 |
+
* @return arr
|
1623 |
+
* Array containing retrieval success, LinkedIn response.
|
1624 |
+
*/
|
1625 |
+
public function postJob($xml) {
|
1626 |
+
// check passed data
|
1627 |
+
if(is_string($xml)) {
|
1628 |
+
$xml = trim(stripslashes($xml));
|
1629 |
+
} else {
|
1630 |
+
throw new LinkedInException('LinkedIn->postJob(): bad data passed, $xml must be of type string.');
|
1631 |
+
}
|
1632 |
+
|
1633 |
+
// construct and send the request
|
1634 |
+
$query = self::_URL_API . '/v1/jobs';
|
1635 |
+
$response = $this->fetch('POST', $query, $xml);
|
1636 |
+
|
1637 |
+
/**
|
1638 |
+
* Check for successful request (a 201 response from LinkedIn server)
|
1639 |
+
* per the documentation linked in method comments above.
|
1640 |
+
*/
|
1641 |
+
return $this->checkResponse(201, $response);
|
1642 |
+
}
|
1643 |
+
|
1644 |
+
/**
|
1645 |
+
* General profile retrieval function.
|
1646 |
+
*
|
1647 |
+
* Takes a string of parameters as input and requests profile data from the
|
1648 |
+
* Linkedin Profile API. See the official documentation for $options
|
1649 |
+
* 'field selector' formatting:
|
1650 |
+
*
|
1651 |
+
* http://developer.linkedin.com/docs/DOC-1014
|
1652 |
+
* http://developer.linkedin.com/docs/DOC-1002
|
1653 |
+
*
|
1654 |
+
* @param str $options
|
1655 |
+
* [OPTIONAL] Data retrieval options.
|
1656 |
+
*
|
1657 |
+
* @return arr
|
1658 |
+
* Array containing retrieval success, LinkedIn response.
|
1659 |
+
*/
|
1660 |
+
public function profile($options = '~') {
|
1661 |
+
// check passed data
|
1662 |
+
if(!is_string($options)) {
|
1663 |
+
// bad data passed
|
1664 |
+
throw new LinkedInException('LinkedIn->profile(): bad data passed, $options must be of type string.');
|
1665 |
+
}
|
1666 |
+
|
1667 |
+
// construct and send the request
|
1668 |
+
$query = self::_URL_API . '/v1/people/' . trim($options);
|
1669 |
+
$response = $this->fetch('GET', $query);
|
1670 |
+
|
1671 |
+
/**
|
1672 |
+
* Check for successful request (a 200 response from LinkedIn server)
|
1673 |
+
* per the documentation linked in method comments above.
|
1674 |
+
*/
|
1675 |
+
return $this->checkResponse(200, $response);
|
1676 |
+
}
|
1677 |
+
|
1678 |
+
/**
|
1679 |
+
* Manual API call method, allowing for support for un-implemented API
|
1680 |
+
* functionality to be supported.
|
1681 |
+
*
|
1682 |
+
* @param str $method
|
1683 |
+
* The data communication method.
|
1684 |
+
* @param str $url
|
1685 |
+
* The Linkedin API endpoint to connect with - should NOT include the
|
1686 |
+
* leading https://api.linkedin.com/v1.
|
1687 |
+
* @param str $body
|
1688 |
+
* [OPTIONAL] The URL-encoded body data to send to LinkedIn with the request.
|
1689 |
+
*
|
1690 |
+
* @return arr
|
1691 |
+
* Array containing retrieval information, LinkedIn response. Note that you
|
1692 |
+
* must manually check the return code and compare this to the expected
|
1693 |
+
* API response to determine if the raw call was successful.
|
1694 |
+
*/
|
1695 |
+
public function raw($method, $url, $body = NULL) {
|
1696 |
+
if(!is_string($method)) {
|
1697 |
+
// bad data passed
|
1698 |
+
throw new LinkedInException('LinkedIn->raw(): bad data passed, $method must be of string value.');
|
1699 |
+
}
|
1700 |
+
if(!is_string($url)) {
|
1701 |
+
// bad data passed
|
1702 |
+
throw new LinkedInException('LinkedIn->raw(): bad data passed, $url must be of string value.');
|
1703 |
+
}
|
1704 |
+
if(!is_null($body) && !is_string($url)) {
|
1705 |
+
// bad data passed
|
1706 |
+
throw new LinkedInException('LinkedIn->raw(): bad data passed, $body must be of string value.');
|
1707 |
+
}
|
1708 |
+
|
1709 |
+
// construct and send the request
|
1710 |
+
$query = self::_URL_API . '/v1' . trim($url);
|
1711 |
+
return $this->fetch($method, $query, $body);
|
1712 |
+
}
|
1713 |
+
|
1714 |
+
/**
|
1715 |
+
* This removes the specified group from the group suggestions, per:
|
1716 |
+
*
|
1717 |
+
* http://developer.linkedin.com/documents/groups-api
|
1718 |
+
*
|
1719 |
+
* @param str $gid
|
1720 |
+
* The group id.
|
1721 |
+
*
|
1722 |
+
* @return arr
|
1723 |
+
* Array containing retrieval success, LinkedIn response.
|
1724 |
+
*/
|
1725 |
+
public function removeSuggestedGroup($gid) {
|
1726 |
+
if(!is_string($gid)) {
|
1727 |
+
throw new LinkedInException('LinkedIn->removeSuggestedGroup(): bad data passed, $gid must be of type string');
|
1728 |
+
}
|
1729 |
+
|
1730 |
+
// construct and send the request
|
1731 |
+
$query = self::_URL_API . '/v1/people/~/suggestions/groups/' .trim($gid);
|
1732 |
+
$response = $this->fetch('DELETE', $query);
|
1733 |
+
|
1734 |
+
/**
|
1735 |
+
* Check for successful request (a 204 response from LinkedIn server)
|
1736 |
+
* per the documentation linked in method comments above.
|
1737 |
+
*/
|
1738 |
+
return $this->checkResponse(204, $response);
|
1739 |
+
}
|
1740 |
+
|
1741 |
+
/**
|
1742 |
+
* Renew a job.
|
1743 |
+
*
|
1744 |
+
* Calling this method causes the passed job to be renewed, per:
|
1745 |
+
*
|
1746 |
+
* http://developer.linkedin.com/docs/DOC-1154
|
1747 |
+
*
|
1748 |
+
* @param str $jid
|
1749 |
+
* Job ID you want to renew.
|
1750 |
+
* @param str $cid
|
1751 |
+
* Contract ID that covers the passed Job ID.
|
1752 |
+
*
|
1753 |
+
* @return arr
|
1754 |
+
* Array containing retrieval success, LinkedIn response.
|
1755 |
+
*/
|
1756 |
+
public function renewJob($jid, $cid) {
|
1757 |
+
// check passed data
|
1758 |
+
if(!is_string($jid)) {
|
1759 |
+
// bad data passed
|
1760 |
+
throw new LinkedInException('LinkedIn->renewJob(): bad data passed, $jid must be of string value.');
|
1761 |
+
}
|
1762 |
+
if(!is_string($cid)) {
|
1763 |
+
// bad data passed
|
1764 |
+
throw new LinkedInException('LinkedIn->renewJob(): bad data passed, $cid must be of string value.');
|
1765 |
+
}
|
1766 |
+
|
1767 |
+
// construct the xml data
|
1768 |
+
$data = '<?xml version="1.0" encoding="UTF-8"?>
|
1769 |
+
<job>
|
1770 |
+
<contract-id>' . trim($cid) . '</contract-id>
|
1771 |
+
<renewal/>
|
1772 |
+
</job>';
|
1773 |
+
|
1774 |
+
// construct and send the request
|
1775 |
+
$query = self::_URL_API . '/v1/jobs/partner-job-id=' . trim($jid);
|
1776 |
+
$response = $this->fetch('PUT', $query, $data);
|
1777 |
+
|
1778 |
+
/**
|
1779 |
+
* Check for successful request (a 200 response from LinkedIn server)
|
1780 |
+
* per the documentation linked in method comments above.
|
1781 |
+
*/
|
1782 |
+
return $this->checkResponse(200, $response);
|
1783 |
+
}
|
1784 |
+
|
1785 |
+
/**
|
1786 |
+
* Access token retrieval.
|
1787 |
+
*
|
1788 |
+
* Request the user's access token from the Linkedin API.
|
1789 |
+
*
|
1790 |
+
* @param str $token
|
1791 |
+
* The token returned from the user authorization stage.
|
1792 |
+
* @param str $secret
|
1793 |
+
* The secret returned from the request token stage.
|
1794 |
+
* @param str $verifier
|
1795 |
+
* The verification value from LinkedIn.
|
1796 |
+
*
|
1797 |
+
* @return arr
|
1798 |
+
* The Linkedin OAuth/http response, in array format.
|
1799 |
+
*/
|
1800 |
+
public function retrieveTokenAccess($token, $secret, $verifier) {
|
1801 |
+
// check passed data
|
1802 |
+
if(!is_string($token) || !is_string($secret) || !is_string($verifier)) {
|
1803 |
+
// nothing passed, raise an exception
|
1804 |
+
throw new LinkedInException('LinkedIn->retrieveTokenAccess(): bad data passed, string type is required for $token, $secret and $verifier.');
|
1805 |
+
}
|
1806 |
+
|
1807 |
+
// start retrieval process
|
1808 |
+
$this->setToken(array('oauth_token' => $token, 'oauth_token_secret' => $secret));
|
1809 |
+
$parameters = array(
|
1810 |
+
'oauth_verifier' => $verifier
|
1811 |
+
);
|
1812 |
+
$response = $this->fetch(self::_METHOD_TOKENS, self::_URL_ACCESS, NULL, $parameters);
|
1813 |
+
parse_str($response['linkedin'], $response['linkedin']);
|
1814 |
+
|
1815 |
+
/**
|
1816 |
+
* Check for successful request (a 200 response from LinkedIn server)
|
1817 |
+
* per the documentation linked in method comments above.
|
1818 |
+
*/
|
1819 |
+
if($response['info']['http_code'] == 200) {
|
1820 |
+
// tokens retrieved
|
1821 |
+
$this->setToken($response['linkedin']);
|
1822 |
+
|
1823 |
+
// set the response
|
1824 |
+
$return_data = $response;
|
1825 |
+
$return_data['success'] = TRUE;
|
1826 |
+
} else {
|
1827 |
+
// error getting the request tokens
|
1828 |
+
$this->setToken(NULL);
|
1829 |
+
|
1830 |
+
// set the response
|
1831 |
+
$return_data = $response;
|
1832 |
+
$return_data['error'] = 'HTTP response from LinkedIn end-point was not code 200';
|
1833 |
+
$return_data['success'] = FALSE;
|
1834 |
+
}
|
1835 |
+
return $return_data;
|
1836 |
+
}
|
1837 |
+
|
1838 |
+
/**
|
1839 |
+
* Request token retrieval.
|
1840 |
+
*
|
1841 |
+
* Get the request token from the Linkedin API.
|
1842 |
+
*
|
1843 |
+
* @return arr
|
1844 |
+
* The Linkedin OAuth/http response, in array format.
|
1845 |
+
*/
|
1846 |
+
public function retrieveTokenRequest() {
|
1847 |
+
$parameters = array(
|
1848 |
+
'oauth_callback' => $this->getCallbackUrl()
|
1849 |
+
);
|
1850 |
+
$response = $this->fetch(self::_METHOD_TOKENS, self::_URL_REQUEST, NULL, $parameters);
|
1851 |
+
parse_str($response['linkedin'], $response['linkedin']);
|
1852 |
+
|
1853 |
+
/**
|
1854 |
+
* Check for successful request (a 200 response from LinkedIn server)
|
1855 |
+
* per the documentation linked in method comments above.
|
1856 |
+
*/
|
1857 |
+
if(($response['info']['http_code'] == 200) && (array_key_exists('oauth_callback_confirmed', $response['linkedin'])) && ($response['linkedin']['oauth_callback_confirmed'] == 'true')) {
|
1858 |
+
// tokens retrieved
|
1859 |
+
$this->setToken($response['linkedin']);
|
1860 |
+
|
1861 |
+
// set the response
|
1862 |
+
$return_data = $response;
|
1863 |
+
$return_data['success'] = TRUE;
|
1864 |
+
} else {
|
1865 |
+
// error getting the request tokens
|
1866 |
+
$this->setToken(NULL);
|
1867 |
+
|
1868 |
+
// set the response
|
1869 |
+
$return_data = $response;
|
1870 |
+
if((array_key_exists('oauth_callback_confirmed', $response['linkedin'])) && ($response['linkedin']['oauth_callback_confirmed'] == 'true')) {
|
1871 |
+
$return_data['error'] = 'HTTP response from LinkedIn end-point was not code 200';
|
1872 |
+
} else {
|
1873 |
+
$return_data['error'] = 'OAuth callback URL was not confirmed by the LinkedIn end-point';
|
1874 |
+
}
|
1875 |
+
$return_data['success'] = FALSE;
|
1876 |
+
}
|
1877 |
+
return $return_data;
|
1878 |
+
}
|
1879 |
+
|
1880 |
+
/**
|
1881 |
+
* User authorization revocation.
|
1882 |
+
*
|
1883 |
+
* Revoke the current user's access token, clear the access token's from
|
1884 |
+
* current LinkedIn object. The current documentation for this feature is
|
1885 |
+
* found in a blog entry from April 29th, 2010:
|
1886 |
+
*
|
1887 |
+
* http://developer.linkedin.com/community/apis/blog/2010/04/29/oauth--now-for-authentication
|
1888 |
+
*
|
1889 |
+
* @return arr
|
1890 |
+
* Array containing retrieval success, LinkedIn response.
|
1891 |
+
*/
|
1892 |
+
public function revoke() {
|
1893 |
+
// construct and send the request
|
1894 |
+
$response = $this->fetch('GET', self::_URL_REVOKE);
|
1895 |
+
|
1896 |
+
/**
|
1897 |
+
* Check for successful request (a 200 response from LinkedIn server)
|
1898 |
+
* per the documentation linked in method comments above.
|
1899 |
+
*/
|
1900 |
+
return $this->checkResponse(200, $response);
|
1901 |
+
}
|
1902 |
+
|
1903 |
+
/**
|
1904 |
+
* [DEPRECATED] General people search function.
|
1905 |
+
*
|
1906 |
+
* Takes a string of parameters as input and requests profile data from the
|
1907 |
+
* Linkedin People Search API. See the official documentation for $options
|
1908 |
+
* querystring formatting:
|
1909 |
+
*
|
1910 |
+
* http://developer.linkedin.com/docs/DOC-1191
|
1911 |
+
*
|
1912 |
+
* @param str $options
|
1913 |
+
* [OPTIONAL] Data retrieval options.
|
1914 |
+
*
|
1915 |
+
* @return arr
|
1916 |
+
* Array containing retrieval success, LinkedIn response.
|
1917 |
+
*/
|
1918 |
+
public function search($options = NULL) {
|
1919 |
+
return searchPeople($options);
|
1920 |
+
}
|
1921 |
+
|
1922 |
+
/**
|
1923 |
+
* Company search.
|
1924 |
+
*
|
1925 |
+
* Uses the Company Search API to find companies using keywords, industry,
|
1926 |
+
* location, or some other criteria. It returns a collection of matching
|
1927 |
+
* companies.
|
1928 |
+
*
|
1929 |
+
* http://developer.linkedin.com/docs/DOC-1325
|
1930 |
+
*
|
1931 |
+
* @param str $options
|
1932 |
+
* [OPTIONAL] Search options.
|
1933 |
+
* @return arr
|
1934 |
+
* Array containing retrieval success, LinkedIn response.
|
1935 |
+
*/
|
1936 |
+
public function searchCompanies($options = '') {
|
1937 |
+
// check passed data
|
1938 |
+
if(!is_string($options)) {
|
1939 |
+
// bad data passed
|
1940 |
+
throw new LinkedInException('LinkedIn->searchCompanies(): bad data passed, $options must be of type string.');
|
1941 |
+
}
|
1942 |
+
|
1943 |
+
// construct and send the request
|
1944 |
+
$query = self::_URL_API . '/v1/company-search' . trim($options);
|
1945 |
+
$response = $this->fetch('GET', $query);
|
1946 |
+
|
1947 |
+
/**
|
1948 |
+
* Check for successful request (a 200 response from LinkedIn server)
|
1949 |
+
* per the documentation linked in method comments above.
|
1950 |
+
*/
|
1951 |
+
return $this->checkResponse(200, $response);
|
1952 |
+
}
|
1953 |
+
|
1954 |
+
/**
|
1955 |
+
* Jobs search.
|
1956 |
+
*
|
1957 |
+
* Use the Job Search API to find jobs using keywords, company, location,
|
1958 |
+
* or some other criteria. It returns a collection of matching jobs. Each
|
1959 |
+
* entry can contain much of the information available on the job listing.
|
1960 |
+
*
|
1961 |
+
* http://developer.linkedin.com/docs/DOC-1321
|
1962 |
+
*
|
1963 |
+
* @param str $options
|
1964 |
+
* [OPTIONAL] Data retrieval options.
|
1965 |
+
*
|
1966 |
+
* @return arr
|
1967 |
+
* Array containing retrieval success, LinkedIn response.
|
1968 |
+
*/
|
1969 |
+
public function searchJobs($options = '') {
|
1970 |
+
// check passed data
|
1971 |
+
if(!is_string($options)) {
|
1972 |
+
// bad data passed
|
1973 |
+
throw new LinkedInException('LinkedIn->jobsSearch(): bad data passed, $options must be of type string.');
|
1974 |
+
}
|
1975 |
+
|
1976 |
+
// construct and send the request
|
1977 |
+
$query = self::_URL_API . '/v1/job-search' . trim($options);
|
1978 |
+
$response = $this->fetch('GET', $query);
|
1979 |
+
|
1980 |
+
/**
|
1981 |
+
* Check for successful request (a 200 response from LinkedIn server)
|
1982 |
+
* per the documentation linked in method comments above.
|
1983 |
+
*/
|
1984 |
+
return $this->checkResponse(200, $response);
|
1985 |
+
}
|
1986 |
+
|
1987 |
+
/**
|
1988 |
+
* General people search function.
|
1989 |
+
*
|
1990 |
+
* Takes a string of parameters as input and requests profile data from the
|
1991 |
+
* Linkedin People Search API. See the official documentation for $options
|
1992 |
+
* querystring formatting:
|
1993 |
+
*
|
1994 |
+
* http://developer.linkedin.com/docs/DOC-1191
|
1995 |
+
*
|
1996 |
+
* @param str $options
|
1997 |
+
* [OPTIONAL] Data retrieval options.
|
1998 |
+
*
|
1999 |
+
* @return arr
|
2000 |
+
* Array containing retrieval success, LinkedIn response.
|
2001 |
+
*/
|
2002 |
+
public function searchPeople($options = NULL) {
|
2003 |
+
// check passed data
|
2004 |
+
if(!is_null($options) && !is_string($options)) {
|
2005 |
+
// bad data passed
|
2006 |
+
throw new LinkedInException('LinkedIn->search(): bad data passed, $options must be of type string.');
|
2007 |
+
}
|
2008 |
+
|
2009 |
+
// construct and send the request
|
2010 |
+
$query = self::_URL_API . '/v1/people-search' . trim($options);
|
2011 |
+
$response = $this->fetch('GET', $query);
|
2012 |
+
|
2013 |
+
/**
|
2014 |
+
* Check for successful request (a 200 response from LinkedIn server)
|
2015 |
+
* per the documentation linked in method comments above.
|
2016 |
+
*/
|
2017 |
+
return $this->checkResponse(200, $response);
|
2018 |
+
}
|
2019 |
+
|
2020 |
+
/**
|
2021 |
+
* Set the application_key property.
|
2022 |
+
*
|
2023 |
+
* @param str $key
|
2024 |
+
* The application key.
|
2025 |
+
*/
|
2026 |
+
public function setApplicationKey($key) {
|
2027 |
+
$this->application_key = $key;
|
2028 |
+
}
|
2029 |
+
|
2030 |
+
/**
|
2031 |
+
* Set the application_secret property.
|
2032 |
+
*
|
2033 |
+
* @param str $secret
|
2034 |
+
* The application secret.
|
2035 |
+
*/
|
2036 |
+
public function setApplicationSecret($secret) {
|
2037 |
+
$this->application_secret = $secret;
|
2038 |
+
}
|
2039 |
+
|
2040 |
+
/**
|
2041 |
+
* Set the callback property.
|
2042 |
+
*
|
2043 |
+
* @param str $url
|
2044 |
+
* The callback url.
|
2045 |
+
*/
|
2046 |
+
public function setCallbackUrl($url) {
|
2047 |
+
$this->callback = $url;
|
2048 |
+
}
|
2049 |
+
|
2050 |
+
/**
|
2051 |
+
* This sets the group settings of the specified group.
|
2052 |
+
*
|
2053 |
+
* http://developer.linkedin.com/documents/groups-api
|
2054 |
+
*
|
2055 |
+
* @param str $gid
|
2056 |
+
* The group id.
|
2057 |
+
* @param str $xml
|
2058 |
+
* The group settings to set. The settings are:
|
2059 |
+
* -<show-group-logo-in-profle>
|
2060 |
+
* -<contact-email>
|
2061 |
+
* -<email-digest-frequency>
|
2062 |
+
* -<email-annoucements-from-managers>
|
2063 |
+
* -<allow-messages-from-members>
|
2064 |
+
* -<email-for-every-new-post>
|
2065 |
+
*
|
2066 |
+
* @return arr
|
2067 |
+
* Array containing retrieval success, LinkedIn response.
|
2068 |
+
*/
|
2069 |
+
public function setGroupSettings($gid, $xml) {
|
2070 |
+
if(!is_string ($gid)) {
|
2071 |
+
throw new LinkedInException('LinkedIn->setGroupSettings(): bad data passed, $token_access should be in array format.');
|
2072 |
+
}
|
2073 |
+
if(!is_string ($xml)) {
|
2074 |
+
throw new LinkedInException('LinkedIn->setGroupSettings(): bad data passed, $token_access should be in array format.');
|
2075 |
+
}
|
2076 |
+
|
2077 |
+
// construct and send the request
|
2078 |
+
$query = self::_URL_API . '/v1/people/~/group-memberships/' . trim($gid);
|
2079 |
+
$response = $this->fetch('PUT', $query, $xml);
|
2080 |
+
|
2081 |
+
/**
|
2082 |
+
* Check for successful request (a 200 response from LinkedIn server)
|
2083 |
+
* per the documentation linked in method comments above.
|
2084 |
+
*/
|
2085 |
+
return $this->checkResponse(200, $response);
|
2086 |
+
}
|
2087 |
+
|
2088 |
+
/**
|
2089 |
+
* Set the response_format property.
|
2090 |
+
*
|
2091 |
+
* @param str $format
|
2092 |
+
* [OPTIONAL] The response format to specify to LinkedIn.
|
2093 |
+
*/
|
2094 |
+
public function setResponseFormat($format = self::_DEFAULT_RESPONSE_FORMAT) {
|
2095 |
+
$this->response_format = $format;
|
2096 |
+
}
|
2097 |
+
|
2098 |
+
/**
|
2099 |
+
* Set the token property.
|
2100 |
+
*
|
2101 |
+
* @return arr $token
|
2102 |
+
* The LinkedIn OAuth token.
|
2103 |
+
*/
|
2104 |
+
public function setToken($token) {
|
2105 |
+
// check passed data
|
2106 |
+
if(!is_null($token) && !is_array($token)) {
|
2107 |
+
// bad data passed
|
2108 |
+
throw new LinkedInException('LinkedIn->setToken(): bad data passed, $token_access should be in array format.');
|
2109 |
+
}
|
2110 |
+
|
2111 |
+
// set token
|
2112 |
+
$this->token = $token;
|
2113 |
+
}
|
2114 |
+
|
2115 |
+
/**
|
2116 |
+
* [DEPRECATED] Set the token_access property.
|
2117 |
+
*
|
2118 |
+
* @return arr $token_access
|
2119 |
+
* [OPTIONAL] The LinkedIn OAuth access token.
|
2120 |
+
*/
|
2121 |
+
public function setTokenAccess($token_access) {
|
2122 |
+
$this->setToken($token_access);
|
2123 |
+
}
|
2124 |
+
|
2125 |
+
/**
|
2126 |
+
* Post a share.
|
2127 |
+
*
|
2128 |
+
* Create a new or reshare another user's shared content. Full details from
|
2129 |
+
* LinkedIn on this functionality can be found here:
|
2130 |
+
*
|
2131 |
+
* http://developer.linkedin.com/docs/DOC-1212
|
2132 |
+
*
|
2133 |
+
* $action values: ('new', 'reshare')
|
2134 |
+
* $content format:
|
2135 |
+
* $action = 'new'; $content => ('comment' => 'xxx', 'title' => 'xxx', 'submitted-url' => 'xxx', 'submitted-image-url' => 'xxx', 'description' => 'xxx')
|
2136 |
+
* $action = 'reshare'; $content => ('comment' => 'xxx', 'id' => 'xxx')
|
2137 |
+
*
|
2138 |
+
* @param str $action
|
2139 |
+
* The sharing action to perform.
|
2140 |
+
* @param str $content
|
2141 |
+
* The share content.
|
2142 |
+
* @param bool $private
|
2143 |
+
* [OPTIONAL] Should we restrict this shared item to connections only?
|
2144 |
+
* @param bool $twitter
|
2145 |
+
* [OPTIONAL] Also update the teathered Twitter account.
|
2146 |
+
*
|
2147 |
+
* @return arr
|
2148 |
+
* Array containing retrieval success, LinkedIn response.
|
2149 |
+
*/
|
2150 |
+
public function share($action, $content, $private = TRUE, $twitter = FALSE) {
|
2151 |
+
// check the status itself
|
2152 |
+
if(!empty($action) && !empty($content)) {
|
2153 |
+
/**
|
2154 |
+
* Status is not empty, wrap a cleaned version of it in xml. Status
|
2155 |
+
* rules:
|
2156 |
+
*
|
2157 |
+
* 1) Comments are 700 chars max (if this changes, change _SHARE_COMMENT_LENGTH constant)
|
2158 |
+
* 2) Content/title 200 chars max (if this changes, change _SHARE_CONTENT_TITLE_LENGTH constant)
|
2159 |
+
* 3) Content/description 400 chars max (if this changes, change _SHARE_CONTENT_DESC_LENGTH constant)
|
2160 |
+
* 4a) New shares must contain a comment and/or (content/title and content/submitted-url)
|
2161 |
+
* 4b) Reshared content must contain an attribution id.
|
2162 |
+
* 4c) Reshared content must contain actual content, not just a comment.
|
2163 |
+
* 5) No HTML permitted in comment, content/title, content/description.
|
2164 |
+
*/
|
2165 |
+
|
2166 |
+
// prepare the share data per the rules above
|
2167 |
+
$share_flag = FALSE;
|
2168 |
+
$content_xml = NULL;
|
2169 |
+
switch($action) {
|
2170 |
+
case 'new':
|
2171 |
+
// share can be an article
|
2172 |
+
if(array_key_exists('title', $content) && array_key_exists('submitted-url', $content)) {
|
2173 |
+
// we have shared content, format it as needed per rules above
|
2174 |
+
$content_title = trim(htmlspecialchars(strip_tags(stripslashes($content['title']))));
|
2175 |
+
if(strlen($content_title) > self::_SHARE_CONTENT_TITLE_LENGTH) {
|
2176 |
+
throw new LinkedInException('LinkedIn->share(): title length is too long - max length is ' . self::_SHARE_CONTENT_TITLE_LENGTH . ' characters.');
|
2177 |
+
}
|
2178 |
+
$content_xml .= '<content>
|
2179 |
+
<title>' . $content_title . '</title>
|
2180 |
+
<submitted-url>' . trim(htmlspecialchars($content['submitted-url'])) . '</submitted-url>';
|
2181 |
+
if(array_key_exists('submitted-image-url', $content)) {
|
2182 |
+
$content_xml .= '<submitted-image-url>' . trim(htmlspecialchars($content['submitted-image-url'])) . '</submitted-image-url>';
|
2183 |
+
}
|
2184 |
+
if(array_key_exists('description', $content)) {
|
2185 |
+
$content_desc = trim(htmlspecialchars(strip_tags(stripslashes($content['description']))));
|
2186 |
+
if(strlen($content_desc) > self::_SHARE_CONTENT_DESC_LENGTH) {
|
2187 |
+
throw new LinkedInException('LinkedIn->share(): description length is too long - max length is ' . self::_SHARE_CONTENT_DESC_LENGTH . ' characters.');
|
2188 |
+
}
|
2189 |
+
$content_xml .= '<description>' . $content_desc . '</description>';
|
2190 |
+
}
|
2191 |
+
$content_xml .= '</content>';
|
2192 |
+
|
2193 |
+
$share_flag = TRUE;
|
2194 |
+
}
|
2195 |
+
|
2196 |
+
// share can be just a comment
|
2197 |
+
if(array_key_exists('comment', $content)) {
|
2198 |
+
// comment located
|
2199 |
+
$comment = htmlspecialchars(trim(strip_tags(stripslashes($content['comment']))));
|
2200 |
+
if(strlen($comment) > self::_SHARE_COMMENT_LENGTH) {
|
2201 |
+
throw new LinkedInException('LinkedIn->share(): comment length is too long - max length is ' . self::_SHARE_COMMENT_LENGTH . ' characters.');
|
2202 |
+
}
|
2203 |
+
$content_xml .= '<comment>' . $comment . '</comment>';
|
2204 |
+
|
2205 |
+
$share_flag = TRUE;
|
2206 |
+
}
|
2207 |
+
break;
|
2208 |
+
case 'reshare':
|
2209 |
+
if(array_key_exists('id', $content)) {
|
2210 |
+
// put together the re-share attribution XML
|
2211 |
+
$content_xml .= '<attribution>
|
2212 |
+
<share>
|
2213 |
+
<id>' . trim($content['id']) . '</id>
|
2214 |
+
</share>
|
2215 |
+
</attribution>';
|
2216 |
+
|
2217 |
+
// optional additional comment
|
2218 |
+
if(array_key_exists('comment', $content)) {
|
2219 |
+
// comment located
|
2220 |
+
$comment = htmlspecialchars(trim(strip_tags(stripslashes($content['comment']))));
|
2221 |
+
if(strlen($comment) > self::_SHARE_COMMENT_LENGTH) {
|
2222 |
+
throw new LinkedInException('LinkedIn->share(): comment length is too long - max length is ' . self::_SHARE_COMMENT_LENGTH . ' characters.');
|
2223 |
+
}
|
2224 |
+
$content_xml .= '<comment>' . $comment . '</comment>';
|
2225 |
+
}
|
2226 |
+
|
2227 |
+
$share_flag = TRUE;
|
2228 |
+
}
|
2229 |
+
break;
|
2230 |
+
default:
|
2231 |
+
// bad action passed
|
2232 |
+
throw new LinkedInException('LinkedIn->share(): share action is an invalid value, must be one of: share, reshare.');
|
2233 |
+
break;
|
2234 |
+
}
|
2235 |
+
|
2236 |
+
// should we proceed?
|
2237 |
+
if($share_flag) {
|
2238 |
+
// put all of the xml together
|
2239 |
+
$visibility = ($private) ? 'connections-only' : 'anyone';
|
2240 |
+
$data = '<?xml version="1.0" encoding="UTF-8"?>
|
2241 |
+
<share>
|
2242 |
+
' . $content_xml . '
|
2243 |
+
<visibility>
|
2244 |
+
<code>' . $visibility . '</code>
|
2245 |
+
</visibility>
|
2246 |
+
</share>';
|
2247 |
+
|
2248 |
+
// create the proper url
|
2249 |
+
$share_url = self::_URL_API . '/v1/people/~/shares';
|
2250 |
+
if($twitter) {
|
2251 |
+
// update twitter as well
|
2252 |
+
$share_url .= '?twitter-post=true';
|
2253 |
+
}
|
2254 |
+
|
2255 |
+
// send request
|
2256 |
+
$response = $this->fetch('POST', $share_url, $data);
|
2257 |
+
} else {
|
2258 |
+
// data contraints/rules not met, raise an exception
|
2259 |
+
throw new LinkedInException('LinkedIn->share(): sharing data constraints not met; check that you have supplied valid content and combinations of content to share.');
|
2260 |
+
}
|
2261 |
+
} else {
|
2262 |
+
// data missing, raise an exception
|
2263 |
+
throw new LinkedInException('LinkedIn->share(): sharing action or shared content is missing.');
|
2264 |
+
}
|
2265 |
+
|
2266 |
+
/**
|
2267 |
+
* Check for successful request (a 201 response from LinkedIn server)
|
2268 |
+
* per the documentation linked in method comments above.
|
2269 |
+
*/
|
2270 |
+
return $this->checkResponse(201, $response);
|
2271 |
+
}
|
2272 |
+
|
2273 |
+
/**
|
2274 |
+
* Network statistics.
|
2275 |
+
*
|
2276 |
+
* General network statistics retrieval function, returns the number of connections,
|
2277 |
+
* second-connections an authenticated user has. More information here:
|
2278 |
+
*
|
2279 |
+
* http://developer.linkedin.com/docs/DOC-1006
|
2280 |
+
*
|
2281 |
+
* @return arr
|
2282 |
+
* Array containing retrieval success, LinkedIn response.
|
2283 |
+
*/
|
2284 |
+
public function statistics() {
|
2285 |
+
// construct and send the request
|
2286 |
+
$query = self::_URL_API . '/v1/people/~/network/network-stats';
|
2287 |
+
$response = $this->fetch('GET', $query);
|
2288 |
+
|
2289 |
+
/**
|
2290 |
+
* Check for successful request (a 200 response from LinkedIn server)
|
2291 |
+
* per the documentation linked in method comments above.
|
2292 |
+
*/
|
2293 |
+
return $this->checkResponse(200, $response);
|
2294 |
+
}
|
2295 |
+
|
2296 |
+
/**
|
2297 |
+
* Companies you may want to follow.
|
2298 |
+
*
|
2299 |
+
* Returns a list of companies the current user may want to follow, per:
|
2300 |
+
*
|
2301 |
+
* http://developer.linkedin.com/docs/DOC-1324
|
2302 |
+
*
|
2303 |
+
* @return arr
|
2304 |
+
* Array containing retrieval success, LinkedIn response.
|
2305 |
+
*/
|
2306 |
+
public function suggestedCompanies() {
|
2307 |
+
// construct and send the request
|
2308 |
+
$query = self::_URL_API . '/v1/people/~/suggestions/to-follow/companies';
|
2309 |
+
$response = $this->fetch('GET', $query);
|
2310 |
+
|
2311 |
+
/**
|
2312 |
+
* Check for successful request (a 200 response from LinkedIn server)
|
2313 |
+
* per the documentation linked in method comments above.
|
2314 |
+
*/
|
2315 |
+
return $this->checkResponse(200, $response);
|
2316 |
+
}
|
2317 |
+
|
2318 |
+
/**
|
2319 |
+
* Retrieves suggested groups for the user, per:
|
2320 |
+
*
|
2321 |
+
* http://developer.linkedin.com/documents/groups-api
|
2322 |
+
*
|
2323 |
+
* @return arr
|
2324 |
+
* Array containing retrieval success, LinkedIn response.
|
2325 |
+
*/
|
2326 |
+
public function suggestedGroups() {
|
2327 |
+
// construct and send the request
|
2328 |
+
$query = self::_URL_API . '/v1/people/~/suggestions/groups:(id,name,is-open-to-non-members)';
|
2329 |
+
$response = $this->fetch('GET', $query);
|
2330 |
+
|
2331 |
+
/**
|
2332 |
+
* Check for successful request (a 200 response from LinkedIn server)
|
2333 |
+
* per the documentation linked in method comments above.
|
2334 |
+
*/
|
2335 |
+
return $this->checkResponse (200, $response);
|
2336 |
+
}
|
2337 |
+
|
2338 |
+
/**
|
2339 |
+
* Jobs you may be interested in.
|
2340 |
+
*
|
2341 |
+
* Returns a list of jobs the current user may be interested in, per:
|
2342 |
+
*
|
2343 |
+
* http://developer.linkedin.com/docs/DOC-1323
|
2344 |
+
*
|
2345 |
+
* @param str $options
|
2346 |
+
* [OPTIONAL] Data retrieval options.
|
2347 |
+
*
|
2348 |
+
* @return arr
|
2349 |
+
* Array containing retrieval success, LinkedIn response.
|
2350 |
+
*/
|
2351 |
+
public function suggestedJobs($options = ':(jobs)') {
|
2352 |
+
// check passed data
|
2353 |
+
if(!is_string($options)) {
|
2354 |
+
// bad data passed
|
2355 |
+
throw new LinkedInException('LinkedIn->suggestedJobs(): bad data passed, $options must be of type string.');
|
2356 |
+
}
|
2357 |
+
|
2358 |
+
// construct and send the request
|
2359 |
+
$query = self::_URL_API . '/v1/people/~/suggestions/job-suggestions' . trim($options);
|
2360 |
+
$response = $this->fetch('GET', $query);
|
2361 |
+
|
2362 |
+
/**
|
2363 |
+
* Check for successful request (a 200 response from LinkedIn server)
|
2364 |
+
* per the documentation linked in method comments above.
|
2365 |
+
*/
|
2366 |
+
return $this->checkResponse(200, $response);
|
2367 |
+
}
|
2368 |
+
|
2369 |
+
/**
|
2370 |
+
* Unbookmark a job.
|
2371 |
+
*
|
2372 |
+
* Calling this method causes the current user to remove a bookmark for the
|
2373 |
+
* specified job:
|
2374 |
+
*
|
2375 |
+
* http://developer.linkedin.com/docs/DOC-1323
|
2376 |
+
*
|
2377 |
+
* @param str $jid
|
2378 |
+
* Job ID you want to unbookmark.
|
2379 |
+
*
|
2380 |
+
* @return arr
|
2381 |
+
* Array containing retrieval success, LinkedIn response.
|
2382 |
+
*/
|
2383 |
+
public function unbookmarkJob($jid) {
|
2384 |
+
// check passed data
|
2385 |
+
if(!is_string($jid)) {
|
2386 |
+
// bad data passed
|
2387 |
+
throw new LinkedInException('LinkedIn->unbookmarkJob(): bad data passed, $jid must be of type string.');
|
2388 |
+
}
|
2389 |
+
|
2390 |
+
// construct and send the request
|
2391 |
+
$query = self::_URL_API . '/v1/people/~/job-bookmarks/' . trim($jid);
|
2392 |
+
$response = $this->fetch('DELETE', $query);
|
2393 |
+
|
2394 |
+
/**
|
2395 |
+
* Check for successful request (a 204 response from LinkedIn server)
|
2396 |
+
* per the documentation linked in method comments above.
|
2397 |
+
*/
|
2398 |
+
return $this->checkResponse(204, $response);
|
2399 |
+
}
|
2400 |
+
|
2401 |
+
/**
|
2402 |
+
* Unfollow a company.
|
2403 |
+
*
|
2404 |
+
* Calling this method causes the current user to stop following the specified
|
2405 |
+
* company, per:
|
2406 |
+
*
|
2407 |
+
* http://developer.linkedin.com/docs/DOC-1324
|
2408 |
+
*
|
2409 |
+
* @param str $cid
|
2410 |
+
* Company ID you want to unfollow.
|
2411 |
+
*
|
2412 |
+
* @return arr
|
2413 |
+
* Array containing retrieval success, LinkedIn response.
|
2414 |
+
*/
|
2415 |
+
public function unfollowCompany($cid) {
|
2416 |
+
// check passed data
|
2417 |
+
if(!is_string($cid)) {
|
2418 |
+
// bad data passed
|
2419 |
+
throw new LinkedInException('LinkedIn->unfollowCompany(): bad data passed, $cid must be of string value.');
|
2420 |
+
}
|
2421 |
+
|
2422 |
+
// construct and send the request
|
2423 |
+
$query = self::_URL_API . '/v1/people/~/following/companies/id=' . trim($cid);
|
2424 |
+
$response = $this->fetch('DELETE', $query);
|
2425 |
+
|
2426 |
+
/**
|
2427 |
+
* Check for successful request (a 204 response from LinkedIn server)
|
2428 |
+
* per the documentation linked in method comments above.
|
2429 |
+
*/
|
2430 |
+
return $this->checkResponse(204, $response);
|
2431 |
+
}
|
2432 |
+
|
2433 |
+
/**
|
2434 |
+
* Unlike a network update.
|
2435 |
+
*
|
2436 |
+
* Unlike another user's network update:
|
2437 |
+
*
|
2438 |
+
* http://developer.linkedin.com/docs/DOC-1043
|
2439 |
+
*
|
2440 |
+
* @param str $uid
|
2441 |
+
* The LinkedIn update ID.
|
2442 |
+
*
|
2443 |
+
* @return arr
|
2444 |
+
* Array containing retrieval success, LinkedIn response.
|
2445 |
+
*/
|
2446 |
+
public function unlike($uid) {
|
2447 |
+
// check passed data
|
2448 |
+
if(!is_string($uid)) {
|
2449 |
+
// bad data passed
|
2450 |
+
throw new LinkedInException('LinkedIn->unlike(): bad data passed, $uid must be of type string.');
|
2451 |
+
}
|
2452 |
+
|
2453 |
+
// construct the xml data
|
2454 |
+
$data = '<?xml version="1.0" encoding="UTF-8"?>
|
2455 |
+
<is-liked>false</is-liked>';
|
2456 |
+
|
2457 |
+
// send request
|
2458 |
+
$query = self::_URL_API . '/v1/people/~/network/updates/key=' . $uid . '/is-liked';
|
2459 |
+
$response = $this->fetch('PUT', $query, $data);
|
2460 |
+
|
2461 |
+
/**
|
2462 |
+
* Check for successful request (a 201 response from LinkedIn server)
|
2463 |
+
* per the documentation linked in method comments above.
|
2464 |
+
*/
|
2465 |
+
return $this->checkResponse(201, $response);
|
2466 |
+
}
|
2467 |
+
|
2468 |
+
/**
|
2469 |
+
* Post network update.
|
2470 |
+
*
|
2471 |
+
* Update the user's Linkedin network status. Full details from LinkedIn
|
2472 |
+
* on this functionality can be found here:
|
2473 |
+
*
|
2474 |
+
* http://developer.linkedin.com/docs/DOC-1009
|
2475 |
+
* http://developer.linkedin.com/docs/DOC-1009#comment-1077
|
2476 |
+
*
|
2477 |
+
* @param str $update
|
2478 |
+
* The network update.
|
2479 |
+
*
|
2480 |
+
* @return arr
|
2481 |
+
* Array containing retrieval success, LinkedIn response.
|
2482 |
+
*/
|
2483 |
+
public function updateNetwork($update) {
|
2484 |
+
// check passed data
|
2485 |
+
if(!is_string($update)) {
|
2486 |
+
// nothing/non-string passed, raise an exception
|
2487 |
+
throw new LinkedInException('LinkedIn->updateNetwork(): bad data passed, $update must be a non-zero length string.');
|
2488 |
+
}
|
2489 |
+
|
2490 |
+
/**
|
2491 |
+
* Network update is not empty, wrap a cleaned version of it in xml.
|
2492 |
+
* Network update rules:
|
2493 |
+
*
|
2494 |
+
* 1) No HTML permitted except those found in _NETWORK_HTML constant
|
2495 |
+
* 2) Update cannot be longer than 140 characters.
|
2496 |
+
*/
|
2497 |
+
// get the user data
|
2498 |
+
$response = self::profile('~:(first-name,last-name,site-standard-profile-request)');
|
2499 |
+
if($response['success'] === TRUE) {
|
2500 |
+
/**
|
2501 |
+
* We are converting response to usable data. I'd use SimpleXML here, but
|
2502 |
+
* to keep the class self-contained, we will use a portable XML parsing
|
2503 |
+
* routine, self::xmlToArray.
|
2504 |
+
*/
|
2505 |
+
$person = self::xmlToArray($response['linkedin']);
|
2506 |
+
if($person === FALSE) {
|
2507 |
+
// bad xml data
|
2508 |
+
throw new LinkedInException('LinkedIn->updateNetwork(): LinkedIn returned bad XML data.');
|
2509 |
+
}
|
2510 |
+
$fields = $person['person']['children'];
|
2511 |
+
|
2512 |
+
// prepare user data
|
2513 |
+
$first_name = trim($fields['first-name']['content']);
|
2514 |
+
$last_name = trim($fields['last-name']['content']);
|
2515 |
+
$profile_url = trim($fields['site-standard-profile-request']['children']['url']['content']);
|
2516 |
+
|
2517 |
+
// create the network update
|
2518 |
+
$update = trim(htmlspecialchars(strip_tags($update, self::_NETWORK_HTML)));
|
2519 |
+
if(strlen($update) > self::_NETWORK_LENGTH) {
|
2520 |
+
throw new LinkedInException('LinkedIn->share(): update length is too long - max length is ' . self::_NETWORK_LENGTH . ' characters.');
|
2521 |
+
}
|
2522 |
+
$user = htmlspecialchars('<a href="' . $profile_url . '">' . $first_name . ' ' . $last_name . '</a>');
|
2523 |
+
$data = '<activity locale="en_US">
|
2524 |
+
<content-type>linkedin-html</content-type>
|
2525 |
+
<body>' . $user . ' ' . $update . '</body>
|
2526 |
+
</activity>';
|
2527 |
+
|
2528 |
+
// send request
|
2529 |
+
$query = self::_URL_API . '/v1/people/~/person-activities';
|
2530 |
+
$response = $this->fetch('POST', $query, $data);
|
2531 |
+
|
2532 |
+
/**
|
2533 |
+
* Check for successful request (a 201 response from LinkedIn server)
|
2534 |
+
* per the documentation linked in method comments above.
|
2535 |
+
*/
|
2536 |
+
return $this->checkResponse(201, $response);
|
2537 |
+
} else {
|
2538 |
+
// profile retrieval failed
|
2539 |
+
throw new LinkedInException('LinkedIn->updateNetwork(): profile data could not be retrieved.');
|
2540 |
+
}
|
2541 |
+
}
|
2542 |
+
|
2543 |
+
/**
|
2544 |
+
* General network update retrieval function.
|
2545 |
+
*
|
2546 |
+
* Takes a string of parameters as input and requests update-related data
|
2547 |
+
* from the Linkedin Network Updates API. See the official documentation for
|
2548 |
+
* $options parameter formatting:
|
2549 |
+
*
|
2550 |
+
* http://developer.linkedin.com/docs/DOC-1006
|
2551 |
+
*
|
2552 |
+
* For getting more comments, likes, etc, see here:
|
2553 |
+
*
|
2554 |
+
* http://developer.linkedin.com/docs/DOC-1043
|
2555 |
+
*
|
2556 |
+
* @param str $options
|
2557 |
+
* [OPTIONAL] Data retrieval options.
|
2558 |
+
* @param str $id
|
2559 |
+
* [OPTIONAL] The LinkedIn ID to restrict the updates for.
|
2560 |
+
*
|
2561 |
+
* @return arr
|
2562 |
+
* Array containing retrieval success, LinkedIn response.
|
2563 |
+
*/
|
2564 |
+
public function updates($options = NULL, $id = NULL) {
|
2565 |
+
// check passed data
|
2566 |
+
if(!is_null($options) && !is_string($options)) {
|
2567 |
+
// bad data passed
|
2568 |
+
throw new LinkedInException('LinkedIn->updates(): bad data passed, $options must be of type string.');
|
2569 |
+
}
|
2570 |
+
if(!is_null($id) && !is_string($id)) {
|
2571 |
+
// bad data passed
|
2572 |
+
throw new LinkedInException('LinkedIn->updates(): bad data passed, $id must be of type string.');
|
2573 |
+
}
|
2574 |
+
|
2575 |
+
// construct and send the request
|
2576 |
+
if(!is_null($id) && self::isId($id)) {
|
2577 |
+
$query = self::_URL_API . '/v1/people/' . $id . '/network/updates' . trim($options);
|
2578 |
+
} else {
|
2579 |
+
$query = self::_URL_API . '/v1/people/~/network/updates' . trim($options);
|
2580 |
+
}
|
2581 |
+
$response = $this->fetch('GET', $query);
|
2582 |
+
|
2583 |
+
/**
|
2584 |
+
* Check for successful request (a 200 response from LinkedIn server)
|
2585 |
+
* per the documentation linked in method comments above.
|
2586 |
+
*/
|
2587 |
+
return $this->checkResponse(200, $response);
|
2588 |
+
}
|
2589 |
+
|
2590 |
+
/**
|
2591 |
+
* Converts passed XML data to an array.
|
2592 |
+
*
|
2593 |
+
* @param str $xml
|
2594 |
+
* The XML to convert to an array.
|
2595 |
+
*
|
2596 |
+
* @return arr
|
2597 |
+
* Array containing the XML data.
|
2598 |
+
* @return bool
|
2599 |
+
* FALSE if passed data cannot be parsed to an array.
|
2600 |
+
*/
|
2601 |
+
public static function xmlToArray($xml) {
|
2602 |
+
// check passed data
|
2603 |
+
if(!is_string($xml)) {
|
2604 |
+
// bad data possed
|
2605 |
+
throw new LinkedInException('LinkedIn->xmlToArray(): bad data passed, $xml must be a non-zero length string.');
|
2606 |
+
}
|
2607 |
+
|
2608 |
+
$parser = xml_parser_create();
|
2609 |
+
xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, 0);
|
2610 |
+
xml_parser_set_option($parser, XML_OPTION_SKIP_WHITE, 1);
|
2611 |
+
if(xml_parse_into_struct($parser, $xml, $tags)) {
|
2612 |
+
$elements = array();
|
2613 |
+
$stack = array();
|
2614 |
+
foreach($tags as $tag) {
|
2615 |
+
$index = count($elements);
|
2616 |
+
if($tag['type'] == 'complete' || $tag['type'] == 'open') {
|
2617 |
+
$elements[$tag['tag']] = array();
|
2618 |
+
$elements[$tag['tag']]['attributes'] = (array_key_exists('attributes', $tag)) ? $tag['attributes'] : NULL;
|
2619 |
+
$elements[$tag['tag']]['content'] = (array_key_exists('value', $tag)) ? $tag['value'] : NULL;
|
2620 |
+
if($tag['type'] == 'open') {
|
2621 |
+
$elements[$tag['tag']]['children'] = array();
|
2622 |
+
$stack[count($stack)] = &$elements;
|
2623 |
+
$elements = &$elements[$tag['tag']]['children'];
|
2624 |
+
}
|
2625 |
+
}
|
2626 |
+
if($tag['type'] == 'close') {
|
2627 |
+
$elements = &$stack[count($stack) - 1];
|
2628 |
+
unset($stack[count($stack) - 1]);
|
2629 |
+
}
|
2630 |
+
}
|
2631 |
+
$return_data = $elements;
|
2632 |
+
} else {
|
2633 |
+
// not valid xml data
|
2634 |
+
$return_data = FALSE;
|
2635 |
+
}
|
2636 |
+
xml_parser_free($parser);
|
2637 |
+
return $return_data;
|
2638 |
+
}
|
2639 |
+
}
|
hybridauth/Hybrid/thirdparty/OAuth/OAuth.php
ADDED
@@ -0,0 +1,897 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
// http://oauth.googlecode.com/svn/code/php/OAuth.php
|
3 |
+
// rev 1261, Mar 29, 2011 morten.fangel
|
4 |
+
// modified on Dec 29, 2019 to remove OAuth PECL conflict
|
5 |
+
|
6 |
+
// vim: foldmethod=marker
|
7 |
+
|
8 |
+
/* Generic exception class
|
9 |
+
*/
|
10 |
+
class OAuthExceptionPHP extends Exception {
|
11 |
+
// pass
|
12 |
+
}
|
13 |
+
|
14 |
+
class OAuthConsumer {
|
15 |
+
public $key;
|
16 |
+
public $secret;
|
17 |
+
|
18 |
+
function __construct($key, $secret, $callback_url=NULL) {
|
19 |
+
$this->key = $key;
|
20 |
+
$this->secret = $secret;
|
21 |
+
$this->callback_url = $callback_url;
|
22 |
+
}
|
23 |
+
|
24 |
+
function __toString() {
|
25 |
+
return "OAuthConsumer[key=$this->key,secret=$this->secret]";
|
26 |
+
}
|
27 |
+
}
|
28 |
+
|
29 |
+
class OAuthToken {
|
30 |
+
// access tokens and request tokens
|
31 |
+
public $key;
|
32 |
+
public $secret;
|
33 |
+
|
34 |
+
/**
|
35 |
+
* key = the token
|
36 |
+
* secret = the token secret
|
37 |
+
*/
|
38 |
+
function __construct($key, $secret) {
|
39 |
+
$this->key = $key;
|
40 |
+
$this->secret = $secret;
|
41 |
+
}
|
42 |
+
|
43 |
+
/**
|
44 |
+
* generates the basic string serialization of a token that a server
|
45 |
+
* would respond to request_token and access_token calls with
|
46 |
+
*/
|
47 |
+
function to_string() {
|
48 |
+
return "oauth_token=" .
|
49 |
+
OAuthUtil::urlencode_rfc3986($this->key) .
|
50 |
+
"&oauth_token_secret=" .
|
51 |
+
OAuthUtil::urlencode_rfc3986($this->secret);
|
52 |
+
}
|
53 |
+
|
54 |
+
function __toString() {
|
55 |
+
return $this->to_string();
|
56 |
+
}
|
57 |
+
}
|
58 |
+
|
59 |
+
/**
|
60 |
+
* A class for implementing a Signature Method
|
61 |
+
* See section 9 ("Signing Requests") in the spec
|
62 |
+
*/
|
63 |
+
abstract class OAuthSignatureMethod {
|
64 |
+
/**
|
65 |
+
* Needs to return the name of the Signature Method (ie HMAC-SHA1)
|
66 |
+
* @return string
|
67 |
+
*/
|
68 |
+
abstract public function get_name();
|
69 |
+
|
70 |
+
/**
|
71 |
+
* Build up the signature
|
72 |
+
* NOTE: The output of this function MUST NOT be urlencoded.
|
73 |
+
* the encoding is handled in OAuthRequest when the final
|
74 |
+
* request is serialized
|
75 |
+
* @param OAuthRequest $request
|
76 |
+
* @param OAuthConsumer $consumer
|
77 |
+
* @param OAuthToken $token
|
78 |
+
* @return string
|
79 |
+
*/
|
80 |
+
abstract public function build_signature($request, $consumer, $token);
|
81 |
+
|
82 |
+
/**
|
83 |
+
* Verifies that a given signature is correct
|
84 |
+
* @param OAuthRequest $request
|
85 |
+
* @param OAuthConsumer $consumer
|
86 |
+
* @param OAuthToken $token
|
87 |
+
* @param string $signature
|
88 |
+
* @return bool
|
89 |
+
*/
|
90 |
+
public function check_signature($request, $consumer, $token, $signature) {
|
91 |
+
$built = $this->build_signature($request, $consumer, $token);
|
92 |
+
|
93 |
+
// Check for zero length, although unlikely here
|
94 |
+
if (strlen($built) == 0 || strlen($signature) == 0) {
|
95 |
+
return false;
|
96 |
+
}
|
97 |
+
|
98 |
+
if (strlen($built) != strlen($signature)) {
|
99 |
+
return false;
|
100 |
+
}
|
101 |
+
|
102 |
+
// Avoid a timing leak with a (hopefully) time insensitive compare
|
103 |
+
$result = 0;
|
104 |
+
for ($i = 0; $i < strlen($signature); $i++) {
|
105 |
+
$result |= ord($built{$i}) ^ ord($signature{$i});
|
106 |
+
}
|
107 |
+
|
108 |
+
return $result == 0;
|
109 |
+
}
|
110 |
+
}
|
111 |
+
|
112 |
+
/**
|
113 |
+
* The HMAC-SHA1 signature method uses the HMAC-SHA1 signature algorithm as defined in [RFC2104]
|
114 |
+
* where the Signature Base String is the text and the key is the concatenated values (each first
|
115 |
+
* encoded per Parameter Encoding) of the Consumer Secret and Token Secret, separated by an '&'
|
116 |
+
* character (ASCII code 38) even if empty.
|
117 |
+
* - Chapter 9.2 ("HMAC-SHA1")
|
118 |
+
*/
|
119 |
+
class OAuthSignatureMethod_HMAC_SHA1 extends OAuthSignatureMethod {
|
120 |
+
function get_name() {
|
121 |
+
return "HMAC-SHA1";
|
122 |
+
}
|
123 |
+
|
124 |
+
public function build_signature($request, $consumer, $token) {
|
125 |
+
$base_string = $request->get_signature_base_string();
|
126 |
+
$request->base_string = $base_string;
|
127 |
+
|
128 |
+
$key_parts = array(
|
129 |
+
$consumer->secret,
|
130 |
+
($token) ? $token->secret : ""
|
131 |
+
);
|
132 |
+
|
133 |
+
$key_parts = OAuthUtil::urlencode_rfc3986($key_parts);
|
134 |
+
$key = implode('&', $key_parts);
|
135 |
+
|
136 |
+
return base64_encode(hash_hmac('sha1', $base_string, $key, true));
|
137 |
+
}
|
138 |
+
}
|
139 |
+
|
140 |
+
/**
|
141 |
+
* The PLAINTEXT method does not provide any security protection and SHOULD only be used
|
142 |
+
* over a secure channel such as HTTPS. It does not use the Signature Base String.
|
143 |
+
* - Chapter 9.4 ("PLAINTEXT")
|
144 |
+
*/
|
145 |
+
class OAuthSignatureMethod_PLAINTEXT extends OAuthSignatureMethod {
|
146 |
+
public function get_name() {
|
147 |
+
return "PLAINTEXT";
|
148 |
+
}
|
149 |
+
|
150 |
+
/**
|
151 |
+
* oauth_signature is set to the concatenated encoded values of the Consumer Secret and
|
152 |
+
* Token Secret, separated by a '&' character (ASCII code 38), even if either secret is
|
153 |
+
* empty. The result MUST be encoded again.
|
154 |
+
* - Chapter 9.4.1 ("Generating Signatures")
|
155 |
+
*
|
156 |
+
* Please note that the second encoding MUST NOT happen in the SignatureMethod, as
|
157 |
+
* OAuthRequest handles this!
|
158 |
+
*/
|
159 |
+
public function build_signature($request, $consumer, $token) {
|
160 |
+
$key_parts = array(
|
161 |
+
$consumer->secret,
|
162 |
+
($token) ? $token->secret : ""
|
163 |
+
);
|
164 |
+
|
165 |
+
$key_parts = OAuthUtil::urlencode_rfc3986($key_parts);
|
166 |
+
$key = implode('&', $key_parts);
|
167 |
+
$request->base_string = $key;
|
168 |
+
|
169 |
+
return $key;
|
170 |
+
}
|
171 |
+
}
|
172 |
+
|
173 |
+
/**
|
174 |
+
* The RSA-SHA1 signature method uses the RSASSA-PKCS1-v1_5 signature algorithm as defined in
|
175 |
+
* [RFC3447] section 8.2 (more simply known as PKCS#1), using SHA-1 as the hash function for
|
176 |
+
* EMSA-PKCS1-v1_5. It is assumed that the Consumer has provided its RSA public key in a
|
177 |
+
* verified way to the Service Provider, in a manner which is beyond the scope of this
|
178 |
+
* specification.
|
179 |
+
* - Chapter 9.3 ("RSA-SHA1")
|
180 |
+
*/
|
181 |
+
abstract class OAuthSignatureMethod_RSA_SHA1 extends OAuthSignatureMethod {
|
182 |
+
public function get_name() {
|
183 |
+
return "RSA-SHA1";
|
184 |
+
}
|
185 |
+
|
186 |
+
// Up to the SP to implement this lookup of keys. Possible ideas are:
|
187 |
+
// (1) do a lookup in a table of trusted certs keyed off of consumer
|
188 |
+
// (2) fetch via http using a url provided by the requester
|
189 |
+
// (3) some sort of specific discovery code based on request
|
190 |
+
//
|
191 |
+
// Either way should return a string representation of the certificate
|
192 |
+
protected abstract function fetch_public_cert(&$request);
|
193 |
+
|
194 |
+
// Up to the SP to implement this lookup of keys. Possible ideas are:
|
195 |
+
// (1) do a lookup in a table of trusted certs keyed off of consumer
|
196 |
+
//
|
197 |
+
// Either way should return a string representation of the certificate
|
198 |
+
protected abstract function fetch_private_cert(&$request);
|
199 |
+
|
200 |
+
public function build_signature($request, $consumer, $token) {
|
201 |
+
$base_string = $request->get_signature_base_string();
|
202 |
+
$request->base_string = $base_string;
|
203 |
+
|
204 |
+
// Fetch the private key cert based on the request
|
205 |
+
$cert = $this->fetch_private_cert($request);
|
206 |
+
|
207 |
+
// Pull the private key ID from the certificate
|
208 |
+
$privatekeyid = openssl_get_privatekey($cert);
|
209 |
+
|
210 |
+
// Sign using the key
|
211 |
+
$ok = openssl_sign($base_string, $signature, $privatekeyid);
|
212 |
+
|
213 |
+
// Release the key resource
|
214 |
+
openssl_free_key($privatekeyid);
|
215 |
+
|
216 |
+
return base64_encode($signature);
|
217 |
+
}
|
218 |
+
|
219 |
+
public function check_signature($request, $consumer, $token, $signature) {
|
220 |
+
$decoded_sig = base64_decode($signature);
|
221 |
+
|
222 |
+
$base_string = $request->get_signature_base_string();
|
223 |
+
|
224 |
+
// Fetch the public key cert based on the request
|
225 |
+
$cert = $this->fetch_public_cert($request);
|
226 |
+
|
227 |
+
// Pull the public key ID from the certificate
|
228 |
+
$publickeyid = openssl_get_publickey($cert);
|
229 |
+
|
230 |
+
// Check the computed signature against the one passed in the query
|
231 |
+
$ok = openssl_verify($base_string, $decoded_sig, $publickeyid);
|
232 |
+
|
233 |
+
// Release the key resource
|
234 |
+
openssl_free_key($publickeyid);
|
235 |
+
|
236 |
+
return $ok == 1;
|
237 |
+
}
|
238 |
+
}
|
239 |
+
|
240 |
+
class OAuthRequest {
|
241 |
+
protected $parameters;
|
242 |
+
protected $http_method;
|
243 |
+
protected $http_url;
|
244 |
+
// for debug purposes
|
245 |
+
public $base_string;
|
246 |
+
public static $version = '1.0';
|
247 |
+
public static $POST_INPUT = 'php://input';
|
248 |
+
|
249 |
+
function __construct($http_method, $http_url, $parameters=NULL) {
|
250 |
+
$parameters = ($parameters) ? $parameters : array();
|
251 |
+
$parameters = array_merge( OAuthUtil::parse_parameters(parse_url($http_url, PHP_URL_QUERY)), $parameters);
|
252 |
+
$this->parameters = $parameters;
|
253 |
+
$this->http_method = $http_method;
|
254 |
+
$this->http_url = $http_url;
|
255 |
+
}
|
256 |
+
|
257 |
+
|
258 |
+
/**
|
259 |
+
* attempt to build up a request from what was passed to the server
|
260 |
+
*/
|
261 |
+
public static function from_request($http_method=NULL, $http_url=NULL, $parameters=NULL) {
|
262 |
+
$scheme = (!isset($_SERVER['HTTPS']) || $_SERVER['HTTPS'] != "on")
|
263 |
+
? 'http'
|
264 |
+
: 'https';
|
265 |
+
$http_url = ($http_url) ? $http_url : $scheme .
|
266 |
+
'://' . $_SERVER['SERVER_NAME'] .
|
267 |
+
':' .
|
268 |
+
$_SERVER['SERVER_PORT'] .
|
269 |
+
$_SERVER['REQUEST_URI'];
|
270 |
+
$http_method = ($http_method) ? $http_method : $_SERVER['REQUEST_METHOD'];
|
271 |
+
|
272 |
+
// We weren't handed any parameters, so let's find the ones relevant to
|
273 |
+
// this request.
|
274 |
+
// If you run XML-RPC or similar you should use this to provide your own
|
275 |
+
// parsed parameter-list
|
276 |
+
if (!$parameters) {
|
277 |
+
// Find request headers
|
278 |
+
$request_headers = OAuthUtil::get_headers();
|
279 |
+
|
280 |
+
// Parse the query-string to find GET parameters
|
281 |
+
$parameters = OAuthUtil::parse_parameters($_SERVER['QUERY_STRING']);
|
282 |
+
|
283 |
+
// It's a POST request of the proper content-type, so parse POST
|
284 |
+
// parameters and add those overriding any duplicates from GET
|
285 |
+
if ($http_method == "POST"
|
286 |
+
&& isset($request_headers['Content-Type'])
|
287 |
+
&& strstr($request_headers['Content-Type'],
|
288 |
+
'application/x-www-form-urlencoded')
|
289 |
+
) {
|
290 |
+
$post_data = OAuthUtil::parse_parameters(
|
291 |
+
file_get_contents(self::$POST_INPUT)
|
292 |
+
);
|
293 |
+
$parameters = array_merge($parameters, $post_data);
|
294 |
+
}
|
295 |
+
|
296 |
+
// We have a Authorization-header with OAuth data. Parse the header
|
297 |
+
// and add those overriding any duplicates from GET or POST
|
298 |
+
if (isset($request_headers['Authorization']) && substr($request_headers['Authorization'], 0, 6) == 'OAuth ') {
|
299 |
+
$header_parameters = OAuthUtil::split_header(
|
300 |
+
$request_headers['Authorization']
|
301 |
+
);
|
302 |
+
$parameters = array_merge($parameters, $header_parameters);
|
303 |
+
}
|
304 |
+
|
305 |
+
}
|
306 |
+
|
307 |
+
return new OAuthRequest($http_method, $http_url, $parameters);
|
308 |
+
}
|
309 |
+
|
310 |
+
/**
|
311 |
+
* pretty much a helper function to set up the request
|
312 |
+
*/
|
313 |
+
public static function from_consumer_and_token($consumer, $token, $http_method, $http_url, $parameters=NULL) {
|
314 |
+
$parameters = ($parameters) ? $parameters : array();
|
315 |
+
$defaults = array("oauth_version" => OAuthRequest::$version,
|
316 |
+
"oauth_nonce" => OAuthRequest::generate_nonce(),
|
317 |
+
"oauth_timestamp" => OAuthRequest::generate_timestamp(),
|
318 |
+
"oauth_consumer_key" => $consumer->key);
|
319 |
+
if ($token)
|
320 |
+
$defaults['oauth_token'] = $token->key;
|
321 |
+
|
322 |
+
$parameters = array_merge($defaults, $parameters);
|
323 |
+
|
324 |
+
return new OAuthRequest($http_method, $http_url, $parameters);
|
325 |
+
}
|
326 |
+
|
327 |
+
public function set_parameter($name, $value, $allow_duplicates = true) {
|
328 |
+
if ($allow_duplicates && isset($this->parameters[$name])) {
|
329 |
+
// We have already added parameter(s) with this name, so add to the list
|
330 |
+
if (is_scalar($this->parameters[$name])) {
|
331 |
+
// This is the first duplicate, so transform scalar (string)
|
332 |
+
// into an array so we can add the duplicates
|
333 |
+
$this->parameters[$name] = array($this->parameters[$name]);
|
334 |
+
}
|
335 |
+
|
336 |
+
$this->parameters[$name][] = $value;
|
337 |
+
} else {
|
338 |
+
$this->parameters[$name] = $value;
|
339 |
+
}
|
340 |
+
}
|
341 |
+
|
342 |
+
public function get_parameter($name) {
|
343 |
+
return isset($this->parameters[$name]) ? $this->parameters[$name] : null;
|
344 |
+
}
|
345 |
+
|
346 |
+
public function get_parameters() {
|
347 |
+
return $this->parameters;
|
348 |
+
}
|
349 |
+
|
350 |
+
public function unset_parameter($name) {
|
351 |
+
unset($this->parameters[$name]);
|
352 |
+
}
|
353 |
+
|
354 |
+
/**
|
355 |
+
* The request parameters, sorted and concatenated into a normalized string.
|
356 |
+
* @return string
|
357 |
+
*/
|
358 |
+
public function get_signable_parameters() {
|
359 |
+
// Grab all parameters
|
360 |
+
$params = $this->parameters;
|
361 |
+
|
362 |
+
// Remove oauth_signature if present
|
363 |
+
// Ref: Spec: 9.1.1 ("The oauth_signature parameter MUST be excluded.")
|
364 |
+
if (isset($params['oauth_signature'])) {
|
365 |
+
unset($params['oauth_signature']);
|
366 |
+
}
|
367 |
+
|
368 |
+
return OAuthUtil::build_http_query($params);
|
369 |
+
}
|
370 |
+
|
371 |
+
/**
|
372 |
+
* Returns the base string of this request
|
373 |
+
*
|
374 |
+
* The base string defined as the method, the url
|
375 |
+
* and the parameters (normalized), each urlencoded
|
376 |
+
* and the concated with &.
|
377 |
+
*/
|
378 |
+
public function get_signature_base_string() {
|
379 |
+
$parts = array(
|
380 |
+
$this->get_normalized_http_method(),
|
381 |
+
$this->get_normalized_http_url(),
|
382 |
+
$this->get_signable_parameters()
|
383 |
+
);
|
384 |
+
|
385 |
+
$parts = OAuthUtil::urlencode_rfc3986($parts);
|
386 |
+
|
387 |
+
return implode('&', $parts);
|
388 |
+
}
|
389 |
+
|
390 |
+
/**
|
391 |
+
* just uppercases the http method
|
392 |
+
*/
|
393 |
+
public function get_normalized_http_method() {
|
394 |
+
return strtoupper($this->http_method);
|
395 |
+
}
|
396 |
+
|
397 |
+
/**
|
398 |
+
* parses the url and rebuilds it to be
|
399 |
+
* scheme://host/path
|
400 |
+
*/
|
401 |
+
public function get_normalized_http_url() {
|
402 |
+
$parts = parse_url($this->http_url);
|
403 |
+
|
404 |
+
$scheme = (isset($parts['scheme'])) ? $parts['scheme'] : 'http';
|
405 |
+
$port = (isset($parts['port'])) ? $parts['port'] : (($scheme == 'https') ? '443' : '80');
|
406 |
+
$host = (isset($parts['host'])) ? strtolower($parts['host']) : '';
|
407 |
+
$path = (isset($parts['path'])) ? $parts['path'] : '';
|
408 |
+
|
409 |
+
if (($scheme == 'https' && $port != '443')
|
410 |
+
|| ($scheme == 'http' && $port != '80')) {
|
411 |
+
$host = "$host:$port";
|
412 |
+
}
|
413 |
+
return "$scheme://$host$path";
|
414 |
+
}
|
415 |
+
|
416 |
+
/**
|
417 |
+
* builds a url usable for a GET request
|
418 |
+
*/
|
419 |
+
public function to_url() {
|
420 |
+
$post_data = $this->to_postdata();
|
421 |
+
$out = $this->get_normalized_http_url();
|
422 |
+
if ($post_data) {
|
423 |
+
$out .= '?'.$post_data;
|
424 |
+
}
|
425 |
+
return $out;
|
426 |
+
}
|
427 |
+
|
428 |
+
/**
|
429 |
+
* builds the data one would send in a POST request
|
430 |
+
*/
|
431 |
+
public function to_postdata() {
|
432 |
+
return OAuthUtil::build_http_query($this->parameters);
|
433 |
+
}
|
434 |
+
|
435 |
+
/**
|
436 |
+
* builds the Authorization: header
|
437 |
+
*/
|
438 |
+
public function to_header($realm=null) {
|
439 |
+
$first = true;
|
440 |
+
if($realm) {
|
441 |
+
$out = 'Authorization: OAuth realm="' . OAuthUtil::urlencode_rfc3986($realm) . '"';
|
442 |
+
$first = false;
|
443 |
+
} else
|
444 |
+
$out = 'Authorization: OAuth';
|
445 |
+
|
446 |
+
$total = array();
|
447 |
+
foreach ($this->parameters as $k => $v) {
|
448 |
+
if (substr($k, 0, 5) != "oauth") continue;
|
449 |
+
if (is_array($v)) {
|
450 |
+
throw new OAuthExceptionPHP('Arrays not supported in headers');
|
451 |
+
}
|
452 |
+
$out .= ($first) ? ' ' : ',';
|
453 |
+
$out .= OAuthUtil::urlencode_rfc3986($k) .
|
454 |
+
'="' .
|
455 |
+
OAuthUtil::urlencode_rfc3986($v) .
|
456 |
+
'"';
|
457 |
+
$first = false;
|
458 |
+
}
|
459 |
+
return $out;
|
460 |
+
}
|
461 |
+
|
462 |
+
public function __toString() {
|
463 |
+
return $this->to_url();
|
464 |
+
}
|
465 |
+
|
466 |
+
|
467 |
+
public function sign_request($signature_method, $consumer, $token) {
|
468 |
+
$this->set_parameter(
|
469 |
+
"oauth_signature_method",
|
470 |
+
$signature_method->get_name(),
|
471 |
+
false
|
472 |
+
);
|
473 |
+
$signature = $this->build_signature($signature_method, $consumer, $token);
|
474 |
+
$this->set_parameter("oauth_signature", $signature, false);
|
475 |
+
}
|
476 |
+
|
477 |
+
public function build_signature($signature_method, $consumer, $token) {
|
478 |
+
$signature = $signature_method->build_signature($this, $consumer, $token);
|
479 |
+
return $signature;
|
480 |
+
}
|
481 |
+
|
482 |
+
/**
|
483 |
+
* util function: current timestamp
|
484 |
+
*/
|
485 |
+
private static function generate_timestamp() {
|
486 |
+
return time();
|
487 |
+
}
|
488 |
+
|
489 |
+
/**
|
490 |
+
* util function: current nonce
|
491 |
+
*/
|
492 |
+
private static function generate_nonce() {
|
493 |
+
$mt = microtime();
|
494 |
+
$rand = mt_rand();
|
495 |
+
|
496 |
+
return md5($mt . $rand); // md5s look nicer than numbers
|
497 |
+
}
|
498 |
+
}
|
499 |
+
|
500 |
+
class OAuthServer {
|
501 |
+
protected $timestamp_threshold = 300; // in seconds, five minutes
|
502 |
+
protected $version = '1.0'; // hi blaine
|
503 |
+
protected $signature_methods = array();
|
504 |
+
|
505 |
+
protected $data_store;
|
506 |
+
|
507 |
+
function __construct($data_store) {
|
508 |
+
$this->data_store = $data_store;
|
509 |
+
}
|
510 |
+
|
511 |
+
public function add_signature_method($signature_method) {
|
512 |
+
$this->signature_methods[$signature_method->get_name()] =
|
513 |
+
$signature_method;
|
514 |
+
}
|
515 |
+
|
516 |
+
// high level functions
|
517 |
+
|
518 |
+
/**
|
519 |
+
* process a request_token request
|
520 |
+
* returns the request token on success
|
521 |
+
*/
|
522 |
+
public function fetch_request_token(&$request) {
|
523 |
+
$this->get_version($request);
|
524 |
+
|
525 |
+
$consumer = $this->get_consumer($request);
|
526 |
+
|
527 |
+
// no token required for the initial token request
|
528 |
+
$token = NULL;
|
529 |
+
|
530 |
+
$this->check_signature($request, $consumer, $token);
|
531 |
+
|
532 |
+
// Rev A change
|
533 |
+
$callback = $request->get_parameter('oauth_callback');
|
534 |
+
$new_token = $this->data_store->new_request_token($consumer, $callback);
|
535 |
+
|
536 |
+
return $new_token;
|
537 |
+
}
|
538 |
+
|
539 |
+
/**
|
540 |
+
* process an access_token request
|
541 |
+
* returns the access token on success
|
542 |
+
*/
|
543 |
+
public function fetch_access_token(&$request) {
|
544 |
+
$this->get_version($request);
|
545 |
+
|
546 |
+
$consumer = $this->get_consumer($request);
|
547 |
+
|
548 |
+
// requires authorized request token
|
549 |
+
$token = $this->get_token($request, $consumer, "request");
|
550 |
+
|
551 |
+
$this->check_signature($request, $consumer, $token);
|
552 |
+
|
553 |
+
// Rev A change
|
554 |
+
$verifier = $request->get_parameter('oauth_verifier');
|
555 |
+
$new_token = $this->data_store->new_access_token($token, $consumer, $verifier);
|
556 |
+
|
557 |
+
return $new_token;
|
558 |
+
}
|
559 |
+
|
560 |
+
/**
|
561 |
+
* verify an api call, checks all the parameters
|
562 |
+
*/
|
563 |
+
public function verify_request(&$request) {
|
564 |
+
$this->get_version($request);
|
565 |
+
$consumer = $this->get_consumer($request);
|
566 |
+
$token = $this->get_token($request, $consumer, "access");
|
567 |
+
$this->check_signature($request, $consumer, $token);
|
568 |
+
return array($consumer, $token);
|
569 |
+
}
|
570 |
+
|
571 |
+
// Internals from here
|
572 |
+
/**
|
573 |
+
* version 1
|
574 |
+
*/
|
575 |
+
private function get_version(&$request) {
|
576 |
+
$version = $request->get_parameter("oauth_version");
|
577 |
+
if (!$version) {
|
578 |
+
// Service Providers MUST assume the protocol version to be 1.0 if this parameter is not present.
|
579 |
+
// Chapter 7.0 ("Accessing Protected Ressources")
|
580 |
+
$version = '1.0';
|
581 |
+
}
|
582 |
+
if ($version !== $this->version) {
|
583 |
+
throw new OAuthExceptionPHP("OAuth version '$version' not supported");
|
584 |
+
}
|
585 |
+
return $version;
|
586 |
+
}
|
587 |
+
|
588 |
+
/**
|
589 |
+
* figure out the signature with some defaults
|
590 |
+
*/
|
591 |
+
private function get_signature_method($request) {
|
592 |
+
$signature_method = $request instanceof OAuthRequest
|
593 |
+
? $request->get_parameter("oauth_signature_method")
|
594 |
+
: NULL;
|
595 |
+
|
596 |
+
if (!$signature_method) {
|
597 |
+
// According to chapter 7 ("Accessing Protected Ressources") the signature-method
|
598 |
+
// parameter is required, and we can't just fallback to PLAINTEXT
|
599 |
+
throw new OAuthExceptionPHP('No signature method parameter. This parameter is required');
|
600 |
+
}
|
601 |
+
|
602 |
+
if (!in_array($signature_method,
|
603 |
+
array_keys($this->signature_methods))) {
|
604 |
+
throw new OAuthExceptionPHP(
|
605 |
+
"Signature method '$signature_method' not supported " .
|
606 |
+
"try one of the following: " .
|
607 |
+
implode(", ", array_keys($this->signature_methods))
|
608 |
+
);
|
609 |
+
}
|
610 |
+
return $this->signature_methods[$signature_method];
|
611 |
+
}
|
612 |
+
|
613 |
+
/**
|
614 |
+
* try to find the consumer for the provided request's consumer key
|
615 |
+
*/
|
616 |
+
private function get_consumer($request) {
|
617 |
+
$consumer_key = $request instanceof OAuthRequest
|
618 |
+
? $request->get_parameter("oauth_consumer_key")
|
619 |
+
: NULL;
|
620 |
+
|
621 |
+
if (!$consumer_key) {
|
622 |
+
throw new OAuthExceptionPHP("Invalid consumer key");
|
623 |
+
}
|
624 |
+
|
625 |
+
$consumer = $this->data_store->lookup_consumer($consumer_key);
|
626 |
+
if (!$consumer) {
|
627 |
+
throw new OAuthExceptionPHP("Invalid consumer");
|
628 |
+
}
|
629 |
+
|
630 |
+
return $consumer;
|
631 |
+
}
|
632 |
+
|
633 |
+
/**
|
634 |
+
* try to find the token for the provided request's token key
|
635 |
+
*/
|
636 |
+
private function get_token($request, $consumer, $token_type="access") {
|
637 |
+
$token_field = $request instanceof OAuthRequest
|
638 |
+
? $request->get_parameter('oauth_token')
|
639 |
+
: NULL;
|
640 |
+
|
641 |
+
$token = $this->data_store->lookup_token(
|
642 |
+
$consumer, $token_type, $token_field
|
643 |
+
);
|
644 |
+
if (!$token) {
|
645 |
+
throw new OAuthExceptionPHP("Invalid $token_type token: $token_field");
|
646 |
+
}
|
647 |
+
return $token;
|
648 |
+
}
|
649 |
+
|
650 |
+
/**
|
651 |
+
* all-in-one function to check the signature on a request
|
652 |
+
* should guess the signature method appropriately
|
653 |
+
*/
|
654 |
+
private function check_signature($request, $consumer, $token) {
|
655 |
+
// this should probably be in a different method
|
656 |
+
$timestamp = $request instanceof OAuthRequest
|
657 |
+
? $request->get_parameter('oauth_timestamp')
|
658 |
+
: NULL;
|
659 |
+
$nonce = $request instanceof OAuthRequest
|
660 |
+
? $request->get_parameter('oauth_nonce')
|
661 |
+
: NULL;
|
662 |
+
|
663 |
+
$this->check_timestamp($timestamp);
|
664 |
+
$this->check_nonce($consumer, $token, $nonce, $timestamp);
|
665 |
+
|
666 |
+
$signature_method = $this->get_signature_method($request);
|
667 |
+
|
668 |
+
$signature = $request->get_parameter('oauth_signature');
|
669 |
+
$valid_sig = $signature_method->check_signature(
|
670 |
+
$request,
|
671 |
+
$consumer,
|
672 |
+
$token,
|
673 |
+
$signature
|
674 |
+
);
|
675 |
+
|
676 |
+
if (!$valid_sig) {
|
677 |
+
throw new OAuthExceptionPHP("Invalid signature");
|
678 |
+
}
|
679 |
+
}
|
680 |
+
|
681 |
+
/**
|
682 |
+
* check that the timestamp is new enough
|
683 |
+
*/
|
684 |
+
private function check_timestamp($timestamp) {
|
685 |
+
if( ! $timestamp )
|
686 |
+
throw new OAuthExceptionPHP(
|
687 |
+
'Missing timestamp parameter. The parameter is required'
|
688 |
+
);
|
689 |
+
|
690 |
+
// verify that timestamp is recentish
|
691 |
+
$now = time();
|
692 |
+
if (abs($now - $timestamp) > $this->timestamp_threshold) {
|
693 |
+
throw new OAuthExceptionPHP(
|
694 |
+
"Expired timestamp, yours $timestamp, ours $now"
|
695 |
+
);
|
696 |
+
}
|
697 |
+
}
|
698 |
+
|
699 |
+
/**
|
700 |
+
* check that the nonce is not repeated
|
701 |
+
*/
|
702 |
+
private function check_nonce($consumer, $token, $nonce, $timestamp) {
|
703 |
+
if( ! $nonce )
|
704 |
+
throw new OAuthExceptionPHP(
|
705 |
+
'Missing nonce parameter. The parameter is required'
|
706 |
+
);
|
707 |
+
|
708 |
+
// verify that the nonce is uniqueish
|
709 |
+
$found = $this->data_store->lookup_nonce(
|
710 |
+
$consumer,
|
711 |
+
$token,
|
712 |
+
$nonce,
|
713 |
+
$timestamp
|
714 |
+
);
|
715 |
+
if ($found) {
|
716 |
+
throw new OAuthExceptionPHP("Nonce already used: $nonce");
|
717 |
+
}
|
718 |
+
}
|
719 |
+
|
720 |
+
}
|
721 |
+
|
722 |
+
class OAuthDataStore {
|
723 |
+
function lookup_consumer($consumer_key) {
|
724 |
+
// implement me
|
725 |
+
}
|
726 |
+
|
727 |
+
function lookup_token($consumer, $token_type, $token) {
|
728 |
+
// implement me
|
729 |
+
}
|
730 |
+
|
731 |
+
function lookup_nonce($consumer, $token, $nonce, $timestamp) {
|
732 |
+
// implement me
|
733 |
+
}
|
734 |
+
|
735 |
+
function new_request_token($consumer, $callback = null) {
|
736 |
+
// return a new token attached to this consumer
|
737 |
+
}
|
738 |
+
|
739 |
+
function new_access_token($token, $consumer, $verifier = null) {
|
740 |
+
// return a new access token attached to this consumer
|
741 |
+
// for the user associated with this token if the request token
|
742 |
+
// is authorized
|
743 |
+
// should also invalidate the request token
|
744 |
+
}
|
745 |
+
|
746 |
+
}
|
747 |
+
|
748 |
+
class OAuthUtil {
|
749 |
+
public static function urlencode_rfc3986($input) {
|
750 |
+
if (is_array($input)) {
|
751 |
+
return array_map(array('OAuthUtil', 'urlencode_rfc3986'), $input);
|
752 |
+
} else if (is_scalar($input)) {
|
753 |
+
return str_replace(
|
754 |
+
'+',
|
755 |
+
' ',
|
756 |
+
str_replace('%7E', '~', rawurlencode($input))
|
757 |
+
);
|
758 |
+
} else {
|
759 |
+
return '';
|
760 |
+
}
|
761 |
+
}
|
762 |
+
|
763 |
+
|
764 |
+
// This decode function isn't taking into consideration the above
|
765 |
+
// modifications to the encoding process. However, this method doesn't
|
766 |
+
// seem to be used anywhere so leaving it as is.
|
767 |
+
public static function urldecode_rfc3986($string) {
|
768 |
+
return urldecode($string);
|
769 |
+
}
|
770 |
+
|
771 |
+
// Utility function for turning the Authorization: header into
|
772 |
+
// parameters, has to do some unescaping
|
773 |
+
// Can filter out any non-oauth parameters if needed (default behaviour)
|
774 |
+
// May 28th, 2010 - method updated to tjerk.meesters for a speed improvement.
|
775 |
+
// see http://code.google.com/p/oauth/issues/detail?id=163
|
776 |
+
public static function split_header($header, $only_allow_oauth_parameters = true) {
|
777 |
+
$params = array();
|
778 |
+
if (preg_match_all('/('.($only_allow_oauth_parameters ? 'oauth_' : '').'[a-z_-]*)=(:?"([^"]*)"|([^,]*))/', $header, $matches)) {
|
779 |
+
foreach ($matches[1] as $i => $h) {
|
780 |
+
$params[$h] = OAuthUtil::urldecode_rfc3986(empty($matches[3][$i]) ? $matches[4][$i] : $matches[3][$i]);
|
781 |
+
}
|
782 |
+
if (isset($params['realm'])) {
|
783 |
+
unset($params['realm']);
|
784 |
+
}
|
785 |
+
}
|
786 |
+
return $params;
|
787 |
+
}
|
788 |
+
|
789 |
+
// helper to try to sort out headers for people who aren't running apache
|
790 |
+
public static function get_headers() {
|
791 |
+
if (function_exists('apache_request_headers')) {
|
792 |
+
// we need this to get the actual Authorization: header
|
793 |
+
// because apache tends to tell us it doesn't exist
|
794 |
+
$headers = apache_request_headers();
|
795 |
+
|
796 |
+
// sanitize the output of apache_request_headers because
|
797 |
+
// we always want the keys to be Cased-Like-This and arh()
|
798 |
+
// returns the headers in the same case as they are in the
|
799 |
+
// request
|
800 |
+
$out = array();
|
801 |
+
foreach ($headers AS $key => $value) {
|
802 |
+
$key = str_replace(
|
803 |
+
" ",
|
804 |
+
"-",
|
805 |
+
ucwords(strtolower(str_replace("-", " ", $key)))
|
806 |
+
);
|
807 |
+
$out[$key] = $value;
|
808 |
+
}
|
809 |
+
} else {
|
810 |
+
// otherwise we don't have apache and are just going to have to hope
|
811 |
+
// that $_SERVER actually contains what we need
|
812 |
+
$out = array();
|
813 |
+
if( isset($_SERVER['CONTENT_TYPE']) )
|
814 |
+
$out['Content-Type'] = $_SERVER['CONTENT_TYPE'];
|
815 |
+
if( isset($_ENV['CONTENT_TYPE']) )
|
816 |
+
$out['Content-Type'] = $_ENV['CONTENT_TYPE'];
|
817 |
+
|
818 |
+
foreach ($_SERVER as $key => $value) {
|
819 |
+
if (substr($key, 0, 5) == "HTTP_") {
|
820 |
+
// this is chaos, basically it is just there to capitalize the first
|
821 |
+
// letter of every word that is not an initial HTTP and strip HTTP
|
822 |
+
// code from przemek
|
823 |
+
$key = str_replace(
|
824 |
+
" ",
|
825 |
+
"-",
|
826 |
+
ucwords(strtolower(str_replace("_", " ", substr($key, 5))))
|
827 |
+
);
|
828 |
+
$out[$key] = $value;
|
829 |
+
}
|
830 |
+
}
|
831 |
+
}
|
832 |
+
return $out;
|
833 |
+
}
|
834 |
+
|
835 |
+
// This function takes a input like a=b&a=c&d=e and returns the parsed
|
836 |
+
// parameters like this
|
837 |
+
// array('a' => array('b','c'), 'd' => 'e')
|
838 |
+
public static function parse_parameters( $input ) {
|
839 |
+
if (!isset($input) || !$input) return array();
|
840 |
+
|
841 |
+
$pairs = explode('&', $input);
|
842 |
+
|
843 |
+
$parsed_parameters = array();
|
844 |
+
foreach ($pairs as $pair) {
|
845 |
+
$split = explode('=', $pair, 2);
|
846 |
+
$parameter = OAuthUtil::urldecode_rfc3986($split[0]);
|
847 |
+
$value = isset($split[1]) ? OAuthUtil::urldecode_rfc3986($split[1]) : '';
|
848 |
+
|
849 |
+
if (isset($parsed_parameters[$parameter])) {
|
850 |
+
// We have already recieved parameter(s) with this name, so add to the list
|
851 |
+
// of parameters with this name
|
852 |
+
|
853 |
+
if (is_scalar($parsed_parameters[$parameter])) {
|
854 |
+
// This is the first duplicate, so transform scalar (string) into an array
|
855 |
+
// so we can add the duplicates
|
856 |
+
$parsed_parameters[$parameter] = array($parsed_parameters[$parameter]);
|
857 |
+
}
|
858 |
+
|
859 |
+
$parsed_parameters[$parameter][] = $value;
|
860 |
+
} else {
|
861 |
+
$parsed_parameters[$parameter] = $value;
|
862 |
+
}
|
863 |
+
}
|
864 |
+
return $parsed_parameters;
|
865 |
+
}
|
866 |
+
|
867 |
+
public static function build_http_query($params) {
|
868 |
+
if (!$params) return '';
|
869 |
+
|
870 |
+
// Urlencode both keys and values
|
871 |
+
$keys = OAuthUtil::urlencode_rfc3986(array_keys($params));
|
872 |
+
$values = OAuthUtil::urlencode_rfc3986(array_values($params));
|
873 |
+
$params = array_combine($keys, $values);
|
874 |
+
|
875 |
+
// Parameters are sorted by name, using lexicographical byte value ordering.
|
876 |
+
// Ref: Spec: 9.1.1 (1)
|
877 |
+
uksort($params, 'strcmp');
|
878 |
+
|
879 |
+
$pairs = array();
|
880 |
+
foreach ($params as $parameter => $value) {
|
881 |
+
if (is_array($value)) {
|
882 |
+
// If two or more parameters share the same name, they are sorted by their value
|
883 |
+
// Ref: Spec: 9.1.1 (1)
|
884 |
+
// June 12th, 2010 - changed to sort because of issue 164 by hidetaka
|
885 |
+
sort($value, SORT_STRING);
|
886 |
+
foreach ($value as $duplicate_value) {
|
887 |
+
$pairs[] = $parameter . '=' . $duplicate_value;
|
888 |
+
}
|
889 |
+
} else {
|
890 |
+
$pairs[] = $parameter . '=' . $value;
|
891 |
+
}
|
892 |
+
}
|
893 |
+
// For each parameter, the name is separated from the corresponding value by an '=' character (ASCII code 61)
|
894 |
+
// Each name-value pair is separated by an '&' character (ASCII code 38)
|
895 |
+
return implode('&', $pairs);
|
896 |
+
}
|
897 |
+
}
|
hybridauth/Hybrid/thirdparty/OAuth/OAuth1Client.php
ADDED
@@ -0,0 +1,229 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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 |
+
// A service client for the OAuth 1/1.0a flow.
|
9 |
+
// v0.1
|
10 |
+
class OAuth1Client{
|
11 |
+
public $api_base_url = "";
|
12 |
+
public $authorize_url = "";
|
13 |
+
public $authenticate_url = "";
|
14 |
+
public $request_token_url = "";
|
15 |
+
public $access_token_url = "";
|
16 |
+
|
17 |
+
public $request_token_method = "GET";
|
18 |
+
public $access_token_method = "GET";
|
19 |
+
|
20 |
+
public $redirect_uri = "";
|
21 |
+
|
22 |
+
public $decode_json = true;
|
23 |
+
public $curl_time_out = 30;
|
24 |
+
public $curl_connect_time_out = 30;
|
25 |
+
public $curl_ssl_verifypeer = false;
|
26 |
+
public $curl_auth_header = true;
|
27 |
+
public $curl_useragent = "OAuth/1 Simple PHP Client v0.1; HybridAuth http://hybridauth.sourceforge.net/";
|
28 |
+
public $curl_proxy = null;
|
29 |
+
|
30 |
+
//--
|
31 |
+
|
32 |
+
public $http_code = "";
|
33 |
+
public $http_info = "";
|
34 |
+
|
35 |
+
/**
|
36 |
+
* OAuth client constructor
|
37 |
+
*/
|
38 |
+
function __construct( $consumer_key, $consumer_secret, $oauth_token = null, $oauth_token_secret = null )
|
39 |
+
{
|
40 |
+
$this->sha1_method = new OAuthSignatureMethod_HMAC_SHA1();
|
41 |
+
$this->consumer = new OAuthConsumer( $consumer_key, $consumer_secret );
|
42 |
+
$this->token = null;
|
43 |
+
|
44 |
+
if ( $oauth_token && $oauth_token_secret ){
|
45 |
+
$this->token = new OAuthConsumer( $oauth_token, $oauth_token_secret );
|
46 |
+
}
|
47 |
+
}
|
48 |
+
|
49 |
+
/**
|
50 |
+
* Build authorize url
|
51 |
+
*
|
52 |
+
* @return string
|
53 |
+
*/
|
54 |
+
function authorizeUrl( $token, $extras =array() )
|
55 |
+
{
|
56 |
+
if ( is_array( $token ) ){
|
57 |
+
$token = $token['oauth_token'];
|
58 |
+
}
|
59 |
+
|
60 |
+
$parameters = array( "oauth_token" => $token );
|
61 |
+
|
62 |
+
if( count($extras) )
|
63 |
+
foreach( $extras as $k=>$v )
|
64 |
+
$parameters[$k] = $v;
|
65 |
+
|
66 |
+
return $this->authorize_url . "?" . http_build_query( $parameters );
|
67 |
+
}
|
68 |
+
|
69 |
+
/**
|
70 |
+
* Get a request_token from provider
|
71 |
+
*
|
72 |
+
* @return array a key/value array containing oauth_token and oauth_token_secret
|
73 |
+
*/
|
74 |
+
function requestToken( $callback = null )
|
75 |
+
{
|
76 |
+
$parameters = array();
|
77 |
+
|
78 |
+
if ( $callback ) {
|
79 |
+
$this->redirect_uri = $parameters['oauth_callback'] = $callback;
|
80 |
+
}
|
81 |
+
|
82 |
+
$request = $this->signedRequest( $this->request_token_url, $this->request_token_method, $parameters );
|
83 |
+
$token = OAuthUtil::parse_parameters( $request );
|
84 |
+
$this->token = new OAuthConsumer( $token['oauth_token'], $token['oauth_token_secret'] );
|
85 |
+
|
86 |
+
return $token;
|
87 |
+
}
|
88 |
+
|
89 |
+
/**
|
90 |
+
* Exchange the request token and secret for an access token and secret, to sign API calls.
|
91 |
+
*
|
92 |
+
* @return array array('oauth_token' => the access token, 'oauth_token_secret' => the access secret)
|
93 |
+
*/
|
94 |
+
function accessToken( $oauth_verifier = false, $oauth_token = false )
|
95 |
+
{
|
96 |
+
$parameters = array();
|
97 |
+
|
98 |
+
// 1.0a
|
99 |
+
if ( $oauth_verifier ) {
|
100 |
+
$parameters['oauth_verifier'] = $oauth_verifier;
|
101 |
+
}
|
102 |
+
|
103 |
+
$request = $this->signedRequest( $this->access_token_url, $this->access_token_method, $parameters );
|
104 |
+
$token = OAuthUtil::parse_parameters( $request );
|
105 |
+
$this->token = new OAuthConsumer( $token['oauth_token'], $token['oauth_token_secret'] );
|
106 |
+
|
107 |
+
return $token;
|
108 |
+
}
|
109 |
+
|
110 |
+
/**
|
111 |
+
* GET wrappwer for provider apis request
|
112 |
+
*/
|
113 |
+
function get($url, $parameters = array())
|
114 |
+
{
|
115 |
+
return $this->api($url, 'GET', $parameters);
|
116 |
+
}
|
117 |
+
|
118 |
+
/**
|
119 |
+
* POST wreapper for provider apis request
|
120 |
+
*/
|
121 |
+
function post($url, $parameters = array())
|
122 |
+
{
|
123 |
+
return $this->api($url, 'POST', $parameters);
|
124 |
+
}
|
125 |
+
|
126 |
+
/**
|
127 |
+
* Format and sign an oauth for provider api
|
128 |
+
*/
|
129 |
+
function api( $url, $method = 'GET', $parameters = array() )
|
130 |
+
{
|
131 |
+
if ( strrpos($url, 'http://') !== 0 && strrpos($url, 'https://') !== 0 ) {
|
132 |
+
$url = $this->api_base_url . $url;
|
133 |
+
}
|
134 |
+
|
135 |
+
$response = $this->signedRequest( $url, $method, $parameters );
|
136 |
+
|
137 |
+
if( $this->decode_json ){
|
138 |
+
$response = json_decode( $response );
|
139 |
+
}
|
140 |
+
|
141 |
+
return $response;
|
142 |
+
}
|
143 |
+
|
144 |
+
/**
|
145 |
+
* Make signed request
|
146 |
+
*/
|
147 |
+
function signedRequest( $url, $method, $parameters )
|
148 |
+
{
|
149 |
+
$request = OAuthRequest::from_consumer_and_token($this->consumer, $this->token, $method, $url, $parameters);
|
150 |
+
$request->sign_request($this->sha1_method, $this->consumer, $this->token);
|
151 |
+
switch ($method) {
|
152 |
+
case 'GET': return $this->request( $request->to_url(), 'GET' );
|
153 |
+
default : return $this->request( $request->get_normalized_http_url(), $method, $request->to_postdata(), $request->to_header() ) ;
|
154 |
+
}
|
155 |
+
}
|
156 |
+
|
157 |
+
/**
|
158 |
+
* Make http request
|
159 |
+
*/
|
160 |
+
function request( $url, $method, $postfields = NULL, $auth_header = null )
|
161 |
+
{
|
162 |
+
Hybrid_Logger::info( "Enter OAuth1Client::request( $method, $url )" );
|
163 |
+
Hybrid_Logger::debug( "OAuth1Client::request(). dump post fields: ", serialize( $postfields ) );
|
164 |
+
|
165 |
+
$this->http_info = array();
|
166 |
+
$ci = curl_init();
|
167 |
+
|
168 |
+
/* Curl settings */
|
169 |
+
curl_setopt( $ci, CURLOPT_USERAGENT , $this->curl_useragent );
|
170 |
+
curl_setopt( $ci, CURLOPT_CONNECTTIMEOUT, $this->curl_connect_time_out );
|
171 |
+
curl_setopt( $ci, CURLOPT_TIMEOUT , $this->curl_time_out );
|
172 |
+
curl_setopt( $ci, CURLOPT_RETURNTRANSFER, TRUE );
|
173 |
+
curl_setopt( $ci, CURLOPT_HTTPHEADER , array('Expect:') );
|
174 |
+
curl_setopt( $ci, CURLOPT_SSL_VERIFYPEER, $this->curl_ssl_verifypeer );
|
175 |
+
curl_setopt( $ci, CURLOPT_HEADERFUNCTION, array($this, 'getHeader') );
|
176 |
+
curl_setopt( $ci, CURLOPT_HEADER , FALSE );
|
177 |
+
|
178 |
+
if($this->curl_proxy){
|
179 |
+
curl_setopt( $ci, CURLOPT_PROXY , $this->curl_proxy);
|
180 |
+
}
|
181 |
+
|
182 |
+
switch ($method){
|
183 |
+
case 'POST':
|
184 |
+
curl_setopt( $ci, CURLOPT_POST, TRUE );
|
185 |
+
|
186 |
+
if ( !empty($postfields) ){
|
187 |
+
curl_setopt( $ci, CURLOPT_POSTFIELDS, $postfields );
|
188 |
+
}
|
189 |
+
|
190 |
+
if ( !empty($auth_header) && $this->curl_auth_header ){
|
191 |
+
curl_setopt( $ci, CURLOPT_HTTPHEADER, array( 'Content-Type: application/atom+xml', $auth_header ) );
|
192 |
+
}
|
193 |
+
break;
|
194 |
+
case 'DELETE':
|
195 |
+
curl_setopt( $ci, CURLOPT_CUSTOMREQUEST, 'DELETE' );
|
196 |
+
if ( !empty($postfields) ){
|
197 |
+
$url = "{$url}?{$postfields}";
|
198 |
+
}
|
199 |
+
}
|
200 |
+
|
201 |
+
curl_setopt($ci, CURLOPT_URL, $url);
|
202 |
+
$response = curl_exec($ci);
|
203 |
+
|
204 |
+
Hybrid_Logger::debug( "OAuth1Client::request(). dump request info: ", serialize( curl_getinfo($ci) ) );
|
205 |
+
Hybrid_Logger::debug( "OAuth1Client::request(). dump request result: ", serialize( $response ) );
|
206 |
+
|
207 |
+
$this->http_code = curl_getinfo($ci, CURLINFO_HTTP_CODE);
|
208 |
+
$this->http_info = array_merge($this->http_info, curl_getinfo($ci));
|
209 |
+
|
210 |
+
curl_close ($ci);
|
211 |
+
|
212 |
+
return $response;
|
213 |
+
}
|
214 |
+
|
215 |
+
/**
|
216 |
+
* Get the header info to store.
|
217 |
+
*/
|
218 |
+
function getHeader($ch, $header) {
|
219 |
+
$i = strpos($header, ':');
|
220 |
+
|
221 |
+
if ( !empty($i) ){
|
222 |
+
$key = str_replace('-', '_', strtolower(substr($header, 0, $i)));
|
223 |
+
$value = trim(substr($header, $i + 2));
|
224 |
+
$this->http_header[$key] = $value;
|
225 |
+
}
|
226 |
+
|
227 |
+
return strlen($header);
|
228 |
+
}
|
229 |
+
}
|
hybridauth/Hybrid/thirdparty/OAuth/OAuth2Client.php
ADDED
@@ -0,0 +1,245 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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 |
+
// A service client for the OAuth 2 flow.
|
9 |
+
// v0.1
|
10 |
+
class OAuth2Client
|
11 |
+
{
|
12 |
+
public $api_base_url = "";
|
13 |
+
public $authorize_url = "";
|
14 |
+
public $token_url = "";
|
15 |
+
public $token_info_url = "";
|
16 |
+
|
17 |
+
public $client_id = "" ;
|
18 |
+
public $client_secret = "" ;
|
19 |
+
public $redirect_uri = "" ;
|
20 |
+
public $access_token = "" ;
|
21 |
+
public $refresh_token = "" ;
|
22 |
+
|
23 |
+
public $access_token_expires_in = "" ;
|
24 |
+
public $access_token_expires_at = "" ;
|
25 |
+
|
26 |
+
//--
|
27 |
+
|
28 |
+
public $sign_token_name = "access_token";
|
29 |
+
public $decode_json = true;
|
30 |
+
public $curl_time_out = 30;
|
31 |
+
public $curl_connect_time_out = 30;
|
32 |
+
public $curl_ssl_verifypeer = false;
|
33 |
+
public $curl_header = array();
|
34 |
+
public $curl_useragent = "OAuth/2 Simple PHP Client v0.1; HybridAuth http://hybridauth.sourceforge.net/";
|
35 |
+
public $curl_authenticate_method = "POST";
|
36 |
+
public $curl_proxy = null;
|
37 |
+
|
38 |
+
//--
|
39 |
+
|
40 |
+
public $http_code = "";
|
41 |
+
public $http_info = "";
|
42 |
+
|
43 |
+
//--
|
44 |
+
|
45 |
+
public function __construct( $client_id = false, $client_secret = false, $redirect_uri='' )
|
46 |
+
{
|
47 |
+
$this->client_id = $client_id;
|
48 |
+
$this->client_secret = $client_secret;
|
49 |
+
$this->redirect_uri = $redirect_uri;
|
50 |
+
}
|
51 |
+
|
52 |
+
public function authorizeUrl( $extras = array() )
|
53 |
+
{
|
54 |
+
$params = array(
|
55 |
+
"client_id" => $this->client_id,
|
56 |
+
"redirect_uri" => $this->redirect_uri,
|
57 |
+
"response_type" => "code"
|
58 |
+
);
|
59 |
+
|
60 |
+
if( count($extras) )
|
61 |
+
foreach( $extras as $k=>$v )
|
62 |
+
$params[$k] = $v;
|
63 |
+
|
64 |
+
return $this->authorize_url . "?" . http_build_query( $params );
|
65 |
+
}
|
66 |
+
|
67 |
+
public function authenticate( $code )
|
68 |
+
{
|
69 |
+
$params = array(
|
70 |
+
"client_id" => $this->client_id,
|
71 |
+
"client_secret" => $this->client_secret,
|
72 |
+
"grant_type" => "authorization_code",
|
73 |
+
"redirect_uri" => $this->redirect_uri,
|
74 |
+
"code" => $code
|
75 |
+
);
|
76 |
+
|
77 |
+
$response = $this->request( $this->token_url, $params, $this->curl_authenticate_method );
|
78 |
+
|
79 |
+
$response = $this->parseRequestResult( $response );
|
80 |
+
|
81 |
+
if( ! $response || ! isset( $response->access_token ) ){
|
82 |
+
throw new Exception( "The Authorization Service has return: " . $response->error );
|
83 |
+
}
|
84 |
+
|
85 |
+
if( isset( $response->access_token ) ) $this->access_token = $response->access_token;
|
86 |
+
if( isset( $response->refresh_token ) ) $this->refresh_token = $response->refresh_token;
|
87 |
+
if( isset( $response->expires_in ) ) $this->access_token_expires_in = $response->expires_in;
|
88 |
+
|
89 |
+
// calculate when the access token expire
|
90 |
+
if( isset($response->expires_in)) {
|
91 |
+
$this->access_token_expires_at = time() + $response->expires_in;
|
92 |
+
}
|
93 |
+
|
94 |
+
return $response;
|
95 |
+
}
|
96 |
+
|
97 |
+
public function authenticated()
|
98 |
+
{
|
99 |
+
if ( $this->access_token ){
|
100 |
+
if ( $this->token_info_url && $this->refresh_token ){
|
101 |
+
// check if this access token has expired,
|
102 |
+
$tokeninfo = $this->tokenInfo( $this->access_token );
|
103 |
+
|
104 |
+
// if yes, access_token has expired, then ask for a new one
|
105 |
+
if( $tokeninfo && isset( $tokeninfo->error ) ){
|
106 |
+
$response = $this->refreshToken( $this->refresh_token );
|
107 |
+
|
108 |
+
// if wrong response
|
109 |
+
if( ! isset( $response->access_token ) || ! $response->access_token ){
|
110 |
+
throw new Exception( "The Authorization Service has return an invalid response while requesting a new access token. given up!" );
|
111 |
+
}
|
112 |
+
|
113 |
+
// set new access_token
|
114 |
+
$this->access_token = $response->access_token;
|
115 |
+
}
|
116 |
+
}
|
117 |
+
|
118 |
+
return true;
|
119 |
+
}
|
120 |
+
|
121 |
+
return false;
|
122 |
+
}
|
123 |
+
|
124 |
+
/**
|
125 |
+
* Format and sign an oauth for provider api
|
126 |
+
*/
|
127 |
+
public function api( $url, $method = "GET", $parameters = array() )
|
128 |
+
{
|
129 |
+
if ( strrpos($url, 'http://') !== 0 && strrpos($url, 'https://') !== 0 ) {
|
130 |
+
$url = $this->api_base_url . $url;
|
131 |
+
}
|
132 |
+
|
133 |
+
$parameters[$this->sign_token_name] = $this->access_token;
|
134 |
+
$response = null;
|
135 |
+
|
136 |
+
switch( $method ){
|
137 |
+
case 'GET' : $response = $this->request( $url, $parameters, "GET" ); break;
|
138 |
+
case 'POST' : $response = $this->request( $url, $parameters, "POST" ); break;
|
139 |
+
}
|
140 |
+
|
141 |
+
if( $response && $this->decode_json ){
|
142 |
+
$response = json_decode( $response );
|
143 |
+
}
|
144 |
+
|
145 |
+
return $response;
|
146 |
+
}
|
147 |
+
|
148 |
+
/**
|
149 |
+
* GET wrappwer for provider apis request
|
150 |
+
*/
|
151 |
+
function get( $url, $parameters = array() )
|
152 |
+
{
|
153 |
+
return $this->api( $url, 'GET', $parameters );
|
154 |
+
}
|
155 |
+
|
156 |
+
/**
|
157 |
+
* POST wreapper for provider apis request
|
158 |
+
*/
|
159 |
+
function post( $url, $parameters = array() )
|
160 |
+
{
|
161 |
+
return $this->api( $url, 'POST', $parameters );
|
162 |
+
}
|
163 |
+
|
164 |
+
// -- tokens
|
165 |
+
|
166 |
+
public function tokenInfo($accesstoken)
|
167 |
+
{
|
168 |
+
$params['access_token'] = $this->access_token;
|
169 |
+
$response = $this->request( $this->token_info_url, $params );
|
170 |
+
return $this->parseRequestResult( $response );
|
171 |
+
}
|
172 |
+
|
173 |
+
public function refreshToken( $parameters = array() )
|
174 |
+
{
|
175 |
+
$params = array(
|
176 |
+
"client_id" => $this->client_id,
|
177 |
+
"client_secret" => $this->client_secret,
|
178 |
+
"grant_type" => "refresh_token"
|
179 |
+
);
|
180 |
+
|
181 |
+
foreach($parameters as $k=>$v ){
|
182 |
+
$params[$k] = $v;
|
183 |
+
}
|
184 |
+
|
185 |
+
$response = $this->request( $this->token_url, $params, "POST" );
|
186 |
+
return $this->parseRequestResult( $response );
|
187 |
+
}
|
188 |
+
|
189 |
+
// -- utilities
|
190 |
+
|
191 |
+
private function request( $url, $params=false, $type="GET" )
|
192 |
+
{
|
193 |
+
Hybrid_Logger::info( "Enter OAuth2Client::request( $url )" );
|
194 |
+
Hybrid_Logger::debug( "OAuth2Client::request(). dump request params: ", serialize( $params ) );
|
195 |
+
|
196 |
+
if( $type == "GET" ){
|
197 |
+
$url = $url . ( strpos( $url, '?' ) ? '&' : '?' ) . http_build_query( $params );
|
198 |
+
}
|
199 |
+
|
200 |
+
$this->http_info = array();
|
201 |
+
$ch = curl_init();
|
202 |
+
|
203 |
+
curl_setopt($ch, CURLOPT_URL , $url );
|
204 |
+
curl_setopt($ch, CURLOPT_RETURNTRANSFER , 1 );
|
205 |
+
curl_setopt($ch, CURLOPT_TIMEOUT , $this->curl_time_out );
|
206 |
+
curl_setopt($ch, CURLOPT_USERAGENT , $this->curl_useragent );
|
207 |
+
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT , $this->curl_connect_time_out );
|
208 |
+
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER , $this->curl_ssl_verifypeer );
|
209 |
+
curl_setopt($ch, CURLOPT_HTTPHEADER , $this->curl_header );
|
210 |
+
|
211 |
+
if($this->curl_proxy){
|
212 |
+
curl_setopt( $ch, CURLOPT_PROXY , $this->curl_proxy);
|
213 |
+
}
|
214 |
+
|
215 |
+
if( $type == "POST" ){
|
216 |
+
curl_setopt($ch, CURLOPT_POST, 1);
|
217 |
+
if($params) curl_setopt( $ch, CURLOPT_POSTFIELDS, $params );
|
218 |
+
}
|
219 |
+
|
220 |
+
$response = curl_exec($ch);
|
221 |
+
Hybrid_Logger::debug( "OAuth2Client::request(). dump request info: ", serialize( curl_getinfo($ch) ) );
|
222 |
+
Hybrid_Logger::debug( "OAuth2Client::request(). dump request result: ", serialize( $response ) );
|
223 |
+
|
224 |
+
$this->http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
|
225 |
+
$this->http_info = array_merge($this->http_info, curl_getinfo($ch));
|
226 |
+
|
227 |
+
curl_close ($ch);
|
228 |
+
|
229 |
+
return $response;
|
230 |
+
}
|
231 |
+
|
232 |
+
private function parseRequestResult( $result )
|
233 |
+
{
|
234 |
+
if( json_decode( $result ) ) return json_decode( $result );
|
235 |
+
|
236 |
+
parse_str( $result, $ouput );
|
237 |
+
|
238 |
+
$result = new StdClass();
|
239 |
+
|
240 |
+
foreach( $ouput as $k => $v )
|
241 |
+
$result->$k = $v;
|
242 |
+
|
243 |
+
return $result;
|
244 |
+
}
|
245 |
+
}
|
hybridauth/Hybrid/thirdparty/OpenID/LightOpenID.php
ADDED
@@ -0,0 +1,834 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
// http://gitorious.org/lightopenid
|
3 |
+
// updated 29/12/2012
|
4 |
+
|
5 |
+
/**
|
6 |
+
* This class provides a simple interface for OpenID (1.1 and 2.0) authentication.
|
7 |
+
* Supports Yadis discovery.
|
8 |
+
* The authentication process is stateless/dumb.
|
9 |
+
*
|
10 |
+
* Usage:
|
11 |
+
* Sign-on with OpenID is a two step process:
|
12 |
+
* Step one is authentication with the provider:
|
13 |
+
* <code>
|
14 |
+
* $openid = new LightOpenID('my-host.example.org');
|
15 |
+
* $openid->identity = 'ID supplied by user';
|
16 |
+
* header('Location: ' . $openid->authUrl());
|
17 |
+
* </code>
|
18 |
+
* The provider then sends various parameters via GET, one of them is openid_mode.
|
19 |
+
* Step two is verification:
|
20 |
+
* <code>
|
21 |
+
* $openid = new LightOpenID('my-host.example.org');
|
22 |
+
* if ($openid->mode) {
|
23 |
+
* echo $openid->validate() ? 'Logged in.' : 'Failed';
|
24 |
+
* }
|
25 |
+
* </code>
|
26 |
+
*
|
27 |
+
* Change the 'my-host.example.org' to your domain name. Do NOT use $_SERVER['HTTP_HOST']
|
28 |
+
* for that, unless you know what you are doing.
|
29 |
+
*
|
30 |
+
* Optionally, you can set $returnUrl and $realm (or $trustRoot, which is an alias).
|
31 |
+
* The default values for those are:
|
32 |
+
* $openid->realm = (!empty($_SERVER['HTTPS']) ? 'https' : 'http') . '://' . $_SERVER['HTTP_HOST'];
|
33 |
+
* $openid->returnUrl = $openid->realm . $_SERVER['REQUEST_URI'];
|
34 |
+
* If you don't know their meaning, refer to any openid tutorial, or specification. Or just guess.
|
35 |
+
*
|
36 |
+
* AX and SREG extensions are supported.
|
37 |
+
* To use them, specify $openid->required and/or $openid->optional before calling $openid->authUrl().
|
38 |
+
* These are arrays, with values being AX schema paths (the 'path' part of the URL).
|
39 |
+
* For example:
|
40 |
+
* $openid->required = array('namePerson/friendly', 'contact/email');
|
41 |
+
* $openid->optional = array('namePerson/first');
|
42 |
+
* If the server supports only SREG or OpenID 1.1, these are automaticaly
|
43 |
+
* mapped to SREG names, so that user doesn't have to know anything about the server.
|
44 |
+
*
|
45 |
+
* To get the values, use $openid->getAttributes().
|
46 |
+
*
|
47 |
+
*
|
48 |
+
* The library requires PHP >= 5.1.2 with curl or http/https stream wrappers enabled.
|
49 |
+
* @author Mewp
|
50 |
+
* @copyright Copyright (c) 2010, Mewp
|
51 |
+
* @license http://www.opensource.org/licenses/mit-license.php MIT
|
52 |
+
*/
|
53 |
+
class LightOpenID
|
54 |
+
{
|
55 |
+
public $returnUrl
|
56 |
+
, $required = array()
|
57 |
+
, $optional = array()
|
58 |
+
, $verify_peer = null
|
59 |
+
, $capath = null
|
60 |
+
, $cainfo = null
|
61 |
+
, $data;
|
62 |
+
private $identity, $claimed_id;
|
63 |
+
protected $server, $version, $trustRoot, $aliases, $identifier_select = false
|
64 |
+
, $ax = false, $sreg = false, $setup_url = null, $headers = array();
|
65 |
+
static protected $ax_to_sreg = array(
|
66 |
+
'namePerson/friendly' => 'nickname',
|
67 |
+
'contact/email' => 'email',
|
68 |
+
'namePerson' => 'fullname',
|
69 |
+
'birthDate' => 'dob',
|
70 |
+
'person/gender' => 'gender',
|
71 |
+
'contact/postalCode/home' => 'postcode',
|
72 |
+
'contact/country/home' => 'country',
|
73 |
+
'pref/language' => 'language',
|
74 |
+
'pref/timezone' => 'timezone',
|
75 |
+
);
|
76 |
+
|
77 |
+
function __construct($host)
|
78 |
+
{
|
79 |
+
$this->trustRoot = (strpos($host, '://') ? $host : 'http://' . $host);
|
80 |
+
if ((!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off')
|
81 |
+
|| (isset($_SERVER['HTTP_X_FORWARDED_PROTO'])
|
82 |
+
&& $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https')
|
83 |
+
) {
|
84 |
+
$this->trustRoot = (strpos($host, '://') ? $host : 'https://' . $host);
|
85 |
+
}
|
86 |
+
|
87 |
+
if(($host_end = strpos($this->trustRoot, '/', 8)) !== false) {
|
88 |
+
$this->trustRoot = substr($this->trustRoot, 0, $host_end);
|
89 |
+
}
|
90 |
+
|
91 |
+
$uri = rtrim(preg_replace('#((?<=\?)|&)openid\.[^&]+#', '', $_SERVER['REQUEST_URI']), '?');
|
92 |
+
$this->returnUrl = $this->trustRoot . $uri;
|
93 |
+
|
94 |
+
$this->data = ($_SERVER['REQUEST_METHOD'] === 'POST') ? $_POST : $_GET;
|
95 |
+
|
96 |
+
if(!function_exists('curl_init') && !in_array('https', stream_get_wrappers())) {
|
97 |
+
throw new ErrorException('You must have either https wrappers or curl enabled.');
|
98 |
+
}
|
99 |
+
}
|
100 |
+
|
101 |
+
function __set($name, $value)
|
102 |
+
{
|
103 |
+
switch ($name) {
|
104 |
+
case 'identity':
|
105 |
+
if (strlen($value = trim((String) $value))) {
|
106 |
+
if (preg_match('#^xri:/*#i', $value, $m)) {
|
107 |
+
$value = substr($value, strlen($m[0]));
|
108 |
+
} elseif (!preg_match('/^(?:[=@+\$!\(]|https?:)/i', $value)) {
|
109 |
+
$value = "http://$value";
|
110 |
+
}
|
111 |
+
if (preg_match('#^https?://[^/]+$#i', $value, $m)) {
|
112 |
+
$value .= '/';
|
113 |
+
}
|
114 |
+
}
|
115 |
+
$this->$name = $this->claimed_id = $value;
|
116 |
+
break;
|
117 |
+
case 'trustRoot':
|
118 |
+
case 'realm':
|
119 |
+
$this->trustRoot = trim($value);
|
120 |
+
}
|
121 |
+
}
|
122 |
+
|
123 |
+
function __get($name)
|
124 |
+
{
|
125 |
+
switch ($name) {
|
126 |
+
case 'identity':
|
127 |
+
# We return claimed_id instead of identity,
|
128 |
+
# because the developer should see the claimed identifier,
|
129 |
+
# i.e. what he set as identity, not the op-local identifier (which is what we verify)
|
130 |
+
return $this->claimed_id;
|
131 |
+
case 'trustRoot':
|
132 |
+
case 'realm':
|
133 |
+
return $this->trustRoot;
|
134 |
+
case 'mode':
|
135 |
+
return empty($this->data['openid_mode']) ? null : $this->data['openid_mode'];
|
136 |
+
}
|
137 |
+
}
|
138 |
+
|
139 |
+
/**
|
140 |
+
* Checks if the server specified in the url exists.
|
141 |
+
*
|
142 |
+
* @param $url url to check
|
143 |
+
* @return true, if the server exists; false otherwise
|
144 |
+
*/
|
145 |
+
function hostExists($url)
|
146 |
+
{
|
147 |
+
if (strpos($url, '/') === false) {
|
148 |
+
$server = $url;
|
149 |
+
} else {
|
150 |
+
$server = @parse_url($url, PHP_URL_HOST);
|
151 |
+
}
|
152 |
+
|
153 |
+
if (!$server) {
|
154 |
+
return false;
|
155 |
+
}
|
156 |
+
|
157 |
+
return !!gethostbynamel($server);
|
158 |
+
}
|
159 |
+
|
160 |
+
protected function request_curl($url, $method='GET', $params=array(), $update_claimed_id)
|
161 |
+
{
|
162 |
+
$params = http_build_query($params, '', '&');
|
163 |
+
$curl = curl_init($url . ($method == 'GET' && $params ? '?' . $params : ''));
|
164 |
+
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);
|
165 |
+
curl_setopt($curl, CURLOPT_HEADER, false);
|
166 |
+
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
|
167 |
+
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
|
168 |
+
curl_setopt($curl, CURLOPT_HTTPHEADER, array('Accept: application/xrds+xml, */*'));
|
169 |
+
|
170 |
+
if($this->verify_peer !== null) {
|
171 |
+
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, $this->verify_peer);
|
172 |
+
if($this->capath) {
|
173 |
+
curl_setopt($curl, CURLOPT_CAPATH, $this->capath);
|
174 |
+
}
|
175 |
+
|
176 |
+
if($this->cainfo) {
|
177 |
+
curl_setopt($curl, CURLOPT_CAINFO, $this->cainfo);
|
178 |
+
}
|
179 |
+
}
|
180 |
+
|
181 |
+
if ($method == 'POST') {
|
182 |
+
curl_setopt($curl, CURLOPT_POST, true);
|
183 |
+
curl_setopt($curl, CURLOPT_POSTFIELDS, $params);
|
184 |
+
} elseif ($method == 'HEAD') {
|
185 |
+
curl_setopt($curl, CURLOPT_HEADER, true);
|
186 |
+
curl_setopt($curl, CURLOPT_NOBODY, true);
|
187 |
+
} else {
|
188 |
+
curl_setopt($curl, CURLOPT_HEADER, true);
|
189 |
+
curl_setopt($curl, CURLOPT_HTTPGET, true);
|
190 |
+
}
|
191 |
+
$response = curl_exec($curl);
|
192 |
+
|
193 |
+
if($method == 'HEAD' && curl_getinfo($curl, CURLINFO_HTTP_CODE) == 405) {
|
194 |
+
curl_setopt($curl, CURLOPT_HTTPGET, true);
|
195 |
+
$response = curl_exec($curl);
|
196 |
+
$response = substr($response, 0, strpos($response, "\r\n\r\n"));
|
197 |
+
}
|
198 |
+
|
199 |
+
if($method == 'HEAD' || $method == 'GET') {
|
200 |
+
$header_response = $response;
|
201 |
+
|
202 |
+
# If it's a GET request, we want to only parse the header part.
|
203 |
+
if($method == 'GET') {
|
204 |
+
$header_response = substr($response, 0, strpos($response, "\r\n\r\n"));
|
205 |
+
}
|
206 |
+
|
207 |
+
$headers = array();
|
208 |
+
foreach(explode("\n", $header_response) as $header) {
|
209 |
+
$pos = strpos($header,':');
|
210 |
+
if ($pos !== false) {
|
211 |
+
$name = strtolower(trim(substr($header, 0, $pos)));
|
212 |
+
$headers[$name] = trim(substr($header, $pos+1));
|
213 |
+
}
|
214 |
+
}
|
215 |
+
|
216 |
+
if($update_claimed_id) {
|
217 |
+
# Updating claimed_id in case of redirections.
|
218 |
+
$effective_url = curl_getinfo($curl, CURLINFO_EFFECTIVE_URL);
|
219 |
+
if($effective_url != $url) {
|
220 |
+
$this->identity = $this->claimed_id = $effective_url;
|
221 |
+
}
|
222 |
+
}
|
223 |
+
|
224 |
+
if($method == 'HEAD') {
|
225 |
+
return $headers;
|
226 |
+
} else {
|
227 |
+
$this->headers = $headers;
|
228 |
+
}
|
229 |
+
}
|
230 |
+
|
231 |
+
if (curl_errno($curl)) {
|
232 |
+
throw new ErrorException(curl_error($curl), curl_errno($curl));
|
233 |
+
}
|
234 |
+
|
235 |
+
return $response;
|
236 |
+
}
|
237 |
+
|
238 |
+
protected function parse_header_array($array, $update_claimed_id)
|
239 |
+
{
|
240 |
+
$headers = array();
|
241 |
+
foreach($array as $header) {
|
242 |
+
$pos = strpos($header,':');
|
243 |
+
if ($pos !== false) {
|
244 |
+
$name = strtolower(trim(substr($header, 0, $pos)));
|
245 |
+
$headers[$name] = trim(substr($header, $pos+1));
|
246 |
+
|
247 |
+
# Following possible redirections. The point is just to have
|
248 |
+
# claimed_id change with them, because the redirections
|
249 |
+
# are followed automatically.
|
250 |
+
# We ignore redirections with relative paths.
|
251 |
+
# If any known provider uses them, file a bug report.
|
252 |
+
if($name == 'location' && $update_claimed_id) {
|
253 |
+
if(strpos($headers[$name], 'http') === 0) {
|
254 |
+
$this->identity = $this->claimed_id = $headers[$name];
|
255 |
+
} elseif($headers[$name][0] == '/') {
|
256 |
+
$parsed_url = parse_url($this->claimed_id);
|
257 |
+
$this->identity =
|
258 |
+
$this->claimed_id = $parsed_url['scheme'] . '://'
|
259 |
+
. $parsed_url['host']
|
260 |
+
. $headers[$name];
|
261 |
+
}
|
262 |
+
}
|
263 |
+
}
|
264 |
+
}
|
265 |
+
return $headers;
|
266 |
+
}
|
267 |
+
|
268 |
+
protected function request_streams($url, $method='GET', $params=array(), $update_claimed_id)
|
269 |
+
{
|
270 |
+
if(!$this->hostExists($url)) {
|
271 |
+
throw new ErrorException("Could not connect to $url.", 404);
|
272 |
+
}
|
273 |
+
|
274 |
+
$params = http_build_query($params, '', '&');
|
275 |
+
switch($method) {
|
276 |
+
case 'GET':
|
277 |
+
$opts = array(
|
278 |
+
'http' => array(
|
279 |
+
'method' => 'GET',
|
280 |
+
'header' => 'Accept: application/xrds+xml, */*',
|
281 |
+
'ignore_errors' => true,
|
282 |
+
), 'ssl' => array(
|
283 |
+
'CN_match' => parse_url($url, PHP_URL_HOST),
|
284 |
+
),
|
285 |
+
);
|
286 |
+
$url = $url . ($params ? '?' . $params : '');
|
287 |
+
break;
|
288 |
+
case 'POST':
|
289 |
+
$opts = array(
|
290 |
+
'http' => array(
|
291 |
+
'method' => 'POST',
|
292 |
+
'header' => 'Content-type: application/x-www-form-urlencoded',
|
293 |
+
'content' => $params,
|
294 |
+
'ignore_errors' => true,
|
295 |
+
), 'ssl' => array(
|
296 |
+
'CN_match' => parse_url($url, PHP_URL_HOST),
|
297 |
+
),
|
298 |
+
);
|
299 |
+
break;
|
300 |
+
case 'HEAD':
|
301 |
+
# We want to send a HEAD request,
|
302 |
+
# but since get_headers doesn't accept $context parameter,
|
303 |
+
# we have to change the defaults.
|
304 |
+
$default = stream_context_get_options(stream_context_get_default());
|
305 |
+
stream_context_get_default(
|
306 |
+
array(
|
307 |
+
'http' => array(
|
308 |
+
'method' => 'HEAD',
|
309 |
+
'header' => 'Accept: application/xrds+xml, */*',
|
310 |
+
'ignore_errors' => true,
|
311 |
+
), 'ssl' => array(
|
312 |
+
'CN_match' => parse_url($url, PHP_URL_HOST),
|
313 |
+
),
|
314 |
+
)
|
315 |
+
);
|
316 |
+
|
317 |
+
$url = $url . ($params ? '?' . $params : '');
|
318 |
+
$headers = get_headers ($url);
|
319 |
+
if(!$headers) {
|
320 |
+
return array();
|
321 |
+
}
|
322 |
+
|
323 |
+
if(intval(substr($headers[0], strlen('HTTP/1.1 '))) == 405) {
|
324 |
+
# The server doesn't support HEAD, so let's emulate it with
|
325 |
+
# a GET.
|
326 |
+
$args = func_get_args();
|
327 |
+
$args[1] = 'GET';
|
328 |
+
call_user_func_array(array($this, 'request_streams'), $args);
|
329 |
+
return $this->headers;
|
330 |
+
}
|
331 |
+
|
332 |
+
$headers = $this->parse_header_array($headers, $update_claimed_id);
|
333 |
+
|
334 |
+
# And restore them.
|
335 |
+
stream_context_get_default($default);
|
336 |
+
return $headers;
|
337 |
+
}
|
338 |
+
|
339 |
+
if($this->verify_peer) {
|
340 |
+
$opts['ssl'] += array(
|
341 |
+
'verify_peer' => true,
|
342 |
+
'capath' => $this->capath,
|
343 |
+
'cafile' => $this->cainfo,
|
344 |
+
);
|
345 |
+
}
|
346 |
+
|
347 |
+
$context = stream_context_create ($opts);
|
348 |
+
$data = file_get_contents($url, false, $context);
|
349 |
+
# This is a hack for providers who don't support HEAD requests.
|
350 |
+
# It just creates the headers array for the last request in $this->headers.
|
351 |
+
if(isset($http_response_header)) {
|
352 |
+
$this->headers = $this->parse_header_array($http_response_header, $update_claimed_id);
|
353 |
+
}
|
354 |
+
|
355 |
+
return $data;
|
356 |
+
}
|
357 |
+
|
358 |
+
protected function request($url, $method='GET', $params=array(), $update_claimed_id=false)
|
359 |
+
{
|
360 |
+
if (function_exists('curl_init')
|
361 |
+
&& (!in_array('https', stream_get_wrappers()) || !ini_get('safe_mode') && !ini_get('open_basedir'))
|
362 |
+
) {
|
363 |
+
return $this->request_curl($url, $method, $params, $update_claimed_id);
|
364 |
+
}
|
365 |
+
return $this->request_streams($url, $method, $params, $update_claimed_id);
|
366 |
+
}
|
367 |
+
|
368 |
+
protected function build_url($url, $parts)
|
369 |
+
{
|
370 |
+
if (isset($url['query'], $parts['query'])) {
|
371 |
+
$parts['query'] = $url['query'] . '&' . $parts['query'];
|
372 |
+
}
|
373 |
+
|
374 |
+
$url = $parts + $url;
|
375 |
+
$url = $url['scheme'] . '://'
|
376 |
+
. (empty($url['username'])?''
|
377 |
+
:(empty($url['password'])? "{$url['username']}@"
|
378 |
+
:"{$url['username']}:{$url['password']}@"))
|
379 |
+
. $url['host']
|
380 |
+
. (empty($url['port'])?'':":{$url['port']}")
|
381 |
+
. (empty($url['path'])?'':$url['path'])
|
382 |
+
. (empty($url['query'])?'':"?{$url['query']}")
|
383 |
+
. (empty($url['fragment'])?'':"#{$url['fragment']}");
|
384 |
+
return $url;
|
385 |
+
}
|
386 |
+
|
387 |
+
/**
|
388 |
+
* Helper function used to scan for <meta>/<link> tags and extract information
|
389 |
+
* from them
|
390 |
+
*/
|
391 |
+
protected function htmlTag($content, $tag, $attrName, $attrValue, $valueName)
|
392 |
+
{
|
393 |
+
preg_match_all("#<{$tag}[^>]*$attrName=['\"].*?$attrValue.*?['\"][^>]*$valueName=['\"](.+?)['\"][^>]*/?>#i", $content, $matches1);
|
394 |
+
preg_match_all("#<{$tag}[^>]*$valueName=['\"](.+?)['\"][^>]*$attrName=['\"].*?$attrValue.*?['\"][^>]*/?>#i", $content, $matches2);
|
395 |
+
|
396 |
+
$result = array_merge($matches1[1], $matches2[1]);
|
397 |
+
return empty($result)?false:$result[0];
|
398 |
+
}
|
399 |
+
|
400 |
+
/**
|
401 |
+
* Performs Yadis and HTML discovery. Normally not used.
|
402 |
+
* @param $url Identity URL.
|
403 |
+
* @return String OP Endpoint (i.e. OpenID provider address).
|
404 |
+
* @throws ErrorException
|
405 |
+
*/
|
406 |
+
function discover($url)
|
407 |
+
{
|
408 |
+
if (!$url) throw new ErrorException('No identity supplied.');
|
409 |
+
# Use xri.net proxy to resolve i-name identities
|
410 |
+
if (!preg_match('#^https?:#', $url)) {
|
411 |
+
$url = "https://xri.net/$url";
|
412 |
+
}
|
413 |
+
|
414 |
+
# We save the original url in case of Yadis discovery failure.
|
415 |
+
# It can happen when we'll be lead to an XRDS document
|
416 |
+
# which does not have any OpenID2 services.
|
417 |
+
$originalUrl = $url;
|
418 |
+
|
419 |
+
# A flag to disable yadis discovery in case of failure in headers.
|
420 |
+
$yadis = true;
|
421 |
+
|
422 |
+
# We'll jump a maximum of 5 times, to avoid endless redirections.
|
423 |
+
for ($i = 0; $i < 5; $i ++) {
|
424 |
+
if ($yadis) {
|
425 |
+
$headers = $this->request($url, 'HEAD', array(), true);
|
426 |
+
|
427 |
+
$next = false;
|
428 |
+
if (isset($headers['x-xrds-location'])) {
|
429 |
+
$url = $this->build_url(parse_url($url), parse_url(trim($headers['x-xrds-location'])));
|
430 |
+
$next = true;
|
431 |
+
}
|
432 |
+
|
433 |
+
if (isset($headers['content-type'])
|
434 |
+
&& (strpos($headers['content-type'], 'application/xrds+xml') !== false
|
435 |
+
|| strpos($headers['content-type'], 'text/xml') !== false)
|
436 |
+
) {
|
437 |
+
# Apparently, some providers return XRDS documents as text/html.
|
438 |
+
# While it is against the spec, allowing this here shouldn't break
|
439 |
+
# compatibility with anything.
|
440 |
+
# ---
|
441 |
+
# Found an XRDS document, now let's find the server, and optionally delegate.
|
442 |
+
$content = $this->request($url, 'GET');
|
443 |
+
|
444 |
+
preg_match_all('#<Service.*?>(.*?)</Service>#s', $content, $m);
|
445 |
+
foreach($m[1] as $content) {
|
446 |
+
$content = ' ' . $content; # The space is added, so that strpos doesn't return 0.
|
447 |
+
|
448 |
+
# OpenID 2
|
449 |
+
$ns = preg_quote('http://specs.openid.net/auth/2.0/', '#');
|
450 |
+
if(preg_match('#<Type>\s*'.$ns.'(server|signon)\s*</Type>#s', $content, $type)) {
|
451 |
+
if ($type[1] == 'server') $this->identifier_select = true;
|
452 |
+
|
453 |
+
preg_match('#<URI.*?>(.*)</URI>#', $content, $server);
|
454 |
+
preg_match('#<(Local|Canonical)ID>(.*)</\1ID>#', $content, $delegate);
|
455 |
+
if (empty($server)) {
|
456 |
+
return false;
|
457 |
+
}
|
458 |
+
# Does the server advertise support for either AX or SREG?
|
459 |
+
$this->ax = (bool) strpos($content, '<Type>http://openid.net/srv/ax/1.0</Type>');
|
460 |
+
$this->sreg = strpos($content, '<Type>http://openid.net/sreg/1.0</Type>')
|
461 |
+
|| strpos($content, '<Type>http://openid.net/extensions/sreg/1.1</Type>');
|
462 |
+
|
463 |
+
$server = $server[1];
|
464 |
+
if (isset($delegate[2])) $this->identity = trim($delegate[2]);
|
465 |
+
$this->version = 2;
|
466 |
+
|
467 |
+
$this->server = $server;
|
468 |
+
return $server;
|
469 |
+
}
|
470 |
+
|
471 |
+
# OpenID 1.1
|
472 |
+
$ns = preg_quote('http://openid.net/signon/1.1', '#');
|
473 |
+
if (preg_match('#<Type>\s*'.$ns.'\s*</Type>#s', $content)) {
|
474 |
+
|
475 |
+
preg_match('#<URI.*?>(.*)</URI>#', $content, $server);
|
476 |
+
preg_match('#<.*?Delegate>(.*)</.*?Delegate>#', $content, $delegate);
|
477 |
+
if (empty($server)) {
|
478 |
+
return false;
|
479 |
+
}
|
480 |
+
# AX can be used only with OpenID 2.0, so checking only SREG
|
481 |
+
$this->sreg = strpos($content, '<Type>http://openid.net/sreg/1.0</Type>')
|
482 |
+
|| strpos($content, '<Type>http://openid.net/extensions/sreg/1.1</Type>');
|
483 |
+
|
484 |
+
$server = $server[1];
|
485 |
+
if (isset($delegate[1])) $this->identity = $delegate[1];
|
486 |
+
$this->version = 1;
|
487 |
+
|
488 |
+
$this->server = $server;
|
489 |
+
return $server;
|
490 |
+
}
|
491 |
+
}
|
492 |
+
|
493 |
+
$next = true;
|
494 |
+
$yadis = false;
|
495 |
+
$url = $originalUrl;
|
496 |
+
$content = null;
|
497 |
+
break;
|
498 |
+
}
|
499 |
+
if ($next) continue;
|
500 |
+
|
501 |
+
# There are no relevant information in headers, so we search the body.
|
502 |
+
$content = $this->request($url, 'GET', array(), true);
|
503 |
+
|
504 |
+
if (isset($this->headers['x-xrds-location'])) {
|
505 |
+
$url = $this->build_url(parse_url($url), parse_url(trim($this->headers['x-xrds-location'])));
|
506 |
+
continue;
|
507 |
+
}
|
508 |
+
|
509 |
+
$location = $this->htmlTag($content, 'meta', 'http-equiv', 'X-XRDS-Location', 'content');
|
510 |
+
if ($location) {
|
511 |
+
$url = $this->build_url(parse_url($url), parse_url($location));
|
512 |
+
continue;
|
513 |
+
}
|
514 |
+
}
|
515 |
+
|
516 |
+
if (!$content) $content = $this->request($url, 'GET');
|
517 |
+
|
518 |
+
# At this point, the YADIS Discovery has failed, so we'll switch
|
519 |
+
# to openid2 HTML discovery, then fallback to openid 1.1 discovery.
|
520 |
+
$server = $this->htmlTag($content, 'link', 'rel', 'openid2.provider', 'href');
|
521 |
+
$delegate = $this->htmlTag($content, 'link', 'rel', 'openid2.local_id', 'href');
|
522 |
+
$this->version = 2;
|
523 |
+
|
524 |
+
if (!$server) {
|
525 |
+
# The same with openid 1.1
|
526 |
+
$server = $this->htmlTag($content, 'link', 'rel', 'openid.server', 'href');
|
527 |
+
$delegate = $this->htmlTag($content, 'link', 'rel', 'openid.delegate', 'href');
|
528 |
+
$this->version = 1;
|
529 |
+
}
|
530 |
+
|
531 |
+
if ($server) {
|
532 |
+
# We found an OpenID2 OP Endpoint
|
533 |
+
if ($delegate) {
|
534 |
+
# We have also found an OP-Local ID.
|
535 |
+
$this->identity = $delegate;
|
536 |
+
}
|
537 |
+
$this->server = $server;
|
538 |
+
return $server;
|
539 |
+
}
|
540 |
+
|
541 |
+
throw new ErrorException("No OpenID Server found at $url", 404);
|
542 |
+
}
|
543 |
+
throw new ErrorException('Endless redirection!', 500);
|
544 |
+
}
|
545 |
+
|
546 |
+
protected function sregParams()
|
547 |
+
{
|
548 |
+
$params = array();
|
549 |
+
# We always use SREG 1.1, even if the server is advertising only support for 1.0.
|
550 |
+
# That's because it's fully backwards compatibile with 1.0, and some providers
|
551 |
+
# advertise 1.0 even if they accept only 1.1. One such provider is myopenid.com
|
552 |
+
$params['openid.ns.sreg'] = 'http://openid.net/extensions/sreg/1.1';
|
553 |
+
if ($this->required) {
|
554 |
+
$params['openid.sreg.required'] = array();
|
555 |
+
foreach ($this->required as $required) {
|
556 |
+
if (!isset(self::$ax_to_sreg[$required])) continue;
|
557 |
+
$params['openid.sreg.required'][] = self::$ax_to_sreg[$required];
|
558 |
+
}
|
559 |
+
$params['openid.sreg.required'] = implode(',', $params['openid.sreg.required']);
|
560 |
+
}
|
561 |
+
|
562 |
+
if ($this->optional) {
|
563 |
+
$params['openid.sreg.optional'] = array();
|
564 |
+
foreach ($this->optional as $optional) {
|
565 |
+
if (!isset(self::$ax_to_sreg[$optional])) continue;
|
566 |
+
$params['openid.sreg.optional'][] = self::$ax_to_sreg[$optional];
|
567 |
+
}
|
568 |
+
$params['openid.sreg.optional'] = implode(',', $params['openid.sreg.optional']);
|
569 |
+
}
|
570 |
+
return $params;
|
571 |
+
}
|
572 |
+
|
573 |
+
protected function axParams()
|
574 |
+
{
|
575 |
+
$params = array();
|
576 |
+
if ($this->required || $this->optional) {
|
577 |
+
$params['openid.ns.ax'] = 'http://openid.net/srv/ax/1.0';
|
578 |
+
$params['openid.ax.mode'] = 'fetch_request';
|
579 |
+
$this->aliases = array();
|
580 |
+
$counts = array();
|
581 |
+
$required = array();
|
582 |
+
$optional = array();
|
583 |
+
foreach (array('required','optional') as $type) {
|
584 |
+
foreach ($this->$type as $alias => $field) {
|
585 |
+
if (is_int($alias)) $alias = strtr($field, '/', '_');
|
586 |
+
$this->aliases[$alias] = 'http://axschema.org/' . $field;
|
587 |
+
if (empty($counts[$alias])) $counts[$alias] = 0;
|
588 |
+
$counts[$alias] += 1;
|
589 |
+
${$type}[] = $alias;
|
590 |
+
}
|
591 |
+
}
|
592 |
+
foreach ($this->aliases as $alias => $ns) {
|
593 |
+
$params['openid.ax.type.' . $alias] = $ns;
|
594 |
+
}
|
595 |
+
foreach ($counts as $alias => $count) {
|
596 |
+
if ($count == 1) continue;
|
597 |
+
$params['openid.ax.count.' . $alias] = $count;
|
598 |
+
}
|
599 |
+
|
600 |
+
# Don't send empty ax.requied and ax.if_available.
|
601 |
+
# Google and possibly other providers refuse to support ax when one of these is empty.
|
602 |
+
if($required) {
|
603 |
+
$params['openid.ax.required'] = implode(',', $required);
|
604 |
+
}
|
605 |
+
if($optional) {
|
606 |
+
$params['openid.ax.if_available'] = implode(',', $optional);
|
607 |
+
}
|
608 |
+
}
|
609 |
+
return $params;
|
610 |
+
}
|
611 |
+
|
612 |
+
protected function authUrl_v1($immediate)
|
613 |
+
{
|
614 |
+
$returnUrl = $this->returnUrl;
|
615 |
+
# If we have an openid.delegate that is different from our claimed id,
|
616 |
+
# we need to somehow preserve the claimed id between requests.
|
617 |
+
# The simplest way is to just send it along with the return_to url.
|
618 |
+
if($this->identity != $this->claimed_id) {
|
619 |
+
$returnUrl .= (strpos($returnUrl, '?') ? '&' : '?') . 'openid.claimed_id=' . $this->claimed_id;
|
620 |
+
}
|
621 |
+
|
622 |
+
$params = array(
|
623 |
+
'openid.return_to' => $returnUrl,
|
624 |
+
'openid.mode' => $immediate ? 'checkid_immediate' : 'checkid_setup',
|
625 |
+
'openid.identity' => $this->identity,
|
626 |
+
'openid.trust_root' => $this->trustRoot,
|
627 |
+
) + $this->sregParams();
|
628 |
+
|
629 |
+
return $this->build_url(parse_url($this->server)
|
630 |
+
, array('query' => http_build_query($params, '', '&')));
|
631 |
+
}
|
632 |
+
|
633 |
+
protected function authUrl_v2($immediate)
|
634 |
+
{
|
635 |
+
$params = array(
|
636 |
+
'openid.ns' => 'http://specs.openid.net/auth/2.0',
|
637 |
+
'openid.mode' => $immediate ? 'checkid_immediate' : 'checkid_setup',
|
638 |
+
'openid.return_to' => $this->returnUrl,
|
639 |
+
'openid.realm' => $this->trustRoot,
|
640 |
+
);
|
641 |
+
if ($this->ax) {
|
642 |
+
$params += $this->axParams();
|
643 |
+
}
|
644 |
+
if ($this->sreg) {
|
645 |
+
$params += $this->sregParams();
|
646 |
+
}
|
647 |
+
if (!$this->ax && !$this->sreg) {
|
648 |
+
# If OP doesn't advertise either SREG, nor AX, let's send them both
|
649 |
+
# in worst case we don't get anything in return.
|
650 |
+
$params += $this->axParams() + $this->sregParams();
|
651 |
+
}
|
652 |
+
|
653 |
+
if ($this->identifier_select) {
|
654 |
+
$params['openid.identity'] = $params['openid.claimed_id']
|
655 |
+
= 'http://specs.openid.net/auth/2.0/identifier_select';
|
656 |
+
} else {
|
657 |
+
$params['openid.identity'] = $this->identity;
|
658 |
+
$params['openid.claimed_id'] = $this->claimed_id;
|
659 |
+
}
|
660 |
+
|
661 |
+
return $this->build_url(parse_url($this->server)
|
662 |
+
, array('query' => http_build_query($params, '', '&')));
|
663 |
+
}
|
664 |
+
|
665 |
+
/**
|
666 |
+
* Returns authentication url. Usually, you want to redirect your user to it.
|
667 |
+
* @return String The authentication url.
|
668 |
+
* @param String $select_identifier Whether to request OP to select identity for an user in OpenID 2. Does not affect OpenID 1.
|
669 |
+
* @throws ErrorException
|
670 |
+
*/
|
671 |
+
function authUrl($immediate = false)
|
672 |
+
{
|
673 |
+
if ($this->setup_url && !$immediate) return $this->setup_url;
|
674 |
+
if (!$this->server) $this->discover($this->identity);
|
675 |
+
|
676 |
+
if ($this->version == 2) {
|
677 |
+
return $this->authUrl_v2($immediate);
|
678 |
+
}
|
679 |
+
return $this->authUrl_v1($immediate);
|
680 |
+
}
|
681 |
+
|
682 |
+
/**
|
683 |
+
* Performs OpenID verification with the OP.
|
684 |
+
* @return Bool Whether the verification was successful.
|
685 |
+
* @throws ErrorException
|
686 |
+
*/
|
687 |
+
function validate()
|
688 |
+
{
|
689 |
+
# If the request was using immediate mode, a failure may be reported
|
690 |
+
# by presenting user_setup_url (for 1.1) or reporting
|
691 |
+
# mode 'setup_needed' (for 2.0). Also catching all modes other than
|
692 |
+
# id_res, in order to avoid throwing errors.
|
693 |
+
if(isset($this->data['openid_user_setup_url'])) {
|
694 |
+
$this->setup_url = $this->data['openid_user_setup_url'];
|
695 |
+
return false;
|
696 |
+
}
|
697 |
+
if($this->mode != 'id_res') {
|
698 |
+
return false;
|
699 |
+
}
|
700 |
+
|
701 |
+
$this->claimed_id = isset($this->data['openid_claimed_id'])?$this->data['openid_claimed_id']:$this->data['openid_identity'];
|
702 |
+
$params = array(
|
703 |
+
'openid.assoc_handle' => $this->data['openid_assoc_handle'],
|
704 |
+
'openid.signed' => $this->data['openid_signed'],
|
705 |
+
'openid.sig' => $this->data['openid_sig'],
|
706 |
+
);
|
707 |
+
|
708 |
+
if (isset($this->data['openid_ns'])) {
|
709 |
+
# We're dealing with an OpenID 2.0 server, so let's set an ns
|
710 |
+
# Even though we should know location of the endpoint,
|
711 |
+
# we still need to verify it by discovery, so $server is not set here
|
712 |
+
$params['openid.ns'] = 'http://specs.openid.net/auth/2.0';
|
713 |
+
} elseif (isset($this->data['openid_claimed_id'])
|
714 |
+
&& $this->data['openid_claimed_id'] != $this->data['openid_identity']
|
715 |
+
) {
|
716 |
+
# If it's an OpenID 1 provider, and we've got claimed_id,
|
717 |
+
# we have to append it to the returnUrl, like authUrl_v1 does.
|
718 |
+
$this->returnUrl .= (strpos($this->returnUrl, '?') ? '&' : '?')
|
719 |
+
. 'openid.claimed_id=' . $this->claimed_id;
|
720 |
+
}
|
721 |
+
|
722 |
+
if ($this->data['openid_return_to'] != $this->returnUrl) {
|
723 |
+
# The return_to url must match the url of current request.
|
724 |
+
# I'm assuing that noone will set the returnUrl to something that doesn't make sense.
|
725 |
+
return false;
|
726 |
+
}
|
727 |
+
|
728 |
+
$server = $this->discover($this->claimed_id);
|
729 |
+
|
730 |
+
foreach (explode(',', $this->data['openid_signed']) as $item) {
|
731 |
+
# Checking whether magic_quotes_gpc is turned on, because
|
732 |
+
# the function may fail if it is. For example, when fetching
|
733 |
+
# AX namePerson, it might containg an apostrophe, which will be escaped.
|
734 |
+
# In such case, validation would fail, since we'd send different data than OP
|
735 |
+
# wants to verify. stripslashes() should solve that problem, but we can't
|
736 |
+
# use it when magic_quotes is off.
|
737 |
+
$value = $this->data['openid_' . str_replace('.','_',$item)];
|
738 |
+
$params['openid.' . $item] = function_exists('get_magic_quotes_gpc') && get_magic_quotes_gpc() ? stripslashes($value) : $value;
|
739 |
+
|
740 |
+
}
|
741 |
+
|
742 |
+
$params['openid.mode'] = 'check_authentication';
|
743 |
+
|
744 |
+
$response = $this->request($server, 'POST', $params);
|
745 |
+
|
746 |
+
return preg_match('/is_valid\s*:\s*true/i', $response);
|
747 |
+
}
|
748 |
+
|
749 |
+
protected function getAxAttributes()
|
750 |
+
{
|
751 |
+
$alias = null;
|
752 |
+
if (isset($this->data['openid_ns_ax'])
|
753 |
+
&& $this->data['openid_ns_ax'] != 'http://openid.net/srv/ax/1.0'
|
754 |
+
) { # It's the most likely case, so we'll check it before
|
755 |
+
$alias = 'ax';
|
756 |
+
} else {
|
757 |
+
# 'ax' prefix is either undefined, or points to another extension,
|
758 |
+
# so we search for another prefix
|
759 |
+
foreach ($this->data as $key => $val) {
|
760 |
+
if (substr($key, 0, strlen('openid_ns_')) == 'openid_ns_'
|
761 |
+
&& $val == 'http://openid.net/srv/ax/1.0'
|
762 |
+
) {
|
763 |
+
$alias = substr($key, strlen('openid_ns_'));
|
764 |
+
break;
|
765 |
+
}
|
766 |
+
}
|
767 |
+
}
|
768 |
+
if (!$alias) {
|
769 |
+
# An alias for AX schema has not been found,
|
770 |
+
# so there is no AX data in the OP's response
|
771 |
+
return array();
|
772 |
+
}
|
773 |
+
|
774 |
+
$attributes = array();
|
775 |
+
foreach (explode(',', $this->data['openid_signed']) as $key) {
|
776 |
+
$keyMatch = $alias . '.value.';
|
777 |
+
if (substr($key, 0, strlen($keyMatch)) != $keyMatch) {
|
778 |
+
continue;
|
779 |
+
}
|
780 |
+
$key = substr($key, strlen($keyMatch));
|
781 |
+
if (!isset($this->data['openid_' . $alias . '_type_' . $key])) {
|
782 |
+
# OP is breaking the spec by returning a field without
|
783 |
+
# associated ns. This shouldn't happen, but it's better
|
784 |
+
# to check, than cause an E_NOTICE.
|
785 |
+
continue;
|
786 |
+
}
|
787 |
+
$value = $this->data['openid_' . $alias . '_value_' . $key];
|
788 |
+
$key = substr($this->data['openid_' . $alias . '_type_' . $key],
|
789 |
+
strlen('http://axschema.org/'));
|
790 |
+
|
791 |
+
$attributes[$key] = $value;
|
792 |
+
}
|
793 |
+
return $attributes;
|
794 |
+
}
|
795 |
+
|
796 |
+
protected function getSregAttributes()
|
797 |
+
{
|
798 |
+
$attributes = array();
|
799 |
+
$sreg_to_ax = array_flip(self::$ax_to_sreg);
|
800 |
+
foreach (explode(',', $this->data['openid_signed']) as $key) {
|
801 |
+
$keyMatch = 'sreg.';
|
802 |
+
if (substr($key, 0, strlen($keyMatch)) != $keyMatch) {
|
803 |
+
continue;
|
804 |
+
}
|
805 |
+
$key = substr($key, strlen($keyMatch));
|
806 |
+
if (!isset($sreg_to_ax[$key])) {
|
807 |
+
# The field name isn't part of the SREG spec, so we ignore it.
|
808 |
+
continue;
|
809 |
+
}
|
810 |
+
$attributes[$sreg_to_ax[$key]] = $this->data['openid_sreg_' . $key];
|
811 |
+
}
|
812 |
+
return $attributes;
|
813 |
+
}
|
814 |
+
|
815 |
+
/**
|
816 |
+
* Gets AX/SREG attributes provided by OP. should be used only after successful validaton.
|
817 |
+
* Note that it does not guarantee that any of the required/optional parameters will be present,
|
818 |
+
* or that there will be no other attributes besides those specified.
|
819 |
+
* In other words. OP may provide whatever information it wants to.
|
820 |
+
* * SREG names will be mapped to AX names.
|
821 |
+
* * @return Array Array of attributes with keys being the AX schema names, e.g. 'contact/email'
|
822 |
+
* @see http://www.axschema.org/types/
|
823 |
+
*/
|
824 |
+
function getAttributes()
|
825 |
+
{
|
826 |
+
if (isset($this->data['openid_ns'])
|
827 |
+
&& $this->data['openid_ns'] == 'http://specs.openid.net/auth/2.0'
|
828 |
+
) { # OpenID 2.0
|
829 |
+
# We search for both AX and SREG attributes, with AX taking precedence.
|
830 |
+
return $this->getAxAttributes() + $this->getSregAttributes();
|
831 |
+
}
|
832 |
+
return $this->getSregAttributes();
|
833 |
+
}
|
834 |
+
}
|
hybridauth/Hybrid/thirdparty/index.html
ADDED
@@ -0,0 +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>
|
hybridauth/index.php
ADDED
@@ -0,0 +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 |
+
// HybridAuth End Point
|
10 |
+
// ------------------------------------------------------------------------
|
11 |
+
|
12 |
+
require_once( "Hybrid/Auth.php" );
|
13 |
+
require_once( "Hybrid/Endpoint.php" );
|
14 |
+
|
15 |
+
Hybrid_Endpoint::process();
|
hybridauth/readme.txt
ADDED
@@ -0,0 +1,12 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
basically, we drop here the latest version of hybridauth library and that is it
|
2 |
+
|
3 |
+
HybridAuth
|
4 |
+
http://hybridauth.sourceforge.net
|
5 |
+
=================================
|
6 |
+
|
7 |
+
HybridAuth enables developers to easily build social applications and tools to engage websites vistors and customers on
|
8 |
+
a social level by implementing social sign-in, social sharing, users profiles, friends list, activities stream, status
|
9 |
+
updates and more.
|
10 |
+
|
11 |
+
The main goal of HybridAuth is to act as an abstract API between your application and various social apis and identities
|
12 |
+
providers such as Facebook, Twitter, MySpace and Google.
|
includes/admin/components/advanced/index.php
ADDED
@@ -0,0 +1,111 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/*!
|
3 |
+
* WordPress Social Login
|
4 |
+
*
|
5 |
+
* http://hybridauth.sourceforge.net/wsl/index.html | http://github.com/hybridauth/WordPress-Social-Login
|
6 |
+
* (c) 2011-2013 Mohamed Mrassi and contributors | http://wordpress.org/extend/plugins/wordpress-social-login/
|
7 |
+
*/
|
8 |
+
|
9 |
+
/**
|
10 |
+
* Advanced Advanced Settings
|
11 |
+
*/
|
12 |
+
|
13 |
+
// Exit if accessed directly
|
14 |
+
if ( !defined( 'ABSPATH' ) ) exit;
|
15 |
+
|
16 |
+
// --------------------------------------------------------------------
|
17 |
+
|
18 |
+
function wsl_component_advanced()
|
19 |
+
{
|
20 |
+
// HOOKABLE:
|
21 |
+
do_action( "wsl_component_advanced_start" );
|
22 |
+
|
23 |
+
if( ! get_option( 'wsl_settings_base_url' ) ){
|
24 |
+
update_option( 'wsl_settings_base_url', WORDPRESS_SOCIAL_LOGIN_PLUGIN_URL );
|
25 |
+
}
|
26 |
+
|
27 |
+
if( ! get_option( 'wsl_settings_base_path' ) ){
|
28 |
+
update_option( 'wsl_settings_base_path', WORDPRESS_SOCIAL_LOGIN_ABS_PATH );
|
29 |
+
}
|
30 |
+
|
31 |
+
if( ! get_option( 'wsl_settings_hybridauth_endpoint_url' ) ){
|
32 |
+
update_option( 'wsl_settings_hybridauth_endpoint_url', WORDPRESS_SOCIAL_LOGIN_HYBRIDAUTH_ENDPOINT_URL );
|
33 |
+
}
|
34 |
+
|
35 |
+
if( ! get_option( 'wsl_settings_top_bar_menu' ) ){
|
36 |
+
update_option( 'wsl_settings_top_bar_menu', 1 );
|
37 |
+
}
|
38 |
+
?>
|
39 |
+
<form method="post" id="wsl_setup_form" action="options.php">
|
40 |
+
<?php settings_fields( 'wsl-settings-group-advanced-settings' ); ?>
|
41 |
+
|
42 |
+
<div class="metabox-holder columns-2" id="post-body">
|
43 |
+
<div id="post-body-content">
|
44 |
+
|
45 |
+
<div id="namediv" class="stuffbox">
|
46 |
+
<h3>
|
47 |
+
<label for="name"><?php _wsl_e("Advanced Settings", 'wordpress-social-login') ?></label>
|
48 |
+
</h3>
|
49 |
+
|
50 |
+
<br />
|
51 |
+
<h2 style="text-align:center;font-size: 17px;">
|
52 |
+
<?php _wsl_e("<b>Please</b> for the love of <b>God</b>, stay out of Advanced.. unless you are Advanced and you know what you are doing", 'wordpress-social-login') ?>.
|
53 |
+
</h2>
|
54 |
+
<br />
|
55 |
+
|
56 |
+
<div class="inside">
|
57 |
+
<table width="100%" border="0" cellpadding="5" cellspacing="2" style="border-top:1px solid #ccc;">
|
58 |
+
<tbody>
|
59 |
+
|
60 |
+
<tr>
|
61 |
+
<td width="200" align="right"><strong><?php _wsl_e("WSL Base URL", 'wordpress-social-login') ?> :</strong></td>
|
62 |
+
<td>
|
63 |
+
<input type="text" name="wsl_settings_base_url" value="<?php echo get_option( 'wsl_settings_base_url' ); ?>" class="inputgnrc">
|
64 |
+
</td>
|
65 |
+
</tr>
|
66 |
+
|
67 |
+
<tr>
|
68 |
+
<td width="200" align="right"><strong><?php _wsl_e("WSL Base PATH", 'wordpress-social-login') ?> :</strong></td>
|
69 |
+
<td>
|
70 |
+
<input type="text" name="wsl_settings_base_path" value="<?php echo get_option( 'wsl_settings_base_path' ); ?>" class="inputgnrc">
|
71 |
+
</td>
|
72 |
+
</tr>
|
73 |
+
|
74 |
+
<tr>
|
75 |
+
<td width="200" align="right"><strong><?php _wsl_e("Hybridauth endpoint URL", 'wordpress-social-login') ?> :</strong></td>
|
76 |
+
<td>
|
77 |
+
<input type="text" name="wsl_settings_hybridauth_endpoint_url" value="<?php echo get_option( 'wsl_settings_hybridauth_endpoint_url' ); ?>" class="inputgnrc">
|
78 |
+
</td>
|
79 |
+
</tr>
|
80 |
+
|
81 |
+
<tr>
|
82 |
+
<td width="200" align="right"><strong><?php _wsl_e("WSL top bar menu", 'wordpress-social-login') ?> :</strong></td>
|
83 |
+
<td>
|
84 |
+
<select name="wsl_settings_top_bar_menu">
|
85 |
+
<option <?php if( get_option( 'wsl_settings_top_bar_menu' ) == 1 ) echo "selected"; ?> value="1"><?php _wsl_e("Yes", 'wordpress-social-login') ?></option>
|
86 |
+
<option <?php if( get_option( 'wsl_settings_top_bar_menu' ) == 2 ) echo "selected"; ?> value="2"><?php _wsl_e("No", 'wordpress-social-login') ?></option>
|
87 |
+
</select>
|
88 |
+
</td>
|
89 |
+
</tr>
|
90 |
+
|
91 |
+
</tbody>
|
92 |
+
</table>
|
93 |
+
</div>
|
94 |
+
</div>
|
95 |
+
|
96 |
+
<br style="clear:both;" />
|
97 |
+
<div style="margin-left:5px;margin-top:-20px;">
|
98 |
+
<input type="submit" class="button-primary" value="<?php _wsl_e("Save Settings", 'wordpress-social-login') ?>" />
|
99 |
+
</div>
|
100 |
+
|
101 |
+
</div>
|
102 |
+
</div>
|
103 |
+
</form>
|
104 |
+
<?php
|
105 |
+
// HOOKABLE:
|
106 |
+
do_action( "wsl_component_advanced_end" );
|
107 |
+
}
|
108 |
+
|
109 |
+
wsl_component_advanced();
|
110 |
+
|
111 |
+
// --------------------------------------------------------------------
|
includes/admin/components/bouncer/index.php
ADDED
@@ -0,0 +1,56 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/*!
|
3 |
+
* WordPress Social Login
|
4 |
+
*
|
5 |
+
* http://hybridauth.sourceforge.net/wsl/index.html | http://github.com/hybridauth/WordPress-Social-Login
|
6 |
+
* (c) 2011-2013 Mohamed Mrassi and contributors | http://wordpress.org/extend/plugins/wordpress-social-login/
|
7 |
+
*/
|
8 |
+
|
9 |
+
/**
|
10 |
+
* The Bouncer our friend whos trying to be funneh
|
11 |
+
*/
|
12 |
+
|
13 |
+
// Exit if accessed directly
|
14 |
+
if ( !defined( 'ABSPATH' ) ) exit;
|
15 |
+
|
16 |
+
// --------------------------------------------------------------------
|
17 |
+
|
18 |
+
function wsl_component_bouncer()
|
19 |
+
{
|
20 |
+
// HOOKABLE:
|
21 |
+
do_action( "wsl_component_bouncer_start" );
|
22 |
+
|
23 |
+
include "wsl.components.bouncer.setup.php";
|
24 |
+
include "wsl.components.bouncer.sidebar.php";
|
25 |
+
|
26 |
+
wsl_admin_welcome_panel();
|
27 |
+
?>
|
28 |
+
<form method="post" id="wsl_setup_form" action="options.php">
|
29 |
+
<?php settings_fields( 'wsl-settings-group-bouncer' ); ?>
|
30 |
+
|
31 |
+
<div class="metabox-holder columns-2" id="post-body">
|
32 |
+
<table width="100%">
|
33 |
+
<tr valign="top">
|
34 |
+
<td>
|
35 |
+
<?php
|
36 |
+
wsl_component_bouncer_setup();
|
37 |
+
?>
|
38 |
+
</td>
|
39 |
+
<td width="10"></td>
|
40 |
+
<td width="400">
|
41 |
+
<?php
|
42 |
+
wsl_component_bouncer_sidebar();
|
43 |
+
?>
|
44 |
+
</td>
|
45 |
+
</tr>
|
46 |
+
</table>
|
47 |
+
</div>
|
48 |
+
</form>
|
49 |
+
<?php
|
50 |
+
// HOOKABLE:
|
51 |
+
do_action( "wsl_component_bouncer_end" );
|
52 |
+
}
|
53 |
+
|
54 |
+
wsl_component_bouncer();
|
55 |
+
|
56 |
+
// --------------------------------------------------------------------
|
includes/admin/components/bouncer/wsl.components.bouncer.setup.php
ADDED
@@ -0,0 +1,283 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/*!
|
3 |
+
* WordPress Social Login
|
4 |
+
*
|
5 |
+
* http://hybridauth.sourceforge.net/wsl/index.html | http://github.com/hybridauth/WordPress-Social-Login
|
6 |
+
* (c) 2011-2013 Mohamed Mrassi and contributors | http://wordpress.org/extend/plugins/wordpress-social-login/
|
7 |
+
*/
|
8 |
+
|
9 |
+
/**
|
10 |
+
* Widget Customization
|
11 |
+
*/
|
12 |
+
|
13 |
+
// Exit if accessed directly
|
14 |
+
if ( !defined( 'ABSPATH' ) ) exit;
|
15 |
+
|
16 |
+
// --------------------------------------------------------------------
|
17 |
+
|
18 |
+
function wsl_component_bouncer_setup()
|
19 |
+
{
|
20 |
+
// HOOKABLE:
|
21 |
+
do_action( "wsl_component_bouncer_setup_start" );
|
22 |
+
?>
|
23 |
+
<div id="post-body-content">
|
24 |
+
|
25 |
+
<div id="namediv" class="stuffbox">
|
26 |
+
<h3>
|
27 |
+
<label for="name"><?php _wsl_e("WSL Widget", 'wordpress-social-login') ?></label>
|
28 |
+
</h3>
|
29 |
+
<div class="inside">
|
30 |
+
<p>
|
31 |
+
<?php _wsl_e("Here you can tell Bouncer if you are accepting new users registration and authentication into your website or not any more. Note that Bouncer only works for WSL and will not interfere with users authenticating through the regulars wordpress Login and Register pages with their usernames and passwords (to to achieve that kind of restrictions, you may need to use another plugin(s) in combination with WSL).", 'wordpress-social-login') ?>
|
32 |
+
</p>
|
33 |
+
<table width="100%" border="0" cellpadding="5" cellspacing="2" style="border-top:1px solid #ccc;">
|
34 |
+
<tr>
|
35 |
+
<td width="200" align="right"><strong><?php _wsl_e("Accept new registration", 'wordpress-social-login') ?> :</strong></td>
|
36 |
+
<td>
|
37 |
+
<select name="wsl_settings_bouncer_registration_enabled">
|
38 |
+
<option <?php if( get_option( 'wsl_settings_bouncer_registration_enabled' ) == 1 ) echo "selected"; ?> value="1"><?php _wsl_e("Yes", 'wordpress-social-login') ?></option>
|
39 |
+
<option <?php if( get_option( 'wsl_settings_bouncer_registration_enabled' ) == 2 ) echo "selected"; ?> value="2"><?php _wsl_e("No", 'wordpress-social-login') ?></option>
|
40 |
+
</select>
|
41 |
+
</td>
|
42 |
+
</tr>
|
43 |
+
<tr>
|
44 |
+
<td width="200" align="right"><strong><?php _wsl_e("Allow authentication", 'wordpress-social-login') ?> :</strong></td>
|
45 |
+
<td>
|
46 |
+
<select name="wsl_settings_bouncer_authentication_enabled">
|
47 |
+
<option <?php if( get_option( 'wsl_settings_bouncer_authentication_enabled' ) == 1 ) echo "selected"; ?> value="1"><?php _wsl_e("Yes", 'wordpress-social-login') ?></option>
|
48 |
+
<option <?php if( get_option( 'wsl_settings_bouncer_authentication_enabled' ) == 2 ) echo "selected"; ?> value="2"><?php _wsl_e("No", 'wordpress-social-login') ?></option>
|
49 |
+
</select>
|
50 |
+
</td>
|
51 |
+
</tr>
|
52 |
+
</table>
|
53 |
+
</div>
|
54 |
+
</div>
|
55 |
+
|
56 |
+
<div id="namediv" class="stuffbox">
|
57 |
+
<h3>
|
58 |
+
<label for="name"><?php _wsl_e("Profile Completion", 'wordpress-social-login') ?></label>
|
59 |
+
</h3>
|
60 |
+
<div class="inside hideinside">
|
61 |
+
<p>
|
62 |
+
<?php _wsl_e("Select required fields. If a social network doesn't return them, Bouncer will then ask your visitors to fill additional form to provide them when registering.", 'wordpress-social-login') ?>
|
63 |
+
</p>
|
64 |
+
<p class="description">
|
65 |
+
<?php _wsl_e("You may activate <b>Profile Completion</b> for both <b>E-mail</b> and <b>Username</b>, but keep in mind, the idea behind <b>social login</b> is to avoid forms and remove all the hassle of registration", 'wordpress-social-login') ?>.
|
66 |
+
</p>
|
67 |
+
<table width="100%" border="0" cellpadding="5" cellspacing="2" style="border-top:1px solid #ccc;">
|
68 |
+
<tr>
|
69 |
+
<td width="200" align="right"><strong><?php _wsl_e("Require E-mail", 'wordpress-social-login') ?> :</strong></td>
|
70 |
+
<td>
|
71 |
+
<select name="wsl_settings_bouncer_profile_completion_require_email">
|
72 |
+
<option <?php if( get_option( 'wsl_settings_bouncer_profile_completion_require_email' ) == 1 ) echo "selected"; ?> value="1"><?php _wsl_e("Yes", 'wordpress-social-login') ?></option>
|
73 |
+
<option <?php if( get_option( 'wsl_settings_bouncer_profile_completion_require_email' ) == 2 ) echo "selected"; ?> value="2"><?php _wsl_e("No", 'wordpress-social-login') ?></option>
|
74 |
+
</select>
|
75 |
+
</td>
|
76 |
+
</tr>
|
77 |
+
<tr>
|
78 |
+
<td width="200" align="right"><strong><?php _wsl_e("Allow Username change", 'wordpress-social-login') ?> :</strong></td>
|
79 |
+
<td>
|
80 |
+
<select name="wsl_settings_bouncer_profile_completion_change_username">
|
81 |
+
<option <?php if( get_option( 'wsl_settings_bouncer_profile_completion_change_username' ) == 1 ) echo "selected"; ?> value="1"><?php _wsl_e("Yes", 'wordpress-social-login') ?></option>
|
82 |
+
<option <?php if( get_option( 'wsl_settings_bouncer_profile_completion_change_username' ) == 2 ) echo "selected"; ?> value="2"><?php _wsl_e("No", 'wordpress-social-login') ?></option>
|
83 |
+
</select>
|
84 |
+
</td>
|
85 |
+
</tr>
|
86 |
+
</table>
|
87 |
+
</div>
|
88 |
+
</div>
|
89 |
+
|
90 |
+
<div id="namediv" class="stuffbox">
|
91 |
+
<h3>
|
92 |
+
<label for="name"><?php _wsl_e("User Moderation", 'wordpress-social-login') ?></label>
|
93 |
+
</h3>
|
94 |
+
<div class="inside hideinside">
|
95 |
+
<p>
|
96 |
+
<?php _wsl_e("<b>User Moderation</b> will define how <b>Bouncer</b> should behave with new regsitred users:", 'wordpress-social-login') ?>
|
97 |
+
</p>
|
98 |
+
<ul style="margin-left:30px">
|
99 |
+
<li><?php _wsl_e("<b>None</b>: No moderation required.", 'wordpress-social-login') ?></li>
|
100 |
+
<li><?php _wsl_e('<b>E-mail Confirmation</b>: New users will need to be confirm their e-mail address before they may log in', 'wordpress-social-login') ?>.</li>
|
101 |
+
<li><?php _wsl_e('<b>Admin Approval</b>: New users will need to be approved by an administrator before they may log in', 'wordpress-social-login') ?>.</li>
|
102 |
+
</ul>
|
103 |
+
<p class="description">
|
104 |
+
<?php _wsl_e('Both <b>Admin Approval</b> and <b>E-mail Confirmation</b> requires <a href="http://wordpress.org/extend/plugins/theme-my-login/" target="_blank">Theme My Login</a> plugin to be installed. As there is no point for <b>WordPress Social Login</b> to reinvent the wheel', 'wordpress-social-login') ?>.
|
105 |
+
</p>
|
106 |
+
<p class="description">
|
107 |
+
<?php _wsl_e('<b>User Moderation</b> was purposely made compatible with the <a href="http://wordpress.org/extend/plugins/theme-my-login/" target="_blank">Theme My Login</a> for a number reasons: That plugin is good at what he does, a hell of a lot of people are using it and many have asked for it', 'wordpress-social-login') ?>.
|
108 |
+
</p>
|
109 |
+
<table width="100%" border="0" cellpadding="5" cellspacing="2" style="border-top:1px solid #ccc;">
|
110 |
+
<tr>
|
111 |
+
<td width="200" align="right"><strong><?php _wsl_e("User Moderation", 'wordpress-social-login') ?> :</strong></td>
|
112 |
+
<td>
|
113 |
+
<select name="wsl_settings_bouncer_new_users_moderation_level">
|
114 |
+
<option <?php if( get_option( 'wsl_settings_bouncer_new_users_moderation_level' ) == 1 ) echo "selected"; ?> value="1"><?php _wsl_e("None", 'wordpress-social-login') ?></option>
|
115 |
+
<option <?php if( get_option( 'wsl_settings_bouncer_new_users_moderation_level' ) == 101 ) echo "selected"; ?> value="101"><?php _wsl_e("E-mail Confirmation — Yield to Theme My Login plugin", 'wordpress-social-login') ?></option>
|
116 |
+
<option <?php if( get_option( 'wsl_settings_bouncer_new_users_moderation_level' ) == 102 ) echo "selected"; ?> value="102"><?php _wsl_e("Admin Approval — Yield to Theme My Login plugin", 'wordpress-social-login') ?></option>
|
117 |
+
</select>
|
118 |
+
</td>
|
119 |
+
</tr>
|
120 |
+
</table>
|
121 |
+
</div>
|
122 |
+
</div>
|
123 |
+
|
124 |
+
<div id="namediv" class="stuffbox">
|
125 |
+
<h3>
|
126 |
+
<label for="name"><?php _wsl_e("Membership level", 'wordpress-social-login') ?></label>
|
127 |
+
</h3>
|
128 |
+
<div class="inside hideinside">
|
129 |
+
<p>
|
130 |
+
<?php _wsl_e('Here you can define the default role for new users authenticating through WSL. The <code>Administrator</code> and <code>Editor</code> roles are not available for safety reasons', 'wordpress-social-login') ?>.
|
131 |
+
</p>
|
132 |
+
<p>
|
133 |
+
<?php _wsl_e('For more information about wordpress users roles and capabilities refer to <a href="http://codex.wordpress.org/Roles_and_Capabilities#Capability_vs._Role_Table" target="_blank">http://codex.wordpress.org/Roles_and_Capabilities</a>', 'wordpress-social-login') ?>.
|
134 |
+
</p>
|
135 |
+
<p>
|
136 |
+
<?php _wsl_e('If <b>User Moderation</b> is set to <code>Admin Approval</code> then <b>Membership level</b> will be ignored', 'wordpress-social-login') ?>.
|
137 |
+
</p>
|
138 |
+
<table width="100%" border="0" cellpadding="5" cellspacing="2" style="border-top:1px solid #ccc;">
|
139 |
+
<tr>
|
140 |
+
<td width="200" align="right"><strong><?php _wsl_e("New User Default Role", 'wordpress-social-login') ?> :</strong></td>
|
141 |
+
<td>
|
142 |
+
<select name="wsl_settings_bouncer_new_users_membership_default_role">
|
143 |
+
<optgroup label="<?php _wsl_e("Safe", 'wordpress-social-login') ?>:">
|
144 |
+
<option value="default" <?php if( get_option( 'wsl_settings_bouncer_new_users_membership_default_role' ) == "default" ) echo "selected"; ?> ><?php _wsl_e("— Wordpress User Default Role —", 'wordpress-social-login') ?></option>
|
145 |
+
<option value="wslnorole" <?php if( get_option( 'wsl_settings_bouncer_new_users_membership_default_role' ) == "wslnorole" ) echo "selected"; ?> ><?php _wsl_e("— No role for this site —", 'wordpress-social-login') ?></option>
|
146 |
+
<option value="subscriber" <?php if( get_option( 'wsl_settings_bouncer_new_users_membership_default_role' ) == "subscriber" ) echo "selected"; ?> ><?php _wsl_e("Subscriber", 'wordpress-social-login') ?></option>
|
147 |
+
</optgroup>
|
148 |
+
|
149 |
+
<optgroup label="<?php _wsl_e("Be careful with these", 'wordpress-social-login') ?>:">
|
150 |
+
<option value="author" <?php if( get_option( 'wsl_settings_bouncer_new_users_membership_default_role' ) == "author" ) echo "selected"; ?> ><?php _wsl_e("Author", 'wordpress-social-login') ?></option>
|
151 |
+
<option value="contributor" <?php if( get_option( 'wsl_settings_bouncer_new_users_membership_default_role' ) == "contributor" ) echo "selected"; ?> ><?php _wsl_e("Contributor", 'wordpress-social-login') ?></option>
|
152 |
+
</optgroup>
|
153 |
+
</select>
|
154 |
+
</td>
|
155 |
+
</tr>
|
156 |
+
</table>
|
157 |
+
</div>
|
158 |
+
</div>
|
159 |
+
|
160 |
+
<div id="namediv" class="stuffbox">
|
161 |
+
<h3>
|
162 |
+
<label for="name"><?php _wsl_e("Filters by emails domains name", 'wordpress-social-login') ?></label>
|
163 |
+
</h3>
|
164 |
+
<div class="inside hideinside">
|
165 |
+
<p>
|
166 |
+
<?php _wsl_e("Restrict registration to a limited number of domains name.", 'wordpress-social-login') ?>
|
167 |
+
<?php _wsl_e("Insert one email address per line and try to keep this list short. On <code>Bounce text</code> insert the text you want to display for rejected users. ex: <code>gmail.com</code>, without '@'.", 'wordpress-social-login') ?>
|
168 |
+
</p>
|
169 |
+
<table width="100%" border="0" cellpadding="5" cellspacing="2" style="border-top:1px solid #ccc;">
|
170 |
+
<tr>
|
171 |
+
<td width="200" align="right"><strong><?php _wsl_e("Enabled", 'wordpress-social-login') ?> :</strong></td>
|
172 |
+
<td>
|
173 |
+
<select name="wsl_settings_bouncer_new_users_restrict_domain_enabled">
|
174 |
+
<option <?php if( get_option( 'wsl_settings_bouncer_new_users_restrict_domain_enabled' ) == 1 ) echo "selected"; ?> value="1"><?php _wsl_e("Yes", 'wordpress-social-login') ?></option>
|
175 |
+
<option <?php if( get_option( 'wsl_settings_bouncer_new_users_restrict_domain_enabled' ) == 2 ) echo "selected"; ?> value="2"><?php _wsl_e("No", 'wordpress-social-login') ?></option>
|
176 |
+
</select>
|
177 |
+
</td>
|
178 |
+
</tr>
|
179 |
+
<tr>
|
180 |
+
<td width="200" align="right" valign="top"><p><strong><?php _wsl_e("Domains list", 'wordpress-social-login') ?> :</strong></p></td>
|
181 |
+
<td>
|
182 |
+
<textarea style="width:100%;height:60px;margin-top:6px;" name="wsl_settings_bouncer_new_users_restrict_domain_list"><?php echo get_option( 'wsl_settings_bouncer_new_users_restrict_domain_list' ); ?></textarea>
|
183 |
+
</td>
|
184 |
+
</tr>
|
185 |
+
<tr>
|
186 |
+
<td width="200" align="right" valign="top"><p><strong><?php _wsl_e("Bounce text", 'wordpress-social-login') ?> :</strong></p></td>
|
187 |
+
<td>
|
188 |
+
<?php
|
189 |
+
wsl_render_wp_editor( "wsl_settings_bouncer_new_users_restrict_domain_text_bounce", get_option( 'wsl_settings_bouncer_new_users_restrict_domain_text_bounce' ) );
|
190 |
+
?>
|
191 |
+
</td>
|
192 |
+
</tr>
|
193 |
+
</table>
|
194 |
+
</div>
|
195 |
+
</div>
|
196 |
+
|
197 |
+
<div id="namediv" class="stuffbox">
|
198 |
+
<h3>
|
199 |
+
<label for="name"><?php _wsl_e("Filters by e-mails addresses", 'wordpress-social-login') ?></label>
|
200 |
+
</h3>
|
201 |
+
<div class="inside hideinside">
|
202 |
+
<p>
|
203 |
+
<?php _wsl_e("Restrict registration to a limited number of emails addresses.", 'wordpress-social-login') ?>
|
204 |
+
<?php _wsl_e("Insert one email address per line and try to keep this list short. On <code>Bounce text</code> insert the text you want to display for rejected users. ex: <code>hybridauth@gmail.com</code>", 'wordpress-social-login') ?>
|
205 |
+
</p>
|
206 |
+
<table width="100%" border="0" cellpadding="5" cellspacing="2" style="border-top:1px solid #ccc;">
|
207 |
+
<tr>
|
208 |
+
<td width="200" align="right"><strong><?php _wsl_e("Enabled", 'wordpress-social-login') ?> :</strong></td>
|
209 |
+
<td>
|
210 |
+
<select name="wsl_settings_bouncer_new_users_restrict_email_enabled">
|
211 |
+
<option <?php if( get_option( 'wsl_settings_bouncer_new_users_restrict_email_enabled' ) == 1 ) echo "selected"; ?> value="1"><?php _wsl_e("Yes", 'wordpress-social-login') ?></option>
|
212 |
+
<option <?php if( get_option( 'wsl_settings_bouncer_new_users_restrict_email_enabled' ) == 2 ) echo "selected"; ?> value="2"><?php _wsl_e("No", 'wordpress-social-login') ?></option>
|
213 |
+
</select>
|
214 |
+
</td>
|
215 |
+
</tr>
|
216 |
+
<tr>
|
217 |
+
<td width="200" align="right" valign="top"><p><strong><?php _wsl_e("E-mails list", 'wordpress-social-login') ?> :</strong></p></td>
|
218 |
+
<td>
|
219 |
+
<textarea style="width:100%;height:60px;margin-top:6px;" name="wsl_settings_bouncer_new_users_restrict_email_list"><?php echo get_option( 'wsl_settings_bouncer_new_users_restrict_email_list' ); ?></textarea>
|
220 |
+
</td>
|
221 |
+
</tr>
|
222 |
+
<tr>
|
223 |
+
<td width="200" align="right" valign="top"><p><strong><?php _wsl_e("Bounce text", 'wordpress-social-login') ?> :</strong></p></td>
|
224 |
+
<td>
|
225 |
+
<?php
|
226 |
+
wsl_render_wp_editor( "wsl_settings_bouncer_new_users_restrict_email_text_bounce", get_option( 'wsl_settings_bouncer_new_users_restrict_email_text_bounce' ) );
|
227 |
+
?>
|
228 |
+
</td>
|
229 |
+
</tr>
|
230 |
+
</table>
|
231 |
+
</div>
|
232 |
+
</div>
|
233 |
+
|
234 |
+
<div id="namediv" class="stuffbox">
|
235 |
+
<h3>
|
236 |
+
<label for="name"><?php _wsl_e("Filters by profile urls", 'wordpress-social-login') ?></label>
|
237 |
+
</h3>
|
238 |
+
<div class="inside hideinside">
|
239 |
+
<p>
|
240 |
+
<?php _wsl_e("Restrict registration to a limited number of profile urls.", 'wordpress-social-login') ?>
|
241 |
+
<?php _wsl_e("<b>Note</b>: If a social network provide the user email, then use 'Filters by e-mails addresses' instead. Providers like Facebook provide multiples profiles URLs per user and WSL won't be able to reconize them.", 'wordpress-social-login') ?>
|
242 |
+
<?php _wsl_e("Insert one email address per line and try to keep this list short. On <code>Bounce text</code> insert the text you want to display for rejected users. ex: <code>http://twitter.com/HybridAuth</code>, <code>https://plus.google.com/u/0/108839241301472312344</code>", 'wordpress-social-login') ?>
|
243 |
+
</p>
|
244 |
+
<table width="100%" border="0" cellpadding="5" cellspacing="2" style="border-top:1px solid #ccc;">
|
245 |
+
<tr>
|
246 |
+
<td width="200" align="right"><strong><?php _wsl_e("Enabled", 'wordpress-social-login') ?> :</strong></td>
|
247 |
+
<td>
|
248 |
+
<select name="wsl_settings_bouncer_new_users_restrict_profile_enabled">
|
249 |
+
<option <?php if( get_option( 'wsl_settings_bouncer_new_users_restrict_profile_enabled' ) == 1 ) echo "selected"; ?> value="1"><?php _wsl_e("Yes", 'wordpress-social-login') ?></option>
|
250 |
+
<option <?php if( get_option( 'wsl_settings_bouncer_new_users_restrict_profile_enabled' ) == 2 ) echo "selected"; ?> value="2"><?php _wsl_e("No", 'wordpress-social-login') ?></option>
|
251 |
+
</select>
|
252 |
+
</td>
|
253 |
+
</tr>
|
254 |
+
<tr>
|
255 |
+
<td width="200" align="right" valign="top"><p><strong><?php _wsl_e("Profile urls", 'wordpress-social-login') ?> :</strong></p></td>
|
256 |
+
<td>
|
257 |
+
<textarea style="width:100%;height:60px;margin-top:6px;" name="wsl_settings_bouncer_new_users_restrict_profile_list"><?php echo get_option( 'wsl_settings_bouncer_new_users_restrict_profile_list' ); ?></textarea>
|
258 |
+
</td>
|
259 |
+
</tr>
|
260 |
+
<tr>
|
261 |
+
<td width="200" align="right" valign="top"><p><strong><?php _wsl_e("Bounce text", 'wordpress-social-login') ?> :</strong></p></td>
|
262 |
+
<td>
|
263 |
+
<?php
|
264 |
+
wsl_render_wp_editor( "wsl_settings_bouncer_new_users_restrict_profile_text_bounce", get_option( 'wsl_settings_bouncer_new_users_restrict_profile_text_bounce' ) );
|
265 |
+
?>
|
266 |
+
</td>
|
267 |
+
</tr>
|
268 |
+
</table>
|
269 |
+
</div>
|
270 |
+
</div>
|
271 |
+
|
272 |
+
<br />
|
273 |
+
|
274 |
+
<div style="margin-left:5px;margin-top:-20px;">
|
275 |
+
<input type="submit" class="button-primary" value="<?php _wsl_e("Save Settings", 'wordpress-social-login') ?>" />
|
276 |
+
</div>
|
277 |
+
</div>
|
278 |
+
<?php
|
279 |
+
// HOOKABLE:
|
280 |
+
do_action( "wsl_component_bouncer_setup_end" );
|
281 |
+
}
|
282 |
+
|
283 |
+
// --------------------------------------------------------------------
|
includes/admin/components/bouncer/wsl.components.bouncer.sidebar.php
ADDED
@@ -0,0 +1,70 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/*!
|
3 |
+
* WordPress Social Login
|
4 |
+
*
|
5 |
+
* http://hybridauth.sourceforge.net/wsl/index.html | http://github.com/hybridauth/WordPress-Social-Login
|
6 |
+
* (c) 2011-2013 Mohamed Mrassi and contributors | http://wordpress.org/extend/plugins/wordpress-social-login/
|
7 |
+
*/
|
8 |
+
|
9 |
+
/**
|
10 |
+
* Widget Customization
|
11 |
+
*/
|
12 |
+
|
13 |
+
// Exit if accessed directly
|
14 |
+
if ( !defined( 'ABSPATH' ) ) exit;
|
15 |
+
|
16 |
+
// --------------------------------------------------------------------
|
17 |
+
|
18 |
+
function wsl_component_bouncer_sidebar()
|
19 |
+
{
|
20 |
+
// HOOKABLE:
|
21 |
+
do_action( "wsl_component_bouncer_sidebar_start" );
|
22 |
+
?>
|
23 |
+
<div class="postbox " id="linksubmitdiv">
|
24 |
+
<div class="inside">
|
25 |
+
<div id="submitlink" class="submitbox">
|
26 |
+
<h3 style="cursor: default;"><?php _wsl_e("What's This?", 'wordpress-social-login') ?></h3>
|
27 |
+
<div id="minor-publishing">
|
28 |
+
<div id="misc-publishing-actions">
|
29 |
+
<div style="padding:20px;padding-top:0px;">
|
30 |
+
<h4 style="cursor: default;border-bottom:1px solid #ccc;font-size: 13px;"><?php _wsl_e("Hey, meet our friend, the Bouncer", 'wordpress-social-login') ?></h4>
|
31 |
+
|
32 |
+
<p style="margin:10px;font-size: 13px;" align="justify">
|
33 |
+
<?php _wsl_e('Ever been in trouble with one of <a href="http://www.flickr.com/search/?q=bouncer+doorman&z=e" target="_blank">these guys</a>? Well, this module have more or less the same role, and he will try his best to piss your users off until they meet your requirements.', 'wordpress-social-login') ?>
|
34 |
+
</p>
|
35 |
+
|
36 |
+
<p style="margin:10px;font-size: 13px;" align="justify">
|
37 |
+
<?php _wsl_e("This feature is most suited for small businesses and folks running a closed-door blog between friends or coworkers.", 'wordpress-social-login') ?>
|
38 |
+
</p>
|
39 |
+
|
40 |
+
<h4 style="cursor: default;border-bottom:1px solid #ccc;"><?php _wsl_e("Available settings", 'wordpress-social-login') ?></h4>
|
41 |
+
|
42 |
+
<ul style="margin:30px;margin-top:0px;margin-bottom:0px;">
|
43 |
+
<li><?php _wsl_e("Enable/Disable Registration", 'wordpress-social-login') ?></li>
|
44 |
+
<li><?php _wsl_e("Enable/Disable Authentication", 'wordpress-social-login') ?></li>
|
45 |
+
<li><?php _wsl_e("Profile Completion", 'wordpress-social-login') ?></li>
|
46 |
+
<li><?php _wsl_e("Users moderation", 'wordpress-social-login') ?></li>
|
47 |
+
<li><?php _wsl_e("Users roles", 'wordpress-social-login') ?></li>
|
48 |
+
<li><?php _wsl_e("Restrictions (by emails, domains, profiles urls)", 'wordpress-social-login') ?></li>
|
49 |
+
</ul>
|
50 |
+
|
51 |
+
<h4 style="cursor: default;border-bottom:1px solid #ccc;"><?php _wsl_e("IMPORTANT!", 'wordpress-social-login') ?></h4>
|
52 |
+
|
53 |
+
<p style="margin:10px;" align="justify">
|
54 |
+
<?php _wsl_e("All the settings on this page without exception are only valid for users authenticating through <b>WordPress Social Login Widget", 'wordpress-social-login') ?></b>.
|
55 |
+
</p>
|
56 |
+
<p style="margin:10px;" align="justify">
|
57 |
+
<?php _wsl_e("Users authenticating through the regulars Wordpress Login and Register pages with their usernames and passwords WILL NOT be affected.", 'wordpress-social-login') ?>
|
58 |
+
</p>
|
59 |
+
</div>
|
60 |
+
</div>
|
61 |
+
</div>
|
62 |
+
</div>
|
63 |
+
</div>
|
64 |
+
</div>
|
65 |
+
<?php
|
66 |
+
// HOOKABLE:
|
67 |
+
do_action( "wsl_component_bouncer_sidebar_end" );
|
68 |
+
}
|
69 |
+
|
70 |
+
// --------------------------------------------------------------------
|
includes/admin/components/components/index.php
ADDED
@@ -0,0 +1,36 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/*!
|
3 |
+
* WordPress Social Login
|
4 |
+
*
|
5 |
+
* http://hybridauth.sourceforge.net/wsl/index.html | http://github.com/hybridauth/WordPress-Social-Login
|
6 |
+
* (c) 2011-2013 Mohamed Mrassi and contributors | http://wordpress.org/extend/plugins/wordpress-social-login/
|
7 |
+
*/
|
8 |
+
|
9 |
+
/**
|
10 |
+
* Components Manager
|
11 |
+
*/
|
12 |
+
|
13 |
+
// Exit if accessed directly
|
14 |
+
if ( !defined( 'ABSPATH' ) ) exit;
|
15 |
+
|
16 |
+
// --------------------------------------------------------------------
|
17 |
+
|
18 |
+
function wsl_component_help()
|
19 |
+
{
|
20 |
+
// HOOKABLE:
|
21 |
+
do_action( "wsl_component_help_start" );
|
22 |
+
|
23 |
+
include "wsl.components.help.setup.php";
|
24 |
+
include "wsl.components.help.gallery.php";
|
25 |
+
|
26 |
+
wsl_component_components_setup();
|
27 |
+
|
28 |
+
wsl_component_components_gallery();
|
29 |
+
|
30 |
+
// HOOKABLE:
|
31 |
+
do_action( "wsl_component_help_end" );
|
32 |
+
}
|
33 |
+
|
34 |
+
wsl_component_help();
|
35 |
+
|
36 |
+
// --------------------------------------------------------------------
|
includes/admin/components/components/wsl.components.help.gallery.php
ADDED
@@ -0,0 +1,83 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/*!
|
3 |
+
* WordPress Social Login
|
4 |
+
*
|
5 |
+
* http://hybridauth.sourceforge.net/wsl/index.html | http://github.com/hybridauth/WordPress-Social-Login
|
6 |
+
* (c) 2011-2013 Mohamed Mrassi and contributors | http://wordpress.org/extend/plugins/wordpress-social-login/
|
7 |
+
*/
|
8 |
+
|
9 |
+
/**
|
10 |
+
* Components Manager
|
11 |
+
*/
|
12 |
+
|
13 |
+
// Exit if accessed directly
|
14 |
+
if ( !defined( 'ABSPATH' ) ) exit;
|
15 |
+
|
16 |
+
// --------------------------------------------------------------------
|
17 |
+
|
18 |
+
function wsl_component_components_gallery()
|
19 |
+
{
|
20 |
+
// not for today
|
21 |
+
return;
|
22 |
+
|
23 |
+
// HOOKABLE:
|
24 |
+
do_action( "wsl_component_components_gallery_start" );
|
25 |
+
|
26 |
+
add_thickbox();
|
27 |
+
?>
|
28 |
+
<br />
|
29 |
+
|
30 |
+
<h2><?php _wsl_e( "Other Components available", 'wordpress-social-login' ) ?></h2>
|
31 |
+
|
32 |
+
<style>
|
33 |
+
.wsl_addon_div{
|
34 |
+
width: 350px;
|
35 |
+
height: 125px;
|
36 |
+
padding: 10px;
|
37 |
+
border: 1px solid #ddd;
|
38 |
+
background-color: #fff;
|
39 |
+
float:left;
|
40 |
+
margin-bottom: 20px;
|
41 |
+
margin-right: 20px;
|
42 |
+
|
43 |
+
position: relative;
|
44 |
+
}
|
45 |
+
.wsl_addon_div .button-secondary {
|
46 |
+
bottom: 8px;
|
47 |
+
left: 8px;
|
48 |
+
position: absolute;
|
49 |
+
}
|
50 |
+
.wsl_addon_div .button-primary {
|
51 |
+
bottom: 8px;
|
52 |
+
right: 8px;
|
53 |
+
position: absolute;
|
54 |
+
}
|
55 |
+
</style>
|
56 |
+
|
57 |
+
<div class="wsl_addon_div">
|
58 |
+
<h3 style="margin:0px;"><?php _wsl_e( "WordPress Social Login for BuddyPress", 'wordpress-social-login' ) ?></h3>
|
59 |
+
<hr />
|
60 |
+
<p><?php _wsl_e( "Make WordPress Social Login compatible with BuddyPress", 'wordpress-social-login' ) ?>.</p>
|
61 |
+
<p><?php _wsl_e( "Widget integration, xProfiles mapping and more", 'wordpress-social-login' ) ?>.</p>
|
62 |
+
<div>
|
63 |
+
<a class="button button-primary thickbox" href="plugin-install.php?tab=plugin-information&plugin=wsl-buddypress&TB_iframe=true"><?php _wsl_e( "Install Now", 'wordpress-social-login' ) ?></a>
|
64 |
+
<a class="button button-secondary" href="http://wordpress.org/extend/plugins/wsl-buddypress/" target="_blank"><?php _wsl_e( "Visit plugin site", 'wordpress-social-login' ) ?></a>
|
65 |
+
</div>
|
66 |
+
</div>
|
67 |
+
|
68 |
+
<div class="wsl_addon_div">
|
69 |
+
<h3 style="margin:0px;"><?php _wsl_e( "Build yours", 'wordpress-social-login' ) ?></h3>
|
70 |
+
<hr />
|
71 |
+
<p><?php _wsl_e( "Looking to build your own custom <b>WordPress Social Login</b> extenstion or component? Well, it's pretty easy. Just RTFM :)", 'wordpress-social-login' ) ?></p>
|
72 |
+
|
73 |
+
<div>
|
74 |
+
<a class="button button-primary" href="http://hybridauth.sourceforge.net/wsl/developer.html" target="_blank"><?php _wsl_e( "WSL Developer API", 'wordpress-social-login' ) ?></a>
|
75 |
+
<a class="button button-secondary" href="https://github.com/hybridauth/WordPress-Social-Login" target="_blank"><?php _wsl_e( "WSL on Github", 'wordpress-social-login' ) ?></a>
|
76 |
+
</div>
|
77 |
+
</div>
|
78 |
+
<?php
|
79 |
+
// HOOKABLE:
|
80 |
+
do_action( "wsl_component_components_gallery_end" );
|
81 |
+
}
|
82 |
+
|
83 |
+
// --------------------------------------------------------------------
|
includes/admin/components/components/wsl.components.help.setup.php
ADDED
@@ -0,0 +1,92 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/*!
|
3 |
+
* WordPress Social Login
|
4 |
+
*
|
5 |
+
* http://hybridauth.sourceforge.net/wsl/index.html | http://github.com/hybridauth/WordPress-Social-Login
|
6 |
+
* (c) 2011-2013 Mohamed Mrassi and contributors | http://wordpress.org/extend/plugins/wordpress-social-login/
|
7 |
+
*/
|
8 |
+
|
9 |
+
/**
|
10 |
+
* Components Manager
|
11 |
+
*/
|
12 |
+
|
13 |
+
// Exit if accessed directly
|
14 |
+
if ( !defined( 'ABSPATH' ) ) exit;
|
15 |
+
|
16 |
+
// --------------------------------------------------------------------
|
17 |
+
|
18 |
+
function wsl_component_components_setup()
|
19 |
+
{
|
20 |
+
// HOOKABLE:
|
21 |
+
do_action( "wsl_component_components_setup_start" );
|
22 |
+
|
23 |
+
GLOBAL $WORDPRESS_SOCIAL_LOGIN_COMPONENTS;
|
24 |
+
?>
|
25 |
+
<form action="" method="post">
|
26 |
+
<table class="widefat fixed plugins" cellspacing="0">
|
27 |
+
<thead>
|
28 |
+
<tr>
|
29 |
+
<th scope="col" class="manage-column column-label" style="width: 190px;"><?php _wsl_e( "Component", 'wordpress-social-login' ) ?></th>
|
30 |
+
<th scope="col" class="manage-column column-description"><?php _wsl_e( "Description", 'wordpress-social-login' ) ?></th>
|
31 |
+
<th scope="col" class="manage-column column-action" style="width: 120px;"> </th>
|
32 |
+
</tr>
|
33 |
+
</thead>
|
34 |
+
|
35 |
+
<tfoot>
|
36 |
+
<tr>
|
37 |
+
<th scope="col" class="manage-column column-label" style="width: 190px;"><?php _wsl_e( "Component", 'wordpress-social-login' ) ?></th>
|
38 |
+
<th scope="col" class="manage-column column-description"><?php _wsl_e( "Description", 'wordpress-social-login' ) ?></th>
|
39 |
+
<th scope="col" class="manage-column column-action" style="width: 120px;"> </th>
|
40 |
+
</tr>
|
41 |
+
</tfoot>
|
42 |
+
|
43 |
+
<tbody id="the-list">
|
44 |
+
<?php
|
45 |
+
foreach( $WORDPRESS_SOCIAL_LOGIN_COMPONENTS as $name => $settings ){
|
46 |
+
if( $name == "core" ){
|
47 |
+
continue;
|
48 |
+
}
|
49 |
+
?>
|
50 |
+
<tr id="<?php echo $name ?>" class="<?php echo $name ?> <?php if( $settings["enabled"] ) echo "active"; else echo "inactive"; ?>">
|
51 |
+
<td class="component-label" style="width: 190px;">
|
52 |
+
<?php if( $settings["type"] == "core" ): ?>
|
53 |
+
<div class="icon16 icon-generic"></div>
|
54 |
+
<?php elseif( $settings["type"] == "plugin" ): ?>
|
55 |
+
<div class="icon16 icon-plugins"></div>
|
56 |
+
<?php else: ?>
|
57 |
+
<div class="icon16 icon-appearance"></div>
|
58 |
+
<?php endif; ?>
|
59 |
+
<strong><?php _wsl_e( $settings["label"], 'wordpress-social-login' ) ?></strong>
|
60 |
+
</td>
|
61 |
+
<td class="column-description">
|
62 |
+
<p><?php _wsl_e( $settings["description"], 'wordpress-social-login' ) ?></p>
|
63 |
+
</td>
|
64 |
+
<td class="column-action" align="right" style="width: 120px;">
|
65 |
+
<p>
|
66 |
+
<?php if( $settings["type"] == "core" && $settings["enabled"] ): ?>
|
67 |
+
<a class="button-secondary" style="color:#000000" href="options-general.php?page=wordpress-social-login&wslp=<?php echo $name ?>"><?php _wsl_e( "View", 'wordpress-social-login' ) ?></a>
|
68 |
+
<?php endif; ?>
|
69 |
+
|
70 |
+
<?php if( $settings["type"] != "core" ): ?>
|
71 |
+
<?php if( $settings["enabled"] ): ?>
|
72 |
+
<a class="button-secondary" href="options-general.php?page=wordpress-social-login&wslp=components&disable=<?php echo $name ?>"><?php _wsl_e( "Disable", 'wordpress-social-login' ) ?></a>
|
73 |
+
<?php else: ?>
|
74 |
+
<a class="button-primary" style="color:#ffffff" href="options-general.php?page=wordpress-social-login&wslp=components&enable=<?php echo $name ?>"><?php _wsl_e( "Enable", 'wordpress-social-login' ) ?> </a>
|
75 |
+
<?php endif; ?>
|
76 |
+
<?php endif; ?>
|
77 |
+
|
78 |
+
</p>
|
79 |
+
</td>
|
80 |
+
</tr>
|
81 |
+
<?php
|
82 |
+
}
|
83 |
+
?>
|
84 |
+
</tbody>
|
85 |
+
</table>
|
86 |
+
</form>
|
87 |
+
<?php
|
88 |
+
// HOOKABLE:
|
89 |
+
do_action( "wsl_component_components_setup_end" );
|
90 |
+
}
|
91 |
+
|
92 |
+
// --------------------------------------------------------------------
|
includes/admin/components/contacts/index.php
ADDED
@@ -0,0 +1,220 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/*!
|
3 |
+
* WordPress Social Login
|
4 |
+
*
|
5 |
+
* http://hybridauth.sourceforge.net/wsl/index.html | http://github.com/hybridauth/WordPress-Social-Login
|
6 |
+
* (c) 2011-2013 Mohamed Mrassi and contributors | http://wordpress.org/extend/plugins/wordpress-social-login/
|
7 |
+
*/
|
8 |
+
|
9 |
+
/**
|
10 |
+
* Wannabe Contact Manager module
|
11 |
+
*/
|
12 |
+
|
13 |
+
// --------------------------------------------------------------------
|
14 |
+
|
15 |
+
function wsl_component_contacts()
|
16 |
+
{
|
17 |
+
// HOOKABLE:
|
18 |
+
do_action( "wsl_component_contacts_start" );
|
19 |
+
|
20 |
+
GLOBAL $wpdb;
|
21 |
+
|
22 |
+
$assets_base_url = WORDPRESS_SOCIAL_LOGIN_PLUGIN_URL . '/assets/img/16x16/';
|
23 |
+
?>
|
24 |
+
<div>
|
25 |
+
<?php
|
26 |
+
if( isset( $_REQUEST["uid"] ) && (int) $_REQUEST["uid"] ){
|
27 |
+
$user_id = (int) $_REQUEST["uid"];
|
28 |
+
}
|
29 |
+
else{
|
30 |
+
?>
|
31 |
+
<form method="post" id="wsl_setup_form" action="options.php">
|
32 |
+
<?php settings_fields( 'wsl-settings-group-contacts-import' ); ?>
|
33 |
+
|
34 |
+
<div class="metabox-holder columns-2" id="post-body">
|
35 |
+
<div id="post-body-content">
|
36 |
+
|
37 |
+
<div id="namediv" class="stuffbox">
|
38 |
+
<h3>
|
39 |
+
<label for="name"><?php _wsl_e("Settings", 'wordpress-social-login') ?></label>
|
40 |
+
</h3>
|
41 |
+
<div class="inside">
|
42 |
+
<p>
|
43 |
+
<?php _wsl_e("<b>WordPress Social Login</b> is now introducing <b>Contacts Import</b> as a new feature. When enabled, users authenticating through WordPress Social Login will be asked for the authorisation to import their contact list. Note that some social networks do not provide certains of their users information like contacts emails, photos and or profile urls", 'wordpress-social-login') ?>.
|
44 |
+
</p>
|
45 |
+
<h4><?php _wsl_e("Enable contacts import for", 'wordpress-social-login') ?> :</h4>
|
46 |
+
<table width="100%" border="0" cellpadding="5" cellspacing="2" style="border-top:1px solid #ccc;border-bottom:1px solid #ccc">
|
47 |
+
<tr>
|
48 |
+
<td align="right"><strong>Facebook :</strong></td>
|
49 |
+
<td>
|
50 |
+
<select name="wsl_settings_contacts_import_facebook" <?php if( ! get_option( 'wsl_settings_Facebook_enabled' ) ) echo "disabled" ?> >
|
51 |
+
<option <?php if( get_option( 'wsl_settings_contacts_import_facebook' ) == 1 ) echo "selected"; ?> value="1"><?php _wsl_e("Enabled", 'wordpress-social-login') ?></option>
|
52 |
+
<option <?php if( get_option( 'wsl_settings_contacts_import_facebook' ) == 2 ) echo "selected"; ?> value="2"><?php _wsl_e("Disabled", 'wordpress-social-login') ?></option>
|
53 |
+
</select>
|
54 |
+
</td>
|
55 |
+
<td align="right" style="border-left:1px solid #ccc" ><strong>Google :</strong></td>
|
56 |
+
<td>
|
57 |
+
<select name="wsl_settings_contacts_import_google" <?php if( ! get_option( 'wsl_settings_Google_enabled' ) ) echo "disabled" ?> >
|
58 |
+
<option <?php if( get_option( 'wsl_settings_contacts_import_google' ) == 1 ) echo "selected"; ?> value="1"><?php _wsl_e("Enabled", 'wordpress-social-login') ?></option>
|
59 |
+
<option <?php if( get_option( 'wsl_settings_contacts_import_google' ) == 2 ) echo "selected"; ?> value="2"><?php _wsl_e("Disabled", 'wordpress-social-login') ?></option>
|
60 |
+
</select>
|
61 |
+
</td>
|
62 |
+
<td align="right" style="border-left:1px solid #ccc" ><strong>Twitter :</strong></td>
|
63 |
+
<td>
|
64 |
+
<select name="wsl_settings_contacts_import_twitter" <?php if( ! get_option( 'wsl_settings_Twitter_enabled' ) ) echo "disabled" ?> >
|
65 |
+
<option <?php if( get_option( 'wsl_settings_contacts_import_twitter' ) == 1 ) echo "selected"; ?> value="1"><?php _wsl_e("Enabled", 'wordpress-social-login') ?></option>
|
66 |
+
<option <?php if( get_option( 'wsl_settings_contacts_import_twitter' ) == 2 ) echo "selected"; ?> value="2"><?php _wsl_e("Disabled", 'wordpress-social-login') ?></option>
|
67 |
+
</select>
|
68 |
+
</td>
|
69 |
+
<td align="right" style="border-left:1px solid #ccc" ><strong>Windows Live :</strong></td>
|
70 |
+
<td>
|
71 |
+
<select name="wsl_settings_contacts_import_live" <?php if( ! get_option( 'wsl_settings_Live_enabled' ) ) echo "disabled" ?> >
|
72 |
+
<option <?php if( get_option( 'wsl_settings_contacts_import_live' ) == 1 ) echo "selected"; ?> value="1"><?php _wsl_e("Enabled", 'wordpress-social-login') ?></option>
|
73 |
+
<option <?php if( get_option( 'wsl_settings_contacts_import_live' ) == 2 ) echo "selected"; ?> value="2"><?php _wsl_e("Disabled", 'wordpress-social-login') ?></option>
|
74 |
+
</select>
|
75 |
+
</td>
|
76 |
+
<td align="right" style="border-left:1px solid #ccc" ><strong>LinkedIn :</strong></td>
|
77 |
+
<td>
|
78 |
+
<select name="wsl_settings_contacts_import_linkedin" <?php if( ! get_option( 'wsl_settings_LinkedIn_enabled' ) ) echo "disabled" ?> >
|
79 |
+
<option <?php if( get_option( 'wsl_settings_contacts_import_linkedin' ) == 1 ) echo "selected"; ?> value="1"><?php _wsl_e("Enabled", 'wordpress-social-login') ?></option>
|
80 |
+
<option <?php if( get_option( 'wsl_settings_contacts_import_linkedin' ) == 2 ) echo "selected"; ?> value="2"><?php _wsl_e("Disabled", 'wordpress-social-login') ?></option>
|
81 |
+
</select>
|
82 |
+
</td>
|
83 |
+
</tr>
|
84 |
+
</table>
|
85 |
+
<p>
|
86 |
+
<b style="color:#CB4B16;"><?php _wsl_e("Notes", 'wordpress-social-login') ?>:</b>
|
87 |
+
<ul style="margin-left:40px;margin-top:0px;">
|
88 |
+
<li><?php _wsl_e('To enable contacts import from these social network, you need first to enabled them on the <a href="options-general.php?page=wordpress-social-login&wslp=networks"><b>Networks</b></a> tab and register the required application', 'wordpress-social-login') ?>.</li>
|
89 |
+
<li><?php _wsl_e("<b>WSL</b> will try to import as much information about a user contacts as he was able to pull from the social networks APIs.", 'wordpress-social-login') ?></li>
|
90 |
+
<li><?php _wsl_e('All contacts data are sotred into your database on the table: <code>`wsluserscontacts`</code>', 'wordpress-social-login') ?>.</li>
|
91 |
+
</ul>
|
92 |
+
</p>
|
93 |
+
</div>
|
94 |
+
</div>
|
95 |
+
|
96 |
+
<br style="clear:both;" />
|
97 |
+
<div style="margin-left:5px;margin-top:-20px;">
|
98 |
+
<input type="submit" class="button-primary" value="<?php _wsl_e("Save Settings", 'wordpress-social-login') ?>" />
|
99 |
+
</div>
|
100 |
+
|
101 |
+
</div>
|
102 |
+
</div>
|
103 |
+
</form>
|
104 |
+
|
105 |
+
<br style="clear:both;" />
|
106 |
+
<hr />
|
107 |
+
<h3><?php _wsl_e("Users contacts list preview", 'wordpress-social-login') ?></h3>
|
108 |
+
<?php
|
109 |
+
} // if( isset( $_REQUEST["uid"] ) && (int) $_REQUEST["uid"] ){
|
110 |
+
|
111 |
+
if( $user_id ){
|
112 |
+
$display_name = wsl_get_user_data_by_user_id( "display_name", $user_id );
|
113 |
+
?>
|
114 |
+
<h3><?php echo sprintf( _wsl__("%s contact's list", 'wordpress-social-login'), $display_name ) ?></h3>
|
115 |
+
<?php
|
116 |
+
}
|
117 |
+
?>
|
118 |
+
<table cellspacing="0" class="wp-list-table widefat fixed users">
|
119 |
+
<thead>
|
120 |
+
<tr>
|
121 |
+
<th width="100"><span><?php _wsl_e("Provider", 'wordpress-social-login') ?></span></th>
|
122 |
+
<th><span><?php _wsl_e("User", 'wordpress-social-login') ?></span></th>
|
123 |
+
<th><span><?php _wsl_e("Contact Name", 'wordpress-social-login') ?></span></th>
|
124 |
+
<th><span><?php _wsl_e("Contact Email", 'wordpress-social-login') ?></span></th>
|
125 |
+
<th><span><?php _wsl_e("Contact Profile Url", 'wordpress-social-login') ?></span></th>
|
126 |
+
</tr>
|
127 |
+
</thead>
|
128 |
+
<tfoot>
|
129 |
+
<tr>
|
130 |
+
<th><span><?php _wsl_e("Provider", 'wordpress-social-login') ?></span></th>
|
131 |
+
<th><span><?php _wsl_e("User", 'wordpress-social-login') ?></span></th>
|
132 |
+
<th><span><?php _wsl_e("Contact Name", 'wordpress-social-login') ?></span></th>
|
133 |
+
<th><span><?php _wsl_e("Contact Email", 'wordpress-social-login') ?></span></th>
|
134 |
+
<th><span><?php _wsl_e("Contact Profile Url", 'wordpress-social-login') ?></span></th>
|
135 |
+
</tr>
|
136 |
+
</tfoot>
|
137 |
+
<tbody id="the-list">
|
138 |
+
<?php
|
139 |
+
$sql = "SELECT * FROM `{$wpdb->prefix}wsluserscontacts` order by rand() limit 10";
|
140 |
+
|
141 |
+
if( $user_id ){
|
142 |
+
$sql = "SELECT * FROM `{$wpdb->prefix}wsluserscontacts` WHERE user_id = '$user_id'";
|
143 |
+
}
|
144 |
+
|
145 |
+
$rs1 = $wpdb->get_results( $sql );
|
146 |
+
|
147 |
+
// have contacts?
|
148 |
+
if( ! $rs1 ){
|
149 |
+
?>
|
150 |
+
<tr class="no-items"><td colspan="5" class="colspanchange"><?php _wsl_e("No contacts found", 'wordpress-social-login') ?>.</td></tr>
|
151 |
+
<?php
|
152 |
+
}
|
153 |
+
else{
|
154 |
+
$i = 0;
|
155 |
+
foreach( $rs1 as $item ){
|
156 |
+
$provider = $item->provider;
|
157 |
+
$user_id = $item->user_id;
|
158 |
+
$contact_id = $item->id;
|
159 |
+
?>
|
160 |
+
<tr class="<?php if( ++$i % 2 ) echo "alternate" ?>">
|
161 |
+
<td><img src="<?php $provider = wsl_get_contact_data_by_user_id( "provider", $contact_id); echo $assets_base_url . strtolower( $provider ) . '.png' ?>" style="vertical-align:top;width:16px;height:16px;" /> <?php echo $provider ?></td>
|
162 |
+
<td>
|
163 |
+
<?php
|
164 |
+
// check if user exists
|
165 |
+
if( wsl_get_user_by_meta_key_and_user_id( "wsl_user", $user_id) ){
|
166 |
+
?>
|
167 |
+
<?php $wsl_user_image = wsl_get_user_by_meta_key_and_user_id( "wsl_user_image", $user_id); if( $wsl_user_image ) { ?>
|
168 |
+
<img width="32" height="32" class="avatar avatar-32 photo" src="<?php echo $wsl_user_image ?>" >
|
169 |
+
<?php } else { ?>
|
170 |
+
<img width="32" height="32" class="avatar avatar-32 photo" src="http://1.gravatar.com/avatar/d4ed6debc848ece02976aba03e450d60?s=32" >
|
171 |
+
<?php } ?>
|
172 |
+
<strong><a href="user-edit.php?user_id=<?php echo $user_id ?>"><?php echo wsl_get_user_by_meta_key_and_user_id( "nickname", $user_id) ?></a></strong>
|
173 |
+
(<?php echo wsl_get_user_by_meta_key_and_user_id( "last_name", $user_id) ?> <?php echo wsl_get_user_by_meta_key_and_user_id( "first_name", $user_id) ?>)
|
174 |
+
<?php
|
175 |
+
}
|
176 |
+
else{
|
177 |
+
echo "User removed";
|
178 |
+
}
|
179 |
+
?>
|
180 |
+
<br>
|
181 |
+
</td>
|
182 |
+
<td>
|
183 |
+
<?php $photo_url = wsl_get_contact_data_by_user_id( "photo_url", $contact_id); if( $photo_url ) { ?>
|
184 |
+
<img width="32" height="32" class="avatar avatar-32 photo" src="<?php echo $photo_url ?>" >
|
185 |
+
<?php } else { ?>
|
186 |
+
<img width="32" height="32" class="avatar avatar-32 photo" src="http://1.gravatar.com/avatar/d4ed6debc848ece02976aba03e450d60?s=32" >
|
187 |
+
<?php } ?>
|
188 |
+
<strong><?php echo wsl_get_contact_data_by_user_id( "full_name", $contact_id) ?></strong>
|
189 |
+
<br>
|
190 |
+
</td>
|
191 |
+
<td>
|
192 |
+
<?php $email = wsl_get_contact_data_by_user_id( "email", $contact_id); if( $email ) { ?>
|
193 |
+
<a href="mailto:<?php echo $email ?>"><?php echo $email ?></a>
|
194 |
+
<?php } else { ?>
|
195 |
+
-
|
196 |
+
<?php } ?>
|
197 |
+
</td>
|
198 |
+
<td>
|
199 |
+
<?php $profile_url = wsl_get_contact_data_by_user_id( "profile_url", $contact_id); if( $profile_url ) { ?>
|
200 |
+
<a href="<?php echo $profile_url ?>" target="_blank"><?php echo str_ireplace( array("http://www.", "https://www.", "http://","https://"), array('','','','',''), $profile_url ) ?></a>
|
201 |
+
<?php } else { ?>
|
202 |
+
-
|
203 |
+
<?php } ?>
|
204 |
+
</td>
|
205 |
+
</tr>
|
206 |
+
<?php
|
207 |
+
}
|
208 |
+
}
|
209 |
+
?>
|
210 |
+
</tbody>
|
211 |
+
</table>
|
212 |
+
</div>
|
213 |
+
<?php
|
214 |
+
// HOOKABLE:
|
215 |
+
do_action( "wsl_component_contacts_end" );
|
216 |
+
}
|
217 |
+
|
218 |
+
wsl_component_contacts();
|
219 |
+
|
220 |
+
// --------------------------------------------------------------------
|
includes/admin/components/diagnostics/index.php
ADDED
@@ -0,0 +1,75 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/*!
|
3 |
+
* WordPress Social Login
|
4 |
+
*
|
5 |
+
* http://hybridauth.sourceforge.net/wsl/index.html | http://github.com/hybridauth/WordPress-Social-Login
|
6 |
+
* (c) 2011-2013 Mohamed Mrassi and contributors | http://wordpress.org/extend/plugins/wordpress-social-login/
|
7 |
+
*/
|
8 |
+
|
9 |
+
/**
|
10 |
+
* WSL Diagnostics module
|
11 |
+
*/
|
12 |
+
|
13 |
+
// --------------------------------------------------------------------
|
14 |
+
|
15 |
+
function wsl_component_diagnostics()
|
16 |
+
{
|
17 |
+
// HOOKABLE:
|
18 |
+
do_action( "wsl_component_diagnostics_start" );
|
19 |
+
?>
|
20 |
+
<div style="margin-left:20px;">
|
21 |
+
<form method="post" id="wsl_setup_form" action="options.php">
|
22 |
+
<?php settings_fields( 'wsl-settings-group-development' ); ?>
|
23 |
+
|
24 |
+
<h3><?php _wsl_e("Requirements test", 'wordpress-social-login') ?></h3>
|
25 |
+
|
26 |
+
<p style="margin-left:25px;font-size: 14px;">
|
27 |
+
<?php _wsl_e('In order for <b>WordPress Social Login</b> to work properly, your server should meet certain requirements. These "requirements" <br />and "services" are usually offered by default by most "modern" web hosting providers, however some complications may <br />occur with <b>shared hosting</b> and, or <b>custom wordpress installations</b>', 'wordpress-social-login') ?>.
|
28 |
+
</p>
|
29 |
+
<p style="margin-left:25px;font-size: 14px;">
|
30 |
+
<?php _wsl_e("The minimum server requirements are", 'wordpress-social-login') ?>:
|
31 |
+
</p>
|
32 |
+
<ul style="margin-left:60px;">
|
33 |
+
<li><?php _wsl_e("PHP >= 5.2.0 installed", 'wordpress-social-login') ?></li>
|
34 |
+
<li><?php _wsl_e("WSL Endpoint URLs reachable", 'wordpress-social-login') ?></li>
|
35 |
+
<li><?php _wsl_e("PHP's default SESSION handling", 'wordpress-social-login') ?></li>
|
36 |
+
<li><?php _wsl_e("PHP/CURL/SSL Extension enabled", 'wordpress-social-login') ?></li>
|
37 |
+
<li><?php _wsl_e("PHP/JSON Extension enabled", 'wordpress-social-login') ?></li>
|
38 |
+
<li><?php _wsl_e("PHP/REGISTER_GLOBALS Off", 'wordpress-social-login') ?></li>
|
39 |
+
<li><?php _wsl_e("jQuery installed on WordPress backoffice", 'wordpress-social-login') ?></li>
|
40 |
+
</ul>
|
41 |
+
<p style="margin-left:25px;margin-top:25px;">
|
42 |
+
<?php _wsl_e("You can run the <b>WordPress Social Login Requirements Test</b> by clicking the button bellow", 'wordpress-social-login') ?>:
|
43 |
+
|
44 |
+
<br />
|
45 |
+
<br />
|
46 |
+
<a class="button-primary" href='<?php echo WORDPRESS_SOCIAL_LOGIN_PLUGIN_URL ?>/services/diagnostics.php' target='_blank'><?php _wsl_e("Run the plugin requirements test", 'wordpress-social-login') ?></a>
|
47 |
+
<a class="button-primary" href='<?php echo WORDPRESS_SOCIAL_LOGIN_PLUGIN_URL ?>/services/siteinfo.php' target='_blank'><?php _wsl_e("Website Information", 'wordpress-social-login') ?></a>.
|
48 |
+
</p>
|
49 |
+
|
50 |
+
<br />
|
51 |
+
<hr />
|
52 |
+
|
53 |
+
<h3><?php _wsl_e("Development mode", 'wordpress-social-login') ?></h3>
|
54 |
+
|
55 |
+
<p style="margin-left:25px;">
|
56 |
+
<?php _wsl_e('By enabling the development mode, this plugin will try generate and display a technical reports when something goes wrong. <br />This report can help your figure out the root of any issues you may runs into, or you can also send it to the plugin developer. <br />Its recommend to set the Development mode to <b style="color:red">Disabled</b> on production.', 'wordpress-social-login') ?>
|
57 |
+
|
58 |
+
<br />
|
59 |
+
<br />
|
60 |
+
<select name="wsl_settings_development_mode_enabled">
|
61 |
+
<option <?php if( get_option( 'wsl_settings_development_mode_enabled' ) ) echo "selected"; ?> value="1"><?php _wsl_e("Enabled", 'wordpress-social-login') ?></option>
|
62 |
+
<option <?php if( ! get_option( 'wsl_settings_development_mode_enabled' ) ) echo "selected"; ?> value="0"><?php _wsl_e("Disabled", 'wordpress-social-login') ?></option>
|
63 |
+
</select>
|
64 |
+
<input type="submit" class="button-primary" value="<?php _wsl_e("Save Settings", 'wordpress-social-login') ?>" />
|
65 |
+
</p>
|
66 |
+
</form>
|
67 |
+
</div>
|
68 |
+
<?php
|
69 |
+
// HOOKABLE:
|
70 |
+
do_action( "wsl_component_diagnostics_end" );
|
71 |
+
}
|
72 |
+
|
73 |
+
wsl_component_diagnostics();
|
74 |
+
|
75 |
+
// --------------------------------------------------------------------
|
includes/admin/components/help/index.php
ADDED
@@ -0,0 +1,105 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/*!
|
3 |
+
* WordPress Social Login
|
4 |
+
*
|
5 |
+
* http://hybridauth.sourceforge.net/wsl/index.html | http://github.com/hybridauth/WordPress-Social-Login
|
6 |
+
* (c) 2011-2013 Mohamed Mrassi and contributors | http://wordpress.org/extend/plugins/wordpress-social-login/
|
7 |
+
*/
|
8 |
+
|
9 |
+
/**
|
10 |
+
* Documentation and stuff
|
11 |
+
*/
|
12 |
+
|
13 |
+
// Exit if accessed directly
|
14 |
+
if ( !defined( 'ABSPATH' ) ) exit;
|
15 |
+
|
16 |
+
// --------------------------------------------------------------------
|
17 |
+
|
18 |
+
function wsl_component_help()
|
19 |
+
{
|
20 |
+
// HOOKABLE:
|
21 |
+
do_action( "wsl_component_help_start" );
|
22 |
+
?>
|
23 |
+
<div class="wslgn">
|
24 |
+
<div style="width: 290px; float: right; margin: 20px 0 20px 20px; margin-top:0px; padding: 0 20px 20px 20px; border: 1px solid #ddd; background-color: #fff;">
|
25 |
+
<h3><?php _wsl_e("Troubleshooting", 'wordpress-social-login') ?></h3>
|
26 |
+
<p>
|
27 |
+
<b><a class="button-primary" href="options-general.php?page=wordpress-social-login&wslp=diagnostics"><?php _wsl_e('WSL Diagnostics', 'wordpress-social-login') ?></a></b>
|
28 |
+
|
29 |
+
<b><a class="button-primary" href="<?php echo WORDPRESS_SOCIAL_LOGIN_PLUGIN_URL ?>/services/siteinfo.php"><?php _wsl_e('System information', 'wordpress-social-login') ?></a></b>
|
30 |
+
</p>
|
31 |
+
<p align="justify">
|
32 |
+
<?php _wsl_e('If you run into any issue, you can access the <b>WordPress Social Login Diagnostics</b> to check the <b>Plugin Requirements</b> or to enable the <b>Development mode</b>', 'wordpress-social-login') ?>.
|
33 |
+
</p>
|
34 |
+
<p align="justify">
|
35 |
+
<?php _wsl_e('Remember to include your System information when posting support requests', 'wordpress-social-login') ?>.
|
36 |
+
</p>
|
37 |
+
</div>
|
38 |
+
|
39 |
+
<h3><?php _wsl_e("Documentation", 'wordpress-social-login') ?></h3>
|
40 |
+
<p>
|
41 |
+
<?php _wsl_e('The complete <b>User Guide</b> can be found at
|
42 |
+
<a href="http://hybridauth.sourceforge.net/wsl/index.html" target="_blank">hybridauth.sourceforge.net/wsl/index.html</a>', 'wordpress-social-login') ?>
|
43 |
+
</p>
|
44 |
+
|
45 |
+
<hr />
|
46 |
+
|
47 |
+
<h3><?php _wsl_e("FAQs", 'wordpress-social-login') ?></h3>
|
48 |
+
<p>
|
49 |
+
<?php _wsl_e('A list of <b>Frequently asked questions</b> can be found at
|
50 |
+
<a href="http://hybridauth.sourceforge.net/wsl/faq.html" target="_blank">hybridauth.sourceforge.net/wsl/faq.html</a>', 'wordpress-social-login') ?>
|
51 |
+
</p>
|
52 |
+
|
53 |
+
<hr />
|
54 |
+
|
55 |
+
<h3><?php _wsl_e("Support", 'wordpress-social-login') ?></h3>
|
56 |
+
<p>
|
57 |
+
<?php _wsl_e('To get help and support refer to <a href="http://hybridauth.sourceforge.net/wsl/support.html" target="_blank">http://hybridauth.sourceforge.net/wsl/support.html</a>', 'wordpress-social-login') ?>
|
58 |
+
</p>
|
59 |
+
|
60 |
+
<hr />
|
61 |
+
|
62 |
+
<h3><?php _wsl_e("Credits", 'wordpress-social-login') ?></h3>
|
63 |
+
<p>
|
64 |
+
<?php _wsl_e('WordPress Social Login was created by <a href="http://profiles.wordpress.org/miled/" target="_blank">Mohamed Mrassi</a> (a.k.a Miled) and <a href="https://github.com/hybridauth/WordPress-Social-Login/graphs/contributors" target="_blank">contributors</a>', 'wordpress-social-login') ?>.
|
65 |
+
<?php _wsl_e("Many other people have also contributed with <br />constructive discussions, support and by submitting patches", 'wordpress-social-login') ?>.
|
66 |
+
</p>
|
67 |
+
|
68 |
+
<hr />
|
69 |
+
|
70 |
+
<h3><?php _wsl_e("License", 'wordpress-social-login') ?></h3>
|
71 |
+
<p>
|
72 |
+
<?php _wsl_e("<b>WordPress Social Login</b> is an open source software licenced under The MIT License (MIT)", 'wordpress-social-login') ?>
|
73 |
+
</p>
|
74 |
+
|
75 |
+
<pre class="wslpre" style="margin-left:20px;">
|
76 |
+
Copyright (C) 2011-2013 Mohamed Mrassi and contributors
|
77 |
+
|
78 |
+
Permission is hereby granted, free of charge, to any person obtaining
|
79 |
+
a copy of this software and associated documentation files (the
|
80 |
+
"Software"), to deal in the Software without restriction, including
|
81 |
+
without limitation the rights to use, copy, modify, merge, publish,
|
82 |
+
distribute, sublicense, and/or sell copies of the Software, and to
|
83 |
+
permit persons to whom the Software is furnished to do so, subject to
|
84 |
+
the following conditions:
|
85 |
+
|
86 |
+
The above copyright notice and this permission notice shall be
|
87 |
+
included in all copies or substantial portions of the Software.
|
88 |
+
|
89 |
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
90 |
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
91 |
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
92 |
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
93 |
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
94 |
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
95 |
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
96 |
+
</pre>
|
97 |
+
</div>
|
98 |
+
<?php
|
99 |
+
// HOOKABLE:
|
100 |
+
do_action( "wsl_component_help_end" );
|
101 |
+
}
|
102 |
+
|
103 |
+
wsl_component_help();
|
104 |
+
|
105 |
+
// --------------------------------------------------------------------
|
includes/admin/components/login-widget/index.php
ADDED
@@ -0,0 +1,56 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/*!
|
3 |
+
* WordPress Social Login
|
4 |
+
*
|
5 |
+
* http://hybridauth.sourceforge.net/wsl/index.html | http://github.com/hybridauth/WordPress-Social-Login
|
6 |
+
* (c) 2011-2013 Mohamed Mrassi and contributors | http://wordpress.org/extend/plugins/wordpress-social-login/
|
7 |
+
*/
|
8 |
+
|
9 |
+
/**
|
10 |
+
* Widget Customization
|
11 |
+
*/
|
12 |
+
|
13 |
+
// Exit if accessed directly
|
14 |
+
if ( !defined( 'ABSPATH' ) ) exit;
|
15 |
+
|
16 |
+
// --------------------------------------------------------------------
|
17 |
+
|
18 |
+
function wsl_component_loginwidget()
|
19 |
+
{
|
20 |
+
// HOOKABLE:
|
21 |
+
do_action( "wsl_component_loginwidget_start" );
|
22 |
+
|
23 |
+
include "wsl.components.loginwidget.setup.php";
|
24 |
+
include "wsl.components.loginwidget.sidebar.php";
|
25 |
+
|
26 |
+
wsl_admin_welcome_panel();
|
27 |
+
?>
|
28 |
+
<form method="post" id="wsl_setup_form" action="options.php">
|
29 |
+
<?php settings_fields( 'wsl-settings-group-customize' ); ?>
|
30 |
+
|
31 |
+
<div class="metabox-holder columns-2" id="post-body">
|
32 |
+
<table width="100%">
|
33 |
+
<tr valign="top">
|
34 |
+
<td>
|
35 |
+
<?php
|
36 |
+
wsl_component_loginwidget_setup();
|
37 |
+
?>
|
38 |
+
</td>
|
39 |
+
<td width="10"></td>
|
40 |
+
<td width="400">
|
41 |
+
<?php
|
42 |
+
wsl_component_loginwidget_sidebar();
|
43 |
+
?>
|
44 |
+
</td>
|
45 |
+
</tr>
|
46 |
+
</table>
|
47 |
+
</div>
|
48 |
+
</form>
|
49 |
+
<?php
|
50 |
+
// HOOKABLE:
|
51 |
+
do_action( "wsl_component_loginwidget_end" );
|
52 |
+
}
|
53 |
+
|
54 |
+
wsl_component_loginwidget();
|
55 |
+
|
56 |
+
// --------------------------------------------------------------------
|
includes/admin/components/login-widget/wsl.components.loginwidget.setup.php
ADDED
@@ -0,0 +1,153 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/*!
|
3 |
+
* WordPress Social Login
|
4 |
+
*
|
5 |
+
* http://hybridauth.sourceforge.net/wsl/index.html | http://github.com/hybridauth/WordPress-Social-Login
|
6 |
+
* (c) 2011-2013 Mohamed Mrassi and contributors | http://wordpress.org/extend/plugins/wordpress-social-login/
|
7 |
+
*/
|
8 |
+
|
9 |
+
/**
|
10 |
+
* Widget Customization
|
11 |
+
*/
|
12 |
+
|
13 |
+
// Exit if accessed directly
|
14 |
+
if ( !defined( 'ABSPATH' ) ) exit;
|
15 |
+
|
16 |
+
// --------------------------------------------------------------------
|
17 |
+
|
18 |
+
function wsl_component_loginwidget_setup()
|
19 |
+
{
|
20 |
+
// HOOKABLE:
|
21 |
+
do_action( "wsl_component_loginwidget_setup_start" );
|
22 |
+
?>
|
23 |
+
<div id="post-body-content">
|
24 |
+
|
25 |
+
<div id="namediv" class="stuffbox">
|
26 |
+
<h3>
|
27 |
+
<label for="name"><?php _wsl_e("Basic Settings", 'wordpress-social-login') ?></label>
|
28 |
+
</h3>
|
29 |
+
<div class="inside">
|
30 |
+
<table width="100%" border="0" cellpadding="5" cellspacing="2" >
|
31 |
+
<tr>
|
32 |
+
<td width="135" align="right"><strong><?php _wsl_e("Connect with caption", 'wordpress-social-login') ?> :</strong></td>
|
33 |
+
<td>
|
34 |
+
<input type="text" class="inputgnrc" value="<?php echo get_option( 'wsl_settings_connect_with_label' ); ?>" name="wsl_settings_connect_with_label" >
|
35 |
+
</td>
|
36 |
+
</tr>
|
37 |
+
<tr>
|
38 |
+
<td align="right"><strong><?php _wsl_e("Social icon set", 'wordpress-social-login') ?> :</strong></td>
|
39 |
+
<td>
|
40 |
+
<select name="wsl_settings_social_icon_set" style="width:400px">
|
41 |
+
<option <?php if( get_option( 'wsl_settings_social_icon_set' ) == "wpzoom" ) echo "selected"; ?> value="wpzoom"><?php _wsl_e("WPZOOM social networking icon set", 'wordpress-social-login') ?></option>
|
42 |
+
<option <?php if( get_option( 'wsl_settings_social_icon_set' ) == "icondock" ) echo "selected"; ?> value="icondock"><?php _wsl_e("Icondock vector social media icons", 'wordpress-social-login') ?></option>
|
43 |
+
</select>
|
44 |
+
</td>
|
45 |
+
</tr>
|
46 |
+
<tr>
|
47 |
+
<td align="right"><strong><?php _wsl_e("Users avatars", 'wordpress-social-login') ?> :</strong></td>
|
48 |
+
<td>
|
49 |
+
<select name="wsl_settings_users_avatars" style="width:400px">
|
50 |
+
<option <?php if( ! get_option( 'wsl_settings_users_avatars' ) ) echo "selected"; ?> value="0"><?php _wsl_e("Display the default users avatars", 'wordpress-social-login') ?></option>
|
51 |
+
<option <?php if( get_option( 'wsl_settings_users_avatars' ) ) echo "selected"; ?> value="1"><?php _wsl_e("Display users avatars from social networks when available", 'wordpress-social-login') ?></option>
|
52 |
+
</select>
|
53 |
+
</td>
|
54 |
+
</tr>
|
55 |
+
</table>
|
56 |
+
<br>
|
57 |
+
</div>
|
58 |
+
</div>
|
59 |
+
|
60 |
+
<div id="namediv" class="stuffbox">
|
61 |
+
<h3>
|
62 |
+
<label for="name"><?php _wsl_e("Advanced Settings", 'wordpress-social-login') ?></label>
|
63 |
+
</h3>
|
64 |
+
<div class="inside">
|
65 |
+
<table width="100%" border="0" cellpadding="5" cellspacing="2" >
|
66 |
+
<tr>
|
67 |
+
<td width="135" align="right"><strong><?php _wsl_e("Redirect URL", 'wordpress-social-login') ?> :</strong></td>
|
68 |
+
<td>
|
69 |
+
<input type="text" name="wsl_settings_redirect_url" value="<?php echo get_option( 'wsl_settings_redirect_url' ); ?>" class="inputgnrc">
|
70 |
+
</td>
|
71 |
+
</tr>
|
72 |
+
<tr>
|
73 |
+
<td align="right"><strong><?php _wsl_e("Authentication flow", 'wordpress-social-login') ?> :</strong></td>
|
74 |
+
<td>
|
75 |
+
<select name="wsl_settings_use_popup" style="width:400px">
|
76 |
+
<option <?php if( get_option( 'wsl_settings_use_popup' ) == 1 ) echo "selected"; ?> value="1"><?php _wsl_e("Using popup window", 'wordpress-social-login') ?></option>
|
77 |
+
<option <?php if( get_option( 'wsl_settings_use_popup' ) == 2 ) echo "selected"; ?> value="2"><?php _wsl_e("No popup window", 'wordpress-social-login') ?></option>
|
78 |
+
</select>
|
79 |
+
</td>
|
80 |
+
</tr>
|
81 |
+
<tr>
|
82 |
+
<td align="right"><strong><?php _wsl_e("Widget display", 'wordpress-social-login') ?> :</strong></td>
|
83 |
+
<td>
|
84 |
+
<select name="wsl_settings_widget_display" style="width:400px">
|
85 |
+
<option <?php if( get_option( 'wsl_settings_widget_display' ) == 1 ) echo "selected"; ?> value="1"><?php _wsl_e("Display the widget in the comments area, login and register forms", 'wordpress-social-login') ?></option>
|
86 |
+
<option <?php if( get_option( 'wsl_settings_widget_display' ) == 2 ) echo "selected"; ?> value="2"><?php _wsl_e("Display the widget ONLY in the comments area", 'wordpress-social-login') ?></option>
|
87 |
+
<option <?php if( get_option( 'wsl_settings_widget_display' ) == 3 ) echo "selected"; ?> value="3"><?php _wsl_e("Display the widget ONLY in the login form", 'wordpress-social-login') ?></option>
|
88 |
+
</select>
|
89 |
+
</td>
|
90 |
+
</tr>
|
91 |
+
<tr>
|
92 |
+
<td align="right"><strong><?php _wsl_e("Notification", 'wordpress-social-login') ?> :</strong></td>
|
93 |
+
<td>
|
94 |
+
<select name="wsl_settings_users_notification" style="width:400px">
|
95 |
+
<option <?php if( ! get_option( 'wsl_settings_users_notification' ) ) echo "selected"; ?> value="0"><?php _wsl_e("No notification", 'wordpress-social-login') ?></option>
|
96 |
+
<option <?php if( get_option( 'wsl_settings_users_notification' ) == 1 ) echo "selected"; ?> value="1"><?php _wsl_e("Notify ONLY the blog admin of a new user", 'wordpress-social-login') ?></option>
|
97 |
+
</select>
|
98 |
+
</td>
|
99 |
+
</tr>
|
100 |
+
</table>
|
101 |
+
<br>
|
102 |
+
</div>
|
103 |
+
</div>
|
104 |
+
|
105 |
+
<div id="namediv" class="stuffbox">
|
106 |
+
<h3>
|
107 |
+
<label for="name"><?php _wsl_e("Custom CSS", 'wordpress-social-login') ?></label>
|
108 |
+
</h3>
|
109 |
+
<div class="inside">
|
110 |
+
<table width="100%" border="0" cellpadding="5" cellspacing="2" >
|
111 |
+
<tr>
|
112 |
+
<td width="135" align="right" valign="top"><strong><?php _wsl_e("Widget CSS", 'wordpress-social-login') ?> :</strong></td>
|
113 |
+
<td>
|
114 |
+
<?php _wsl_e("To customize the default widget styles you can either: edit the css file <strong>/wordpress-social-login/assets/css/style.css</strong>, or change it from this text area", 'wordpress-social-login') ?>.
|
115 |
+
<br />
|
116 |
+
<textarea style="width:100%;height:120px;margin-top:6px;" name="wsl_settings_authentication_widget_css"><?php echo get_option( 'wsl_settings_authentication_widget_css' ); ?></textarea>
|
117 |
+
<br />
|
118 |
+
<p><?php _wsl_e("The basic widget markup is the following", 'wordpress-social-login') ?>:</p>
|
119 |
+
<pre style="background-color: #eaffdc;border:1px solid #60cf4e; border-radius: 3px;padding: 10px;margin-top:5px;margin-bottom:0px;">
|
120 |
+
<span id="<code>wp-social-login-connect-with</code>">{connect_with_caption}</span>
|
121 |
+
|
122 |
+
<div id="<code>wp-social-login-connect-options</code>">
|
123 |
+
<a class="<code>wsl_connect_with_provider</code>">
|
124 |
+
<img src="{provider_icon_facebook}" />
|
125 |
+
</a>
|
126 |
+
|
127 |
+
<a class="<code>wsl_connect_with_provider</code>">
|
128 |
+
<img src="{provider_icon_google}" />
|
129 |
+
</a>
|
130 |
+
|
131 |
+
etc.
|
132 |
+
</div>
|
133 |
+
</pre>
|
134 |
+
</td>
|
135 |
+
</tr>
|
136 |
+
</table>
|
137 |
+
<br>
|
138 |
+
</div>
|
139 |
+
</div>
|
140 |
+
|
141 |
+
<br />
|
142 |
+
|
143 |
+
<div style="margin-left:5px;margin-top:-20px;">
|
144 |
+
<input type="submit" class="button-primary" value="<?php _wsl_e("Save Settings", 'wordpress-social-login') ?>" />
|
145 |
+
</div>
|
146 |
+
|
147 |
+
</div>
|
148 |
+
<?php
|
149 |
+
// HOOKABLE:
|
150 |
+
do_action( "wsl_component_loginwidget_setup_end" );
|
151 |
+
}
|
152 |
+
|
153 |
+
// --------------------------------------------------------------------
|
includes/admin/components/login-widget/wsl.components.loginwidget.sidebar.php
ADDED
@@ -0,0 +1,82 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/*!
|
3 |
+
* WordPress Social Login
|
4 |
+
*
|
5 |
+
* http://hybridauth.sourceforge.net/wsl/index.html | http://github.com/hybridauth/WordPress-Social-Login
|
6 |
+
* (c) 2011-2013 Mohamed Mrassi and contributors | http://wordpress.org/extend/plugins/wordpress-social-login/
|
7 |
+
*/
|
8 |
+
|
9 |
+
/**
|
10 |
+
* Widget Customization
|
11 |
+
*/
|
12 |
+
|
13 |
+
// Exit if accessed directly
|
14 |
+
if ( !defined( 'ABSPATH' ) ) exit;
|
15 |
+
|
16 |
+
// --------------------------------------------------------------------
|
17 |
+
|
18 |
+
function wsl_component_loginwidget_sidebar()
|
19 |
+
{
|
20 |
+
// HOOKABLE:
|
21 |
+
do_action( "wsl_component_loginwidget_sidebar_start" );
|
22 |
+
?>
|
23 |
+
<div class="postbox " id="linksubmitdiv">
|
24 |
+
<div class="inside">
|
25 |
+
<div id="submitlink" class="submitbox">
|
26 |
+
<h3 style="cursor: default;"><?php _wsl_e("What's This?", 'wordpress-social-login') ?></h3>
|
27 |
+
<div id="minor-publishing">
|
28 |
+
<div id="misc-publishing-actions">
|
29 |
+
<div style="padding:20px;padding-top:0px;">
|
30 |
+
<h4 style="cursor: default;border-bottom:1px solid #ccc;font-size: 13px;"><?php _wsl_e("Widget Customization", 'wordpress-social-login') ?></h4>
|
31 |
+
|
32 |
+
<p style="margin:10px;font-size: 13px;" align="justify">
|
33 |
+
<?php _wsl_e("On this section you can fully customize <b>WordPress Social Login Widget</b> and define the way you want it to look and behave", 'wordpress-social-login') ?>.
|
34 |
+
</p>
|
35 |
+
|
36 |
+
<p style="margin:10px;font-size: 13px;" align="justify">
|
37 |
+
<?php _wsl_e("<b>WordPress Social Login Widget</b> will be generated into the comments, login and register forms enabling your website vistors and customers to login via social networks", 'wordpress-social-login') ?>.
|
38 |
+
</p>
|
39 |
+
|
40 |
+
<p style="margin:10px;">
|
41 |
+
<?php _wsl_e("If this widget does not show up on your custom theme or you want to add it somewhere else then refer to the next section", 'wordpress-social-login') ?>.
|
42 |
+
</p>
|
43 |
+
|
44 |
+
<h4 style="cursor: default;border-bottom:1px solid #ccc;"><?php _wsl_e("Custom integration", 'wordpress-social-login') ?></h4>
|
45 |
+
|
46 |
+
<p style="margin:10px;">
|
47 |
+
<?php _wsl_e("If you want to add the social login widget to another location in your theme, you can insert the following code in that location", 'wordpress-social-login') ?>:
|
48 |
+
<pre style="width: 380px;background-color: #FFFFE0;border:1px solid #E6DB55; border-radius: 3px;padding: 10px;margin-top:15px;margin-left:10px;"> <?php do_action( 'wordpress_social_login' ); ?> </pre>
|
49 |
+
<?php _wsl_e("Or, for posts and pages", 'wordpress-social-login') ?>:
|
50 |
+
<pre style="width: 380px;background-color: #EDEFF4;border:1px solid #6B84B4; border-radius: 3px;padding: 10px;margin-top:15px;margin-left:10px;">[wordpress_social_login]</pre>
|
51 |
+
</p>
|
52 |
+
|
53 |
+
<p style="margin:10px;">
|
54 |
+
<?php _wsl_e('<b>[wordpress_social_login]</b> shortcode can be used in combination with <a href="http://wordpress.org/extend/plugins/html-javascript-adder/" target="_blank">HTML Javascript Adder</a> plugin to be add WSL Widget to your website sidebar', 'wordpress-social-login') ?>.
|
55 |
+
</p>
|
56 |
+
|
57 |
+
<p style="margin:10px;">
|
58 |
+
<?php _wsl_e('Also, if you are a developer or designer then you can customize it to your heart\'s content. For more inofmation refer to <b><a href="http://hybridauth.sourceforge.net/wsl/customize.html" target="_blank">User Guide</a></b>', 'wordpress-social-login') ?>.
|
59 |
+
</p>
|
60 |
+
|
61 |
+
<h4 style="cursor: default;border-bottom:1px solid #ccc;"><?php _wsl_e("Widget preview", 'wordpress-social-login') ?></h4>
|
62 |
+
|
63 |
+
<p style="margin:10px;">
|
64 |
+
<?php _wsl_e("This is a preview of what should be on the comments area", 'wordpress-social-login') ?>.
|
65 |
+
<strong><?php _wsl_e("Do not test it here", 'wordpress-social-login') ?></strong>!
|
66 |
+
</p>
|
67 |
+
|
68 |
+
<div style="width: 380px;background-color: #FFEBE8;border:1px solid #CC0000; border-radius: 3px;padding: 10px;margin-left:10px;">
|
69 |
+
<?php wsl_render_login_form(); ?>
|
70 |
+
</div>
|
71 |
+
</div>
|
72 |
+
</div>
|
73 |
+
</div>
|
74 |
+
</div>
|
75 |
+
</div>
|
76 |
+
</div>
|
77 |
+
<?php
|
78 |
+
// HOOKABLE:
|
79 |
+
do_action( "wsl_component_loginwidget_sidebar_end" );
|
80 |
+
}
|
81 |
+
|
82 |
+
// --------------------------------------------------------------------
|
includes/admin/components/networks/index.php
ADDED
@@ -0,0 +1,65 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/*!
|
3 |
+
* WordPress Social Login
|
4 |
+
*
|
5 |
+
* http://hybridauth.sourceforge.net/wsl/index.html | http://github.com/hybridauth/WordPress-Social-Login
|
6 |
+
* (c) 2011-2013 Mohamed Mrassi and contributors | http://wordpress.org/extend/plugins/wordpress-social-login/
|
7 |
+
*/
|
8 |
+
|
9 |
+
/**
|
10 |
+
* Social networks configuration and setup
|
11 |
+
*/
|
12 |
+
|
13 |
+
// Exit if accessed directly
|
14 |
+
if ( !defined( 'ABSPATH' ) ) exit;
|
15 |
+
|
16 |
+
// --------------------------------------------------------------------
|
17 |
+
|
18 |
+
function wsl_component_networks()
|
19 |
+
{
|
20 |
+
// HOOKABLE:
|
21 |
+
do_action( "wsl_component_networks_start" );
|
22 |
+
|
23 |
+
include "wsl.components.networks.setup.php";
|
24 |
+
include "wsl.components.networks.addmore.php";
|
25 |
+
include "wsl.components.networks.whyhello.php";
|
26 |
+
include "wsl.components.networks.basicinsights.php";
|
27 |
+
|
28 |
+
wsl_admin_welcome_panel();
|
29 |
+
?>
|
30 |
+
<form method="post" id="wsl_setup_form" action="options.php">
|
31 |
+
<?php settings_fields( 'wsl-settings-group' ); ?>
|
32 |
+
|
33 |
+
<div class="metabox-holder columns-2" id="post-body">
|
34 |
+
<table width="100%">
|
35 |
+
<tr valign="top">
|
36 |
+
<td>
|
37 |
+
<div id="post-body-content">
|
38 |
+
<?php
|
39 |
+
wsl_component_networks_setup();
|
40 |
+
?>
|
41 |
+
<a name="wslsettings"></a>
|
42 |
+
</div>
|
43 |
+
</td>
|
44 |
+
<td width="10"></td>
|
45 |
+
<td width="400">
|
46 |
+
<?php
|
47 |
+
wsl_component_networks_whyhello();
|
48 |
+
|
49 |
+
wsl_component_networks_addmore();
|
50 |
+
|
51 |
+
wsl_component_networks_basicinsights();
|
52 |
+
?>
|
53 |
+
</td>
|
54 |
+
</tr>
|
55 |
+
</table>
|
56 |
+
</div>
|
57 |
+
</form>
|
58 |
+
<?php
|
59 |
+
// HOOKABLE:
|
60 |
+
do_action( "wsl_component_networks_end" );
|
61 |
+
}
|
62 |
+
|
63 |
+
wsl_component_networks();
|
64 |
+
|
65 |
+
// --------------------------------------------------------------------
|
includes/admin/components/networks/wsl.components.networks.addmore.php
ADDED
@@ -0,0 +1,69 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/*!
|
3 |
+
* WordPress Social Login
|
4 |
+
*
|
5 |
+
* http://hybridauth.sourceforge.net/wsl/index.html | http://github.com/hybridauth/WordPress-Social-Login
|
6 |
+
* (c) 2011-2013 Mohamed Mrassi and contributors | http://wordpress.org/extend/plugins/wordpress-social-login/
|
7 |
+
*/
|
8 |
+
|
9 |
+
// Exit if accessed directly
|
10 |
+
if ( !defined( 'ABSPATH' ) ) exit;
|
11 |
+
|
12 |
+
// --------------------------------------------------------------------
|
13 |
+
|
14 |
+
function wsl_component_networks_addmore()
|
15 |
+
{
|
16 |
+
// HOOKABLE:
|
17 |
+
do_action( "wsl_component_networks_addmore_start" );
|
18 |
+
|
19 |
+
GLOBAL $WORDPRESS_SOCIAL_LOGIN_PROVIDERS_CONFIG;
|
20 |
+
?>
|
21 |
+
<div class="postbox " id="linksubmitdiv">
|
22 |
+
<div class="inside">
|
23 |
+
<div id="submitlink" class="submitbox"> <h3 style="cursor: default;"><?php _wsl_e("Add more providers", 'wordpress-social-login') ?></h3>
|
24 |
+
|
25 |
+
|
26 |
+
<table width="100%" border="0">
|
27 |
+
<tr>
|
28 |
+
<td align="left">
|
29 |
+
<p><?php _wsl_e("And you could add even more of them, <b>Just Click</b> and we will guide you through", 'wordpress-social-login') ?> :</p>
|
30 |
+
<?php
|
31 |
+
$assets_base_url = WORDPRESS_SOCIAL_LOGIN_PLUGIN_URL . '/assets/img/32x32/icondock/';
|
32 |
+
|
33 |
+
$nb_used = count( $WORDPRESS_SOCIAL_LOGIN_PROVIDERS_CONFIG );
|
34 |
+
foreach( $WORDPRESS_SOCIAL_LOGIN_PROVIDERS_CONFIG AS $item ){
|
35 |
+
$provider_id = @ $item["provider_id"];
|
36 |
+
$provider_name = @ $item["provider_name"];
|
37 |
+
$provider_cat = @ $item["cat"];
|
38 |
+
|
39 |
+
if( isset( $item["default_network"] ) && $item["default_network"] ){
|
40 |
+
continue;
|
41 |
+
}
|
42 |
+
|
43 |
+
if( ! get_option( 'wsl_settings_' . $provider_id . '_enabled' ) ){
|
44 |
+
?>
|
45 |
+
<a href="options-general.php?page=wordpress-social-login&wslp=networks&enable=<?php echo $provider_id ?>#setup<?php echo strtolower( $provider_id ) ?>"><img src="<?php echo $assets_base_url . strtolower( $provider_id ) . '.png' ?>" alt="<?php echo $provider_name ?>" title="<?php echo $provider_name ?>" /></a>
|
46 |
+
<?php
|
47 |
+
|
48 |
+
$nb_used--;
|
49 |
+
}
|
50 |
+
}
|
51 |
+
|
52 |
+
if( $nb_used == count( $WORDPRESS_SOCIAL_LOGIN_PROVIDERS_CONFIG ) ){
|
53 |
+
_wsl_e("Well! none left.", 'wordpress-social-login');
|
54 |
+
}
|
55 |
+
?>
|
56 |
+
</td>
|
57 |
+
</tr>
|
58 |
+
</table>
|
59 |
+
|
60 |
+
</div>
|
61 |
+
</div>
|
62 |
+
</div>
|
63 |
+
|
64 |
+
<?php
|
65 |
+
// HOOKABLE:
|
66 |
+
do_action( "wsl_component_networks_addmore_end" );
|
67 |
+
}
|
68 |
+
|
69 |
+
// --------------------------------------------------------------------
|
includes/admin/components/networks/wsl.components.networks.basicinsights.php
ADDED
@@ -0,0 +1,154 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/*!
|
3 |
+
* WordPress Social Login
|
4 |
+
*
|
5 |
+
* http://hybridauth.sourceforge.net/wsl/index.html | http://github.com/hybridauth/WordPress-Social-Login
|
6 |
+
* (c) 2011-2013 Mohamed Mrassi and contributors | http://wordpress.org/extend/plugins/wordpress-social-login/
|
7 |
+
*/
|
8 |
+
|
9 |
+
// Exit if accessed directly
|
10 |
+
if ( !defined( 'ABSPATH' ) ) exit;
|
11 |
+
|
12 |
+
// --------------------------------------------------------------------
|
13 |
+
|
14 |
+
function wsl_component_networks_basicinsights()
|
15 |
+
{
|
16 |
+
// HOOKABLE:
|
17 |
+
do_action( "wsl_component_networks_basicinsights_start" );
|
18 |
+
|
19 |
+
GLOBAL $wpdb;
|
20 |
+
|
21 |
+
$sql = "SELECT count( * ) as items FROM `{$wpdb->prefix}users`";
|
22 |
+
$rs1 = $wpdb->get_results( $sql );
|
23 |
+
|
24 |
+
$sql = "SELECT count( * ) as items FROM `{$wpdb->prefix}usermeta` where meta_key = 'wsl_user'";
|
25 |
+
$rs2 = $wpdb->get_results( $sql );
|
26 |
+
|
27 |
+
$total_users = (int) $rs1[0]->items;
|
28 |
+
$total_users_wsl = (int) $rs2[0]->items;
|
29 |
+
$users_conversion = ( 100 * $total_users_wsl ) / $total_users;
|
30 |
+
|
31 |
+
if( $total_users_wsl && wsl_is_component_enabled( "basicinsights" ) ){
|
32 |
+
?>
|
33 |
+
<div class="postbox " id="linksubmitdiv">
|
34 |
+
<div class="inside">
|
35 |
+
<div id="submitlink" class="submitbox">
|
36 |
+
<h3 style="cursor: default;"><?php _wsl_e("Insights", 'wordpress-social-login') ?></h3>
|
37 |
+
|
38 |
+
<div id="misc-publishing-actions">
|
39 |
+
<div style="padding:20px;padding-top:0px;">
|
40 |
+
<h4 style="border-bottom:1px solid #ccc"><?php _wsl_e("Conversions", 'wordpress-social-login') ?></h4>
|
41 |
+
<table width="90%">
|
42 |
+
<tr>
|
43 |
+
<td width="60%"><?php _wsl_e("WP users", 'wordpress-social-login') ?></td><td><?php echo $total_users; ?></td>
|
44 |
+
</tr>
|
45 |
+
<tr>
|
46 |
+
<td><?php _wsl_e("WSL users", 'wordpress-social-login') ?></td><td><?php echo $total_users_wsl; ?></td>
|
47 |
+
</tr>
|
48 |
+
<tr>
|
49 |
+
<td><?php _wsl_e("Conversions", 'wordpress-social-login') ?></td><td style="border-top:1px solid #ccc">+<b><?php echo number_format($users_conversion, 2, '.', ''); ?></b> %</td>
|
50 |
+
</tr>
|
51 |
+
</table>
|
52 |
+
<?php
|
53 |
+
$sql = "SELECT meta_value, count( * ) as items FROM `{$wpdb->prefix}usermeta` where meta_key = 'wsl_user' group by meta_value order by items desc ";
|
54 |
+
|
55 |
+
$rs1 = $wpdb->get_results( $sql );
|
56 |
+
|
57 |
+
$assets_base_url = WORDPRESS_SOCIAL_LOGIN_PLUGIN_URL . '/assets/img/16x16/';
|
58 |
+
?>
|
59 |
+
<h4 style="border-bottom:1px solid #ccc"><?php _wsl_e("By provider", 'wordpress-social-login') ?></h4>
|
60 |
+
<table width="90%">
|
61 |
+
<?php
|
62 |
+
foreach( $rs1 as $item ){
|
63 |
+
if( ! $item->meta_value ) $item->meta_value = "Unknown";
|
64 |
+
?>
|
65 |
+
<tr>
|
66 |
+
<td width="60%">
|
67 |
+
<img src="<?php echo $assets_base_url . strtolower( $item->meta_value ) . '.png' ?>" style="vertical-align:top;width:16px;height:16px;" /> <?php echo $item->meta_value; ?>
|
68 |
+
</td>
|
69 |
+
<td>
|
70 |
+
<?php echo $item->items; ?>
|
71 |
+
</td>
|
72 |
+
</tr>
|
73 |
+
<?php
|
74 |
+
}
|
75 |
+
?>
|
76 |
+
<tr>
|
77 |
+
<td align="right"> </td><td style="border-top:1px solid #ccc"><b><?php echo $total_users_wsl; ?></b> <?php _wsl_e("WSL users", 'wordpress-social-login') ?></td>
|
78 |
+
</tr>
|
79 |
+
</table>
|
80 |
+
<?php
|
81 |
+
$sql = "SELECT meta_value, count( * ) as items FROM `{$wpdb->prefix}usermeta` where meta_key = 'wsl_user_gender' group by meta_value order by items desc ";
|
82 |
+
|
83 |
+
$rs = $wpdb->get_results( $sql );
|
84 |
+
?>
|
85 |
+
<h4 style="border-bottom:1px solid #ccc"><?php _wsl_e("By gender", 'wordpress-social-login') ?></h4>
|
86 |
+
<table width="90%">
|
87 |
+
<?php
|
88 |
+
foreach( $rs as $item ){
|
89 |
+
if( ! $item->meta_value ) $item->meta_value = "Unknown";
|
90 |
+
?>
|
91 |
+
<tr>
|
92 |
+
<td width="60%">
|
93 |
+
<?php echo ucfirst( $item->meta_value ); ?>
|
94 |
+
</td>
|
95 |
+
<td>
|
96 |
+
<?php echo $item->items; ?>
|
97 |
+
</td>
|
98 |
+
</tr>
|
99 |
+
<?php
|
100 |
+
}
|
101 |
+
?>
|
102 |
+
</table>
|
103 |
+
<?php
|
104 |
+
$sql = "SELECT meta_value, count( * ) as items FROM `{$wpdb->prefix}usermeta` where meta_key = 'wsl_user_age' group by meta_value order by items desc limit 21";
|
105 |
+
|
106 |
+
$rs = $wpdb->get_results( $sql );
|
107 |
+
?>
|
108 |
+
<h4 style="border-bottom:1px solid #ccc"><?php _wsl_e("By age", 'wordpress-social-login') ?></h4>
|
109 |
+
<table width="90%">
|
110 |
+
<?php
|
111 |
+
$t_ages = 0;
|
112 |
+
$n_ages = 0;
|
113 |
+
|
114 |
+
foreach( $rs as $item ){
|
115 |
+
if( ! $item->meta_value ){
|
116 |
+
$item->meta_value = "Unknown";
|
117 |
+
}
|
118 |
+
else{
|
119 |
+
$t_ages += (int) $item->meta_value;
|
120 |
+
$n_ages++;
|
121 |
+
}
|
122 |
+
?>
|
123 |
+
<tr>
|
124 |
+
<td width="60%">
|
125 |
+
<?php echo $item->meta_value; ?>
|
126 |
+
</td>
|
127 |
+
<td>
|
128 |
+
<?php echo $item->items; ?>
|
129 |
+
</td>
|
130 |
+
</tr>
|
131 |
+
<?php
|
132 |
+
}
|
133 |
+
|
134 |
+
if( $n_ages ) $a_ages = $t_ages/$n_ages;
|
135 |
+
?>
|
136 |
+
</td>
|
137 |
+
</tr>
|
138 |
+
<tr>
|
139 |
+
<td align="right"> </td><td style="border-top:1px solid #ccc"><b><?php echo number_format($a_ages, 1, '.', ''); ?></b> <?php _wsl_e("yrs in average", 'wordpress-social-login') ?></td>
|
140 |
+
</tr>
|
141 |
+
</table>
|
142 |
+
</div>
|
143 |
+
</div>
|
144 |
+
</div>
|
145 |
+
</div>
|
146 |
+
</div>
|
147 |
+
<?php
|
148 |
+
}
|
149 |
+
|
150 |
+
// HOOKABLE:
|
151 |
+
do_action( "wsl_component_networks_basicinsights_end" );
|
152 |
+
}
|
153 |
+
|
154 |
+
// --------------------------------------------------------------------
|
includes/admin/components/networks/wsl.components.networks.setup.php
ADDED
@@ -0,0 +1,277 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/*!
|
3 |
+
* WordPress Social Login
|
4 |
+
*
|
5 |
+
* http://hybridauth.sourceforge.net/wsl/index.html | http://github.com/hybridauth/WordPress-Social-Login
|
6 |
+
* (c) 2011-2013 Mohamed Mrassi and contributors | http://wordpress.org/extend/plugins/wordpress-social-login/
|
7 |
+
*/
|
8 |
+
|
9 |
+
/**
|
10 |
+
* Social networks configuration and setup
|
11 |
+
*/
|
12 |
+
|
13 |
+
// Exit if accessed directly
|
14 |
+
if ( !defined( 'ABSPATH' ) ) exit;
|
15 |
+
|
16 |
+
// --------------------------------------------------------------------
|
17 |
+
|
18 |
+
function wsl_component_networks_setup()
|
19 |
+
{
|
20 |
+
// HOOKABLE:
|
21 |
+
do_action( "wsl_component_networks_setup_start" );
|
22 |
+
|
23 |
+
GLOBAL $wpdb;
|
24 |
+
GLOBAL $WORDPRESS_SOCIAL_LOGIN_PROVIDERS_CONFIG;
|
25 |
+
|
26 |
+
if( isset( $_REQUEST["enable"] ) && $_REQUEST["enable"] ){
|
27 |
+
$provider_id = $_REQUEST["enable"];
|
28 |
+
|
29 |
+
update_option( 'wsl_settings_' . $provider_id . '_enabled', 1 );
|
30 |
+
}
|
31 |
+
?>
|
32 |
+
<script>
|
33 |
+
function toggleproviderkeys(idp){
|
34 |
+
if(typeof jQuery=="undefined"){
|
35 |
+
alert( "Error: WordPress Social Login require jQuery to be installed on your wordpress in order to work!" );
|
36 |
+
|
37 |
+
return;
|
38 |
+
}
|
39 |
+
|
40 |
+
if(jQuery('#wsl_settings_' + idp + '_enabled').val()==1){
|
41 |
+
jQuery('.wsl_tr_settings_' + idp).show();
|
42 |
+
}
|
43 |
+
else{
|
44 |
+
jQuery('.wsl_tr_settings_' + idp).hide();
|
45 |
+
jQuery('.wsl_div_settings_help_' + idp).hide();
|
46 |
+
}
|
47 |
+
|
48 |
+
return false;
|
49 |
+
}
|
50 |
+
|
51 |
+
function toggleproviderhelp(idp){
|
52 |
+
if(typeof jQuery=="undefined"){
|
53 |
+
alert( "Error: WordPress Social Login require jQuery to be installed on your wordpress in order to work!" );
|
54 |
+
|
55 |
+
return false;
|
56 |
+
}
|
57 |
+
|
58 |
+
jQuery('.wsl_div_settings_help_' + idp).show();
|
59 |
+
|
60 |
+
return false;
|
61 |
+
}
|
62 |
+
</script>
|
63 |
+
<?php
|
64 |
+
$nbprovider = 0;
|
65 |
+
|
66 |
+
$assets_base_url = WORDPRESS_SOCIAL_LOGIN_PLUGIN_URL . '/assets/img/16x16/';
|
67 |
+
|
68 |
+
foreach( $WORDPRESS_SOCIAL_LOGIN_PROVIDERS_CONFIG AS $item ):
|
69 |
+
$provider_id = @ $item["provider_id"];
|
70 |
+
$provider_name = @ $item["provider_name"];
|
71 |
+
|
72 |
+
$require_client_id = @ $item["require_client_id"];
|
73 |
+
$provide_email = @ $item["provide_email"];
|
74 |
+
|
75 |
+
$provider_new_app_link = @ $item["new_app_link"];
|
76 |
+
$provider_userguide_section = @ $item["userguide_section"];
|
77 |
+
|
78 |
+
$provider_callback_url = "" ;
|
79 |
+
|
80 |
+
if( ! ( ( isset( $item["default_network"] ) && $item["default_network"] ) || get_option( 'wsl_settings_' . $provider_id . '_enabled' ) ) ){
|
81 |
+
continue;
|
82 |
+
}
|
83 |
+
|
84 |
+
// default endpoint_url
|
85 |
+
$endpoint_url = WORDPRESS_SOCIAL_LOGIN_HYBRIDAUTH_ENDPOINT_URL;
|
86 |
+
|
87 |
+
// overwrite endpoint_url if need'd
|
88 |
+
if( get_option( 'wsl_settings_base_url' ) ){
|
89 |
+
$endpoint_url = strtolower( get_option( 'wsl_settings_base_url' ) . '/hybridauth/' );
|
90 |
+
}
|
91 |
+
|
92 |
+
if( isset( $item["callback"] ) && $item["callback"] ){
|
93 |
+
$provider_callback_url = '<span style="color:green">' . $endpoint_url . '?hauth.done=' . $provider_id . '</span>';
|
94 |
+
}
|
95 |
+
|
96 |
+
$setupsteps = 0;
|
97 |
+
?>
|
98 |
+
<a name="setup<?php echo strtolower( $provider_id ) ?>"></a>
|
99 |
+
<div class="stuffbox" id="namediv">
|
100 |
+
<h3>
|
101 |
+
<label for="name" class="wp-neworks-label">
|
102 |
+
<img alt="<?php echo $provider_name ?>" title="<?php echo $provider_name ?>" src="<?php echo $assets_base_url . strtolower( $provider_id ) . '.png' ?>" style="vertical-align: top;width:16px;height:16px;" /> <?php echo $provider_name ?>
|
103 |
+
</label>
|
104 |
+
</h3>
|
105 |
+
<div class="inside">
|
106 |
+
<table class="form-table editcomment">
|
107 |
+
<tbody>
|
108 |
+
<tr>
|
109 |
+
<td style="width:110px"><?php _wsl_e("Enabled", 'wordpress-social-login') ?>:</td>
|
110 |
+
<td>
|
111 |
+
<select
|
112 |
+
name="<?php echo 'wsl_settings_' . $provider_id . '_enabled' ?>"
|
113 |
+
id="<?php echo 'wsl_settings_' . $provider_id . '_enabled' ?>"
|
114 |
+
onChange="toggleproviderkeys('<?php echo $provider_id; ?>')"
|
115 |
+
>
|
116 |
+
<option value="1" <?php if( get_option( 'wsl_settings_' . $provider_id . '_enabled' ) ) echo "selected"; ?> >Yes</option>
|
117 |
+
<option value="0" <?php if( ! get_option( 'wsl_settings_' . $provider_id . '_enabled' ) ) echo "selected"; ?> >No</option>
|
118 |
+
</select>
|
119 |
+
</td>
|
120 |
+
<td style="width:140px"> </td>
|
121 |
+
</tr>
|
122 |
+
|
123 |
+
<?php if ( $provider_new_app_link ){ ?>
|
124 |
+
<?php if ( $require_client_id ){ // key or id ? ?>
|
125 |
+
<tr valign="top" <?php if( ! get_option( 'wsl_settings_' . $provider_id . '_enabled' ) ) echo 'style="display:none"'; ?> class="wsl_tr_settings_<?php echo $provider_id; ?>" >
|
126 |
+
<td><?php _wsl_e("Application ID", 'wordpress-social-login') ?>:</td>
|
127 |
+
<td><input type="text" name="<?php echo 'wsl_settings_' . $provider_id . '_app_id' ?>" value="<?php echo get_option( 'wsl_settings_' . $provider_id . '_app_id' ); ?>" ></td>
|
128 |
+
<td><a href="javascript:void(0)" onClick="toggleproviderhelp('<?php echo $provider_id; ?>')"><?php _wsl_e("Where do I get this info?", 'wordpress-social-login') ?></a></td>
|
129 |
+
</tr>
|
130 |
+
<?php } else { ?>
|
131 |
+
<tr valign="top" <?php if( ! get_option( 'wsl_settings_' . $provider_id . '_enabled' ) ) echo 'style="display:none"'; ?> class="wsl_tr_settings_<?php echo $provider_id; ?>" >
|
132 |
+
<td><?php _wsl_e("Application Key", 'wordpress-social-login') ?>:</td>
|
133 |
+
<td><input type="text" name="<?php echo 'wsl_settings_' . $provider_id . '_app_key' ?>" value="<?php echo get_option( 'wsl_settings_' . $provider_id . '_app_key' ); ?>" ></td>
|
134 |
+
<td><a href="javascript:void(0)" onClick="toggleproviderhelp('<?php echo $provider_id; ?>')"><?php _wsl_e("Where do I get this info?", 'wordpress-social-login') ?></a></td>
|
135 |
+
</tr>
|
136 |
+
<?php }; ?>
|
137 |
+
<tr valign="top" <?php if( ! get_option( 'wsl_settings_' . $provider_id . '_enabled' ) ) echo 'style="display:none"'; ?> class="wsl_tr_settings_<?php echo $provider_id; ?>" >
|
138 |
+
<td><?php _wsl_e("Application Secret", 'wordpress-social-login') ?>:</td>
|
139 |
+
<td><input type="text" name="<?php echo 'wsl_settings_' . $provider_id . '_app_secret' ?>" value="<?php echo get_option( 'wsl_settings_' . $provider_id . '_app_secret' ); ?>" ></td>
|
140 |
+
<td><a href="javascript:void(0)" onClick="toggleproviderhelp('<?php echo $provider_id; ?>')"><?php _wsl_e("Where do I get this info?", 'wordpress-social-login') ?></a></td>
|
141 |
+
</tr>
|
142 |
+
<?php } // if require registration ?>
|
143 |
+
</tbody>
|
144 |
+
</table>
|
145 |
+
<?php if ( in_array( $provider_id, array( "Twitter", "Identica", "Tumblr", "Goodreads", "500px", "Vkontakte", "Gowalla", "Steam" ) ) ) : ?>
|
146 |
+
<br />
|
147 |
+
<hr />
|
148 |
+
<p style="margin-left:12px;margin-bottom:0px;">
|
149 |
+
<b style="color:#CB4B16;"><?php _wsl_e("Note", 'wordpress-social-login') ?>:</b>
|
150 |
+
|
151 |
+
<?php echo sprintf( _wsl__("<b>%s</b> do not provide their user's email address and by default a random email will then be generated for them instead", 'wordpress-social-login'), $provider_name ) ?>.
|
152 |
+
|
153 |
+
<?php _wsl_e('To change this behaviour and to force new registered users to provide their emails before they get in, goto <b><a href="options-general.php?page=wordpress-social-login&wslp=bouncer">Bouncer</a></b> and enable <b>Profile Completion</b>', 'wordpress-social-login') ?>.
|
154 |
+
</p>
|
155 |
+
<?php endif; ?>
|
156 |
+
<br />
|
157 |
+
<div
|
158 |
+
class="wsl_div_settings_help_<?php echo $provider_id; ?>"
|
159 |
+
style="<?php if( isset( $_REQUEST["enable"] ) && ! isset( $_REQUEST["settings-updated"] ) && $_REQUEST["enable"] == $provider_id ) echo "-"; // <= lolz ?>display:none;"
|
160 |
+
>
|
161 |
+
<hr class="wsl" />
|
162 |
+
<?php if ( $provider_new_app_link ) : ?>
|
163 |
+
<?php _wsl_e('<span style="color:#CB4B16;">Application</span> id and secret (also sometimes referred as <span style="color:#CB4B16;">Customer</span> key and secret or <span style="color:#CB4B16;">Client</span> id and secret) are what we call an application credentials', 'wordpress-social-login') ?>.
|
164 |
+
|
165 |
+
<?php echo sprintf( _wsl__( 'This application will link your website <code>%s</code> to <code>%s API</code> and these credentials are needed in order for <b>%s</b> users to access your website', 'wordpress-social-login'), $_SERVER["SERVER_NAME"], $provider_name, $provider_name ) ?>.
|
166 |
+
<br />
|
167 |
+
|
168 |
+
<?php _wsl_e("These credentials may also differ in format, name and content depending on the social network.", 'wordpress-social-login') ?>
|
169 |
+
<br />
|
170 |
+
<br />
|
171 |
+
|
172 |
+
<?php echo sprintf( _wsl__('To enable authentication with this provider and to register a new <b>%s API Application</b>, carefully follow the steps', 'wordpress-social-login'), $provider_name ) ?>
|
173 |
+
:<br />
|
174 |
+
<?php else: ?>
|
175 |
+
<p><?php echo sprintf( _wsl__('<b>Done.</b> Nothing more required for <b>%s</b>', 'wordpress-social-login'), $provider_name) ?>.</p>
|
176 |
+
<?php endif; ?>
|
177 |
+
<div class="wsl_div_settings_help_<?php echo $provider_id; ?>" style="margin-left:40px;">
|
178 |
+
<?php if ( $provider_new_app_link ) : ?>
|
179 |
+
<p><?php echo "<b>" . ++$setupsteps . "</b>." ?> Go to <a href="<?php echo $provider_new_app_link ?>" target ="_blanck"><?php echo $provider_new_app_link ?></a> and <b>create a new application</b>.</p>
|
180 |
+
|
181 |
+
<?php if ( $provider_id == "Google" ) : ?>
|
182 |
+
<p><?php echo "<b>" . ++$setupsteps . "</b>." ?> On the <b>Dashboard sidebar</b> click on <b>API Access</b> then Click <em style="color:#CB4B16;">"Create an OAuth 2.0 client ID..."</em>.</p>
|
183 |
+
<?php endif; ?>
|
184 |
+
|
185 |
+
<?php if ( $provider_id == "Google" ) : ?>
|
186 |
+
</p>
|
187 |
+
<p><?php echo "<b>" . ++$setupsteps . "</b>." ?> On the <b>"Create Client ID"</b> popup :
|
188 |
+
<br /> - Enter a product name (the name of your website will do).
|
189 |
+
<br /> - Enter the URL for a logo if you like.
|
190 |
+
<br /> - Click Next.
|
191 |
+
<br /> - Select <em style="color:#CB4B16;">"Web application"</em> as the application type.
|
192 |
+
<br /> - Then switch to advanced settings by clicking on <b>(more options)</b>
|
193 |
+
.</p>
|
194 |
+
<?php else: ?>
|
195 |
+
<p><?php echo "<b>" . ++$setupsteps . "</b>." ?> Fill out any required fields such as the application name and description.</p>
|
196 |
+
<?php endif; ?>
|
197 |
+
|
198 |
+
<?php if ( $provider_callback_url ) : ?>
|
199 |
+
<p>
|
200 |
+
<?php echo "<b>" . ++$setupsteps . "</b>." ?> Provide this URL as the <b>Callback URL</b> for your application:
|
201 |
+
<br />
|
202 |
+
<?php echo $provider_callback_url ?>
|
203 |
+
</p>
|
204 |
+
<?php endif; ?>
|
205 |
+
|
206 |
+
<?php if ( $provider_id == "MySpace" ) : ?>
|
207 |
+
<p><?php echo "<b>" . ++$setupsteps . "</b>." ?> Put your website domain in the <b>External Url</b> and <b>External Callback Validation</b> fields. This should match with the current hostname <em style="color:#CB4B16;"><?php echo $_SERVER["SERVER_NAME"] ?></em>.</p>
|
208 |
+
<?php endif; ?>
|
209 |
+
|
210 |
+
<?php if ( $provider_id == "Live" ) : ?>
|
211 |
+
<p><?php echo "<b>" . ++$setupsteps . "</b>." ?> Put your website domain in the <b>Redirect Domain</b> field. This should match with the current hostname <em style="color:#CB4B16;"><?php echo $_SERVER["SERVER_NAME"] ?></em>.</p>
|
212 |
+
<?php endif; ?>
|
213 |
+
|
214 |
+
<?php if ( $provider_id == "Facebook" ) : ?>
|
215 |
+
<p><?php echo "<b>" . ++$setupsteps . "</b>." ?> Put your website domain in the <b>Site Url</b> field. This should match with the current hostname <em style="color:#CB4B16;"><?php echo $_SERVER["SERVER_NAME"] ?></em>.</p>
|
216 |
+
<?php endif; ?>
|
217 |
+
|
218 |
+
<?php if ( $provider_id == "LinkedIn" ) : ?>
|
219 |
+
<p><?php echo "<b>" . ++$setupsteps . "</b>." ?> Put your website domain in the <b>Integration URL</b> field. This should match with the current hostname <em style="color:#CB4B16;"><?php echo $_SERVER["SERVER_NAME"] ?></em>.</p>
|
220 |
+
<p><?php echo "<b>" . ++$setupsteps . "</b>." ?> Set the <b>Application Type</b> to <em style="color:#CB4B16;">Web Application</em>.</p>
|
221 |
+
<?php endif; ?>
|
222 |
+
|
223 |
+
<?php if ( $provider_id == "Twitter" ) : ?>
|
224 |
+
<p><?php echo "<b>" . ++$setupsteps . "</b>." ?> Put your website domain in the <b>Application Website</b> and <b>Application Callback URL</b> fields. This should match with the current hostname <em style="color:#CB4B16;"><?php echo $_SERVER["SERVER_NAME"] ?></em>.</p>
|
225 |
+
<?php endif; ?>
|
226 |
+
|
227 |
+
<p><?php echo "<b>" . ++$setupsteps . "</b>." ?> Once you have registered, copy and past the created application credentials into this setup page.</p>
|
228 |
+
<?php endif; ?>
|
229 |
+
|
230 |
+
<?php if ( $provider_id == "Facebook" ) : ?>
|
231 |
+
<hr />
|
232 |
+
<table style="text-align: center;margin-bottom:12px;">
|
233 |
+
<td><a class="span4 thumbnail" href="http://hybridauth.sf.net/userguide/img/setup/facebook/1.png" target="_blank"><img src="http://hybridauth.sf.net/userguide/img/setup/facebook/1.png"></a></td>
|
234 |
+
<td><a class="span4 thumbnail" href="http://hybridauth.sf.net/userguide/img/setup/facebook/2.png" target="_blank"><img src="http://hybridauth.sf.net/userguide/img/setup/facebook/2.png"></a></td>
|
235 |
+
<td><a class="span4 thumbnail" href="http://hybridauth.sf.net/userguide/img/setup/facebook/3.png" target="_blank"><img src="http://hybridauth.sf.net/userguide/img/setup/facebook/3.png"></a></td>
|
236 |
+
</table>
|
237 |
+
<hr />
|
238 |
+
<?php endif; ?>
|
239 |
+
<?php if ( $provider_id == "Google" ) : ?>
|
240 |
+
<hr />
|
241 |
+
<table style="text-align: center;margin-bottom:12px;">
|
242 |
+
<td><a class="span4 thumbnail" href="http://hybridauth.sf.net/userguide/img/setup/google/1.png" target="_blank"><img src="http://hybridauth.sf.net/userguide/img/setup/google/1.png"></a></td>
|
243 |
+
<td><a class="span4 thumbnail" href="http://hybridauth.sf.net/userguide/img/setup/google/2.png" target="_blank"><img src="http://hybridauth.sf.net/userguide/img/setup/google/2.png"></a></td>
|
244 |
+
<td><a class="span4 thumbnail" href="http://hybridauth.sf.net/userguide/img/setup/google/3.png" target="_blank"><img src="http://hybridauth.sf.net/userguide/img/setup/google/3.png"></a></td>
|
245 |
+
</table>
|
246 |
+
<hr />
|
247 |
+
<?php endif; ?>
|
248 |
+
<?php if ( $provider_id == "Twitter" ) : ?>
|
249 |
+
<hr />
|
250 |
+
<table style="text-align: center;margin-bottom:12px;">
|
251 |
+
<td><a class="span4 thumbnail" href="http://hybridauth.sf.net/userguide/img/setup/twitter/1.png" target="_blank"><img src="http://hybridauth.sf.net/userguide/img/setup/twitter/1.png"></a></td>
|
252 |
+
<td><a class="span4 thumbnail" href="http://hybridauth.sf.net/userguide/img/setup/twitter/2.png" target="_blank"><img src="http://hybridauth.sf.net/userguide/img/setup/twitter/2.png"></a></td>
|
253 |
+
<td><a class="span4 thumbnail" href="http://hybridauth.sf.net/userguide/img/setup/twitter/3.png" target="_blank"><img src="http://hybridauth.sf.net/userguide/img/setup/twitter/3.png"></a></td>
|
254 |
+
</table>
|
255 |
+
<hr />
|
256 |
+
<?php endif; ?>
|
257 |
+
<?php if ( $provider_new_app_link ) : ?>
|
258 |
+
<p>
|
259 |
+
<b><?php _wsl_e("And that's it!", 'wordpress-social-login') ?></b>
|
260 |
+
<br />
|
261 |
+
<?php echo sprintf( _wsl__( 'If for some reason you still can\'t figure it out, first try to a) <a class="button-primary" href="https://www.google.com/search?q=%s API create application" target="_blank">Google it</a>, then check it on b) <a class="button-primary" href="http://www.youtube.com/results?search_query=%s API create application " target="_blank">Youtube</a> and if nothing works c) <a class="button-primary" href="options-general.php?page=wordpress-social-login&wslp=help">ask for support</a>', 'wordpress-social-login'), $provider_name, $provider_name ) ?>.
|
262 |
+
</p>
|
263 |
+
<?php endif; ?>
|
264 |
+
</div>
|
265 |
+
</div>
|
266 |
+
</div>
|
267 |
+
</div>
|
268 |
+
<?php
|
269 |
+
endforeach;
|
270 |
+
?>
|
271 |
+
<input type="submit" class="button-primary" value="<?php _wsl_e("Save Settings", 'wordpress-social-login') ?>" />
|
272 |
+
<?php
|
273 |
+
// HOOKABLE:
|
274 |
+
do_action( "wsl_component_networks_setup_end" );
|
275 |
+
}
|
276 |
+
|
277 |
+
// --------------------------------------------------------------------
|
includes/admin/components/networks/wsl.components.networks.whyhello.php
ADDED
@@ -0,0 +1,52 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/*!
|
3 |
+
* WordPress Social Login
|
4 |
+
*
|
5 |
+
* http://hybridauth.sourceforge.net/wsl/index.html | http://github.com/hybridauth/WordPress-Social-Login
|
6 |
+
* (c) 2011-2013 Mohamed Mrassi and contributors | http://wordpress.org/extend/plugins/wordpress-social-login/
|
7 |
+
*/
|
8 |
+
|
9 |
+
// Exit if accessed directly
|
10 |
+
if ( !defined( 'ABSPATH' ) ) exit;
|
11 |
+
|
12 |
+
// --------------------------------------------------------------------
|
13 |
+
|
14 |
+
function wsl_component_networks_whyhello()
|
15 |
+
{
|
16 |
+
// HOOKABLE:
|
17 |
+
do_action( "wsl_component_networks_whyhello_start" );
|
18 |
+
?>
|
19 |
+
<div class="postbox " id="linksubmitdiv">
|
20 |
+
<div class="inside">
|
21 |
+
<div id="submitlink" class="submitbox"> <h3 style="cursor: default;"><?php _wsl_e("Why, hello there", 'wordpress-social-login') ?></h3>
|
22 |
+
<div id="minor-publishing">
|
23 |
+
|
24 |
+
<div style="display:none;"><input type="submit" value="Save" class="button" id="save" name="save"></div>
|
25 |
+
|
26 |
+
<div id="misc-publishing-actions">
|
27 |
+
<div class="misc-pub-section">
|
28 |
+
<p style="line-height: 19px;font-size: 13px;" align="justify">
|
29 |
+
<?php _wsl_e('If you are still new to things, we recommend that you read the <b><a href="http://hybridauth.sourceforge.net/wsl/index.html" target="_blank">Plugin User Guide</a></b> and to make sure your server settings meet this <b><a href="options-general.php?page=wordpress-social-login&wslp=diagnostics">Plugin Requirements</a></b>', 'wordpress-social-login') ?>.
|
30 |
+
</p>
|
31 |
+
<p style="line-height: 19px;" align="justify">
|
32 |
+
<?php _wsl_e('If you run into any issue then refer to <b><a href="options-general.php?page=wordpress-social-login&wslp=help">Help & Support</a></b> to konw how to reach me', 'wordpress-social-login') ?>.
|
33 |
+
</p>
|
34 |
+
</div>
|
35 |
+
</div>
|
36 |
+
</div>
|
37 |
+
|
38 |
+
<div id="major-publishing-actions">
|
39 |
+
<div id="publishing-action">
|
40 |
+
<input type="submit" value="<?php _wsl_e('Save Settings', 'wordpress-social-login') ?>" class="button-large button-primary" name="save" >
|
41 |
+
</div>
|
42 |
+
<div class="clear"></div>
|
43 |
+
</div>
|
44 |
+
</div>
|
45 |
+
</div>
|
46 |
+
</div>
|
47 |
+
<?php
|
48 |
+
// HOOKABLE:
|
49 |
+
do_action( "wsl_component_networks_whyhello_end" );
|
50 |
+
}
|
51 |
+
|
52 |
+
// --------------------------------------------------------------------
|
includes/admin/components/users/index.php
ADDED
@@ -0,0 +1,41 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/*!
|
3 |
+
* WordPress Social Login
|
4 |
+
*
|
5 |
+
* http://hybridauth.sourceforge.net/wsl/index.html | http://github.com/hybridauth/WordPress-Social-Login
|
6 |
+
* (c) 2011-2013 Mohamed Mrassi and contributors | http://wordpress.org/extend/plugins/wordpress-social-login/
|
7 |
+
*/
|
8 |
+
|
9 |
+
/**
|
10 |
+
* Wannabe Users Manager module
|
11 |
+
*/
|
12 |
+
|
13 |
+
// Exit if accessed directly
|
14 |
+
if ( !defined( 'ABSPATH' ) ) exit;
|
15 |
+
|
16 |
+
// --------------------------------------------------------------------
|
17 |
+
|
18 |
+
function wsl_component_users()
|
19 |
+
{
|
20 |
+
// HOOKABLE:
|
21 |
+
do_action( "wsl_component_users_start" );
|
22 |
+
|
23 |
+
include "wsl.components.users.list.php";
|
24 |
+
include "wsl.components.users.profile.php";
|
25 |
+
|
26 |
+
if( isset( $_REQUEST["uid"] ) && $_REQUEST["uid"] ){
|
27 |
+
$user_id = (int) $_REQUEST["uid"];
|
28 |
+
|
29 |
+
wsl_component_users_profile( $user_id );
|
30 |
+
}
|
31 |
+
else{
|
32 |
+
wsl_component_users_list();
|
33 |
+
}
|
34 |
+
|
35 |
+
// HOOKABLE:
|
36 |
+
do_action( "wsl_component_users_end" );
|
37 |
+
}
|
38 |
+
|
39 |
+
wsl_component_users();
|
40 |
+
|
41 |
+
// --------------------------------------------------------------------
|
includes/admin/components/users/wsl.components.users.list.php
ADDED
@@ -0,0 +1,137 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/*!
|
3 |
+
* WordPress Social Login
|
4 |
+
*
|
5 |
+
* http://hybridauth.sourceforge.net/wsl/index.html | http://github.com/hybridauth/WordPress-Social-Login
|
6 |
+
* (c) 2011-2013 Mohamed Mrassi and contributors | http://wordpress.org/extend/plugins/wordpress-social-login/
|
7 |
+
*/
|
8 |
+
|
9 |
+
// Exit if accessed directly
|
10 |
+
if ( !defined( 'ABSPATH' ) ) exit;
|
11 |
+
|
12 |
+
// --------------------------------------------------------------------
|
13 |
+
|
14 |
+
function wsl_component_users_list()
|
15 |
+
{
|
16 |
+
// HOOKABLE:
|
17 |
+
do_action( "wsl_component_users_list_start" );
|
18 |
+
|
19 |
+
GLOBAL $wpdb;
|
20 |
+
|
21 |
+
$assets_base_url = WORDPRESS_SOCIAL_LOGIN_PLUGIN_URL . '/assets/img/16x16/';
|
22 |
+
|
23 |
+
$sql = "SELECT meta_value, user_id FROM `{$wpdb->prefix}usermeta` where meta_key = 'wsl_user'";
|
24 |
+
$rs1 = $wpdb->get_results( $sql );
|
25 |
+
?>
|
26 |
+
<div style="margin-top:20px;">
|
27 |
+
<table cellspacing="0" class="wp-list-table widefat fixed users">
|
28 |
+
<thead>
|
29 |
+
<tr>
|
30 |
+
<th width="100"><span><?php _wsl_e("Providers", 'wordpress-social-login') ?></span></th>
|
31 |
+
<th><span><?php _wsl_e("Username", 'wordpress-social-login') ?></span></th>
|
32 |
+
<th><span><?php _wsl_e("Full Name", 'wordpress-social-login') ?></span></th>
|
33 |
+
<th><span><?php _wsl_e("E-mail", 'wordpress-social-login') ?></span></th>
|
34 |
+
<th><span><?php _wsl_e("Profile URL", 'wordpress-social-login') ?></span></th>
|
35 |
+
<th width="60"><span><?php _wsl_e("Contacts", 'wordpress-social-login') ?></span></th>
|
36 |
+
<th width="140"><span><?php _wsl_e("Actions", 'wordpress-social-login') ?></span></th>
|
37 |
+
</tr>
|
38 |
+
</thead>
|
39 |
+
<tfoot>
|
40 |
+
<tr>
|
41 |
+
<th width="100"><span><?php _wsl_e("Providers", 'wordpress-social-login') ?></span></th>
|
42 |
+
<th><span><?php _wsl_e("Username", 'wordpress-social-login') ?></span></th>
|
43 |
+
<th><span><?php _wsl_e("Full Name", 'wordpress-social-login') ?></span></th>
|
44 |
+
<th><span><?php _wsl_e("E-mail", 'wordpress-social-login') ?></span></th>
|
45 |
+
<th><span><?php _wsl_e("Profile URL", 'wordpress-social-login') ?></span></th>
|
46 |
+
<th><span><?php _wsl_e("Contacts", 'wordpress-social-login') ?></span></th>
|
47 |
+
<th><span><?php _wsl_e("Actions", 'wordpress-social-login') ?></span></th>
|
48 |
+
</tr>
|
49 |
+
</tfoot>
|
50 |
+
<tbody data-wp-lists="list:user" id="the-list">
|
51 |
+
<?php
|
52 |
+
// have users?
|
53 |
+
if( ! $rs1 ){
|
54 |
+
?>
|
55 |
+
<tr class="no-items"><td colspan="6" class="colspanchange"><?php _wsl_e("No users found", 'wordpress-social-login') ?>.</td></tr>
|
56 |
+
<?php
|
57 |
+
}
|
58 |
+
else{
|
59 |
+
$i = 0;
|
60 |
+
foreach( $rs1 as $items ){
|
61 |
+
$provider = $items->meta_value;
|
62 |
+
$user_id = $items->user_id;
|
63 |
+
?>
|
64 |
+
<tr class="<?php if( ++$i % 2 ) echo "alternate" ?> tr-contacts">
|
65 |
+
<td>
|
66 |
+
<img src="<?php echo $assets_base_url . strtolower( $provider ) . '.png' ?>" style="vertical-align:top;width:16px;height:16px;" /> <?php echo $provider ?>
|
67 |
+
<?php
|
68 |
+
# linked accounts
|
69 |
+
$linked_accounts = wsl_get_user_linked_account_by_user_id( $user_id );
|
70 |
+
|
71 |
+
foreach( $linked_accounts AS $link ){
|
72 |
+
if( $link->provider != $provider ){
|
73 |
+
?>
|
74 |
+
<br />
|
75 |
+
<img src="<?php echo $assets_base_url . strtolower( $link->provider ) . '.png' ?>" style="vertical-align:top;width:16px;height:16px;" /> <?php echo $link->provider ?>
|
76 |
+
<?php
|
77 |
+
}
|
78 |
+
}
|
79 |
+
?>
|
80 |
+
</td>
|
81 |
+
<td>
|
82 |
+
<?php $wsl_user_image = wsl_get_user_by_meta_key_and_user_id( "wsl_user_image", $user_id); if( $wsl_user_image ) { ?>
|
83 |
+
<img width="32" height="32" class="avatar avatar-32 photo" src="<?php echo $wsl_user_image ?>" >
|
84 |
+
<?php } else { ?>
|
85 |
+
<img width="32" height="32" class="avatar avatar-32 photo" src="http://1.gravatar.com/avatar/d4ed6debc848ece02976aba03e450d60?s=32" >
|
86 |
+
<?php } ?>
|
87 |
+
<strong><a href="user-edit.php?user_id=<?php echo $user_id ?>"><?php echo wsl_get_user_by_meta_key_and_user_id( "nickname", $user_id) ?></a></strong>
|
88 |
+
<br>
|
89 |
+
</td>
|
90 |
+
<td><?php echo wsl_get_user_by_meta_key_and_user_id( "last_name", $user_id) ?> <?php echo wsl_get_user_by_meta_key_and_user_id( "first_name", $user_id) ?></td>
|
91 |
+
<td>
|
92 |
+
<?php $user_wsl_email = wsl_get_user_data_by_user_id( "user_wsl_email", $user_id); if( $user_wsl_email ) { ?>
|
93 |
+
<?php if( ! strstr( $user_wsl_email, "@example.com" ) ) { ?>
|
94 |
+
<a href="mailto:<?php echo $user_wsl_email ?>"><?php echo $user_wsl_email ?></a>
|
95 |
+
<?php } else { ?>
|
96 |
+
-
|
97 |
+
<?php } ?>
|
98 |
+
<?php } ?>
|
99 |
+
</td>
|
100 |
+
<td>
|
101 |
+
<?php $user_url = wsl_get_user_data_by_user_id( "user_url", $user_id); if( $user_url ) { ?>
|
102 |
+
<a href="<?php echo $user_url ?>" target="_blank"><?php echo str_ireplace( array("http://www.", "https://www.", "http://","https://"), array('','','','',''), $user_url ) ?></a>
|
103 |
+
<?php } else { ?>
|
104 |
+
-
|
105 |
+
<?php } ?>
|
106 |
+
</td>
|
107 |
+
<td align="center">
|
108 |
+
<?php
|
109 |
+
$sql = "SELECT count( * ) as counts FROM `{$wpdb->prefix}wsluserscontacts` where user_id = '$user_id'";
|
110 |
+
$rs = $wpdb->get_results( $sql );
|
111 |
+
|
112 |
+
if( $rs && $rs[0]->counts ){
|
113 |
+
echo '<b style="color:#CB4B16;">' . $rs[0]->counts . '</b>';
|
114 |
+
}
|
115 |
+
else{
|
116 |
+
echo "0";
|
117 |
+
}
|
118 |
+
?>
|
119 |
+
</td>
|
120 |
+
<td>
|
121 |
+
<a class="button button-secondary" href="options-general.php?page=wordpress-social-login&wslp=users&uid=<?php echo $user_id ?>">Profile</a>
|
122 |
+
<a class="button button-secondary" href="options-general.php?page=wordpress-social-login&wslp=contacts&uid=<?php echo $user_id ?>">Contacts</a>
|
123 |
+
</td>
|
124 |
+
</tr>
|
125 |
+
<?php
|
126 |
+
}
|
127 |
+
}// have users?
|
128 |
+
?>
|
129 |
+
</tbody>
|
130 |
+
</table>
|
131 |
+
</div>
|
132 |
+
<?php
|
133 |
+
// HOOKABLE:
|
134 |
+
do_action( "wsl_component_users_list_end" );
|
135 |
+
}
|
136 |
+
|
137 |
+
// --------------------------------------------------------------------
|
includes/admin/components/users/wsl.components.users.profile.php
ADDED
@@ -0,0 +1,77 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/*!
|
3 |
+
* WordPress Social Login
|
4 |
+
*
|
5 |
+
* http://hybridauth.sourceforge.net/wsl/index.html | http://github.com/hybridauth/WordPress-Social-Login
|
6 |
+
* (c) 2011-2013 Mohamed Mrassi and contributors | http://wordpress.org/extend/plugins/wordpress-social-login/
|
7 |
+
*/
|
8 |
+
|
9 |
+
// Exit if accessed directly
|
10 |
+
if ( !defined( 'ABSPATH' ) ) exit;
|
11 |
+
|
12 |
+
// --------------------------------------------------------------------
|
13 |
+
|
14 |
+
function wsl_component_users_profile( $user_id )
|
15 |
+
{
|
16 |
+
// HOOKABLE:
|
17 |
+
do_action( "wsl_component_users_profile_start" );
|
18 |
+
|
19 |
+
$linked_accounts = wsl_get_user_linked_account_by_user_id( $user_id );
|
20 |
+
|
21 |
+
if( ! $linked_accounts ){
|
22 |
+
_wsl_e("USER DOES NOT EXIST!", 'wordpress-social-login');
|
23 |
+
|
24 |
+
return;
|
25 |
+
}
|
26 |
+
|
27 |
+
$assets_base_url = WORDPRESS_SOCIAL_LOGIN_PLUGIN_URL . '/assets/img/16x16/';
|
28 |
+
|
29 |
+
?>
|
30 |
+
<style>
|
31 |
+
table td, table th { border: 1px solid #DDDDDD; }
|
32 |
+
table th label { font-weight: bold; }
|
33 |
+
.form-table th { width:120px; text-align:right; }
|
34 |
+
</style>
|
35 |
+
<p>
|
36 |
+
<a class="button button-secondary" href="user-edit.php?user_id=<?php echo $user_id ?>">Edit User</a>
|
37 |
+
<a class="button button-secondary" href="options-general.php?page=wordpress-social-login&wslp=contacts&uid=<?php echo $user_id ?>">Show User Contacts List</a>
|
38 |
+
</p>
|
39 |
+
<hr />
|
40 |
+
<?php
|
41 |
+
foreach( $linked_accounts AS $link ){
|
42 |
+
?>
|
43 |
+
<h3><?php _wsl_e("User Profile", 'wordpress-social-login'); ?> <small><?php echo sprintf( _wsl__( "as provided by %s", 'wordpress-social-login'), $link->provider ); ?> </small></h3>
|
44 |
+
|
45 |
+
<table class="form-table"
|
46 |
+
<tr><th><label><?php echo $link->provider; ?> Identifier </label></th><td><?php echo $link->identifier ; ?> <br /><span class="description">The Unique user's ID. Can be an interger for some providers, Email, URL, etc.</span></td></tr>
|
47 |
+
<tr><th><label>Wordpress Identifier </label></th><td><?php echo $user_id; ?> <br /><span class="description">The Unique user's ID on your website.</span></td></tr>
|
48 |
+
<tr><th><label>Profile URL </label></th><td><a href="<?php echo $link->profileurl; ?>"><?php echo $link->profileurl; ?></a> <br /><span class="description">URL link to profile page on the <?php echo $link->provider; ?> web site.</span></td></tr>
|
49 |
+
<tr><th><label>Website URL </label></th><td><a href="<?php echo $link->websiteurl; ?>"><?php echo $link->websiteurl; ?></a> <br /><span class="description">User website, blog, web page, etc.</span></td></tr>
|
50 |
+
<tr><th><label>Photo URL </label></th><td><a href="<?php echo $link->photourl; ?>"><?php echo $link->photourl; ?></a> <br /><span class="description">URL link to user photo or avatar.</span></td></tr>
|
51 |
+
<tr><th><label>Display name </label></th><td><?php echo $link->displayname ; ?> <br /><span class="description">User dispaly Name provided by the <?php echo $link->provider; ?> or a concatenation of first and last name.</span></td></tr>
|
52 |
+
<tr><th><label>Description </label></th><td><?php echo $link->description ; ?>
|
53 |
+
<tr><th><label>First name </label></th><td><?php echo $link->firstname ; ?>
|
54 |
+
<tr><th><label>Last name </label></th><td><?php echo $link->lastname ; ?>
|
55 |
+
<tr><th><label>Gender </label></th><td><?php echo $link->gender ; ?>
|
56 |
+
<tr><th><label>Language </label></th><td><?php echo $link->language ; ?>
|
57 |
+
<tr><th><label>Age </label></th><td><?php echo $link->age ; ?>
|
58 |
+
<tr><th><label>Birth day </label></th><td><?php echo $link->birthday ; ?>
|
59 |
+
<tr><th><label>Birth month </label></th><td><?php echo $link->birthmonth ; ?>
|
60 |
+
<tr><th><label>Birth year </label></th><td><?php echo $link->birthyear ; ?>
|
61 |
+
<tr><th><label>Email </label></th><td><?php echo $link->email ; ?>
|
62 |
+
<tr><th><label>Phone </label></th><td><?php echo $link->phone ; ?>
|
63 |
+
<tr><th><label>Address </label></th><td><?php echo $link->address ; ?>
|
64 |
+
<tr><th><label>Country </label></th><td><?php echo $link->country ; ?>
|
65 |
+
<tr><th><label>Region </label></th><td><?php echo $link->region ; ?>
|
66 |
+
<tr><th><label>City </label></th><td><?php echo $link->city ; ?>
|
67 |
+
<tr><th><label>Zip </label></th><td><?php echo $link->zip ; ?>
|
68 |
+
</tr>
|
69 |
+
</table>
|
70 |
+
<?php
|
71 |
+
}
|
72 |
+
|
73 |
+
// HOOKABLE:
|
74 |
+
do_action( "wsl_component_users_profile_end" );
|
75 |
+
}
|
76 |
+
|
77 |
+
// --------------------------------------------------------------------
|
includes/admin/wsl.admin.ui.php
ADDED
@@ -0,0 +1,775 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/*!
|
3 |
+
* WordPress Social Login
|
4 |
+
*
|
5 |
+
* http://hybridauth.sourceforge.net/wsl/index.html | http://github.com/hybridauth/WordPress-Social-Login
|
6 |
+
* (c) 2011-2013 Mohamed Mrassi and contributors | http://wordpress.org/extend/plugins/wordpress-social-login/
|
7 |
+
*/
|
8 |
+
|
9 |
+
/**
|
10 |
+
* The LOC in charge of displaying WSL Admin GUInterfaces
|
11 |
+
*/
|
12 |
+
|
13 |
+
// Exit if accessed directly
|
14 |
+
if ( !defined( 'ABSPATH' ) ) exit;
|
15 |
+
|
16 |
+
// --------------------------------------------------------------------
|
17 |
+
|
18 |
+
/**
|
19 |
+
* Generate wsl admin pages
|
20 |
+
*
|
21 |
+
* wp-admin/options-general.php?page=wordpress-social-login&..
|
22 |
+
*/
|
23 |
+
function wsl_admin_init()
|
24 |
+
{
|
25 |
+
// HOOKABLE:
|
26 |
+
do_action( "wsl_admin_init_start" );
|
27 |
+
|
28 |
+
if ( ! wsl_check_requirements() ){
|
29 |
+
wsl_admin_ui_fail();
|
30 |
+
|
31 |
+
exit;
|
32 |
+
}
|
33 |
+
|
34 |
+
GLOBAL $WORDPRESS_SOCIAL_LOGIN_ADMIN_TABS;
|
35 |
+
GLOBAL $WORDPRESS_SOCIAL_LOGIN_COMPONENTS;
|
36 |
+
GLOBAL $WORDPRESS_SOCIAL_LOGIN_PROVIDERS_CONFIG;
|
37 |
+
GLOBAL $WORDPRESS_SOCIAL_LOGIN_VERSION;
|
38 |
+
GLOBAL $wpdb;
|
39 |
+
|
40 |
+
if( isset( $_REQUEST["enable"] ) && isset( $WORDPRESS_SOCIAL_LOGIN_COMPONENTS[ $_REQUEST["enable"] ] ) ){
|
41 |
+
$component = $_REQUEST["enable"];
|
42 |
+
|
43 |
+
$WORDPRESS_SOCIAL_LOGIN_COMPONENTS[ $component ][ "enabled" ] = true;
|
44 |
+
|
45 |
+
update_option( "wsl_components_" . $component . "_enabled", 1 );
|
46 |
+
|
47 |
+
wsl_register_components();
|
48 |
+
}
|
49 |
+
|
50 |
+
if( isset( $_REQUEST["disable"] ) && isset( $WORDPRESS_SOCIAL_LOGIN_COMPONENTS[ $_REQUEST["disable"] ] ) ){
|
51 |
+
$component = $_REQUEST["disable"];
|
52 |
+
|
53 |
+
$WORDPRESS_SOCIAL_LOGIN_COMPONENTS[ $component ][ "enabled" ] = false;
|
54 |
+
|
55 |
+
update_option( "wsl_components_" . $component . "_enabled", 2 );
|
56 |
+
|
57 |
+
wsl_register_components();
|
58 |
+
}
|
59 |
+
|
60 |
+
$wslp = "networks";
|
61 |
+
$wsldwp = 0;
|
62 |
+
$assets_base_url = WORDPRESS_SOCIAL_LOGIN_PLUGIN_URL . '/assets/img/16x16/';
|
63 |
+
|
64 |
+
if( isset( $_REQUEST["wslp"] ) ){
|
65 |
+
$wslp = trim( strtolower( strip_tags( $_REQUEST["wslp"] ) ) );
|
66 |
+
}
|
67 |
+
|
68 |
+
if( isset( $WORDPRESS_SOCIAL_LOGIN_ADMIN_TABS[$wslp] ) && $WORDPRESS_SOCIAL_LOGIN_ADMIN_TABS[$wslp]["enabled"] ){
|
69 |
+
if( isset( $WORDPRESS_SOCIAL_LOGIN_ADMIN_TABS[$wslp]["header_action"] ) && $WORDPRESS_SOCIAL_LOGIN_ADMIN_TABS[$wslp]["header_action"] ){
|
70 |
+
do_action( $WORDPRESS_SOCIAL_LOGIN_ADMIN_TABS[$wslp]["header_action"] );
|
71 |
+
}
|
72 |
+
|
73 |
+
wsl_admin_ui_header( $wslp );
|
74 |
+
|
75 |
+
if( isset( $WORDPRESS_SOCIAL_LOGIN_ADMIN_TABS[$wslp]["body_action"] ) && $WORDPRESS_SOCIAL_LOGIN_ADMIN_TABS[$wslp]["body_action"] ){
|
76 |
+
do_action( $WORDPRESS_SOCIAL_LOGIN_ADMIN_TABS[$wslp]["body_action"] );
|
77 |
+
}
|
78 |
+
|
79 |
+
elseif( ! ( isset( $WORDPRESS_SOCIAL_LOGIN_ADMIN_TABS[$wslp]["admin-url"] ) && ! $WORDPRESS_SOCIAL_LOGIN_ADMIN_TABS[$wslp]["admin-url"] ) ){
|
80 |
+
include "components/$wslp/index.php";
|
81 |
+
|
82 |
+
wsl_admin_ui_footer();
|
83 |
+
}
|
84 |
+
}
|
85 |
+
else{
|
86 |
+
wsl_admin_ui_header();
|
87 |
+
|
88 |
+
wsl_admin_ui_error();
|
89 |
+
}
|
90 |
+
|
91 |
+
// HOOKABLE:
|
92 |
+
do_action( "wsl_admin_init_end" );
|
93 |
+
}
|
94 |
+
|
95 |
+
// --------------------------------------------------------------------
|
96 |
+
|
97 |
+
/**
|
98 |
+
* Renders an editor in a page in the typical fashion used in Posts and Pages.
|
99 |
+
*/
|
100 |
+
function wsl_render_wp_editor( $name, $content )
|
101 |
+
{
|
102 |
+
// HOOKABLE:
|
103 |
+
do_action( "wsl_render_wp_editor_start" );
|
104 |
+
?>
|
105 |
+
<div class="postbox">
|
106 |
+
<div class="wp-editor-textarea" style="background-color: #FFFFFF;">
|
107 |
+
<?php
|
108 |
+
wp_editor(
|
109 |
+
$content, $name,
|
110 |
+
array( 'textarea_name' => $name, 'media_buttons' => true, 'tinymce' => array( 'theme_advanced_buttons1' => 'formatselect,forecolor,|,bold,italic,underline,|,justifyleft,justifycenter,justifyright,justifyfull,|,link,unlink' ) )
|
111 |
+
);
|
112 |
+
?>
|
113 |
+
</div>
|
114 |
+
</div>
|
115 |
+
<?php
|
116 |
+
// HOOKABLE:
|
117 |
+
do_action( "wsl_render_wp_editor_end" );
|
118 |
+
}
|
119 |
+
|
120 |
+
// --------------------------------------------------------------------
|
121 |
+
|
122 |
+
/**
|
123 |
+
* Render wsl admin pages hearder (label and tabs)
|
124 |
+
*/
|
125 |
+
function wsl_admin_ui_header( $wslp = null )
|
126 |
+
{
|
127 |
+
// HOOKABLE:
|
128 |
+
do_action( "wsl_admin_ui_header_start" );
|
129 |
+
|
130 |
+
GLOBAL $WORDPRESS_SOCIAL_LOGIN_VERSION;
|
131 |
+
GLOBAL $WORDPRESS_SOCIAL_LOGIN_ADMIN_TABS;
|
132 |
+
?>
|
133 |
+
<style>
|
134 |
+
h1 {
|
135 |
+
color: #333333;
|
136 |
+
text-shadow: 1px 1px 1px #FFFFFF;
|
137 |
+
font-size: 2.8em;
|
138 |
+
font-weight: 200;
|
139 |
+
line-height: 1.2em;
|
140 |
+
margin: 0.2em 200px 0.6em 0.2em;
|
141 |
+
}
|
142 |
+
h2 .nav-tab {
|
143 |
+
color: #21759B;
|
144 |
+
}
|
145 |
+
h2 .nav-tab-active {
|
146 |
+
color: #464646;
|
147 |
+
text-shadow: 1px 1px 1px #FFFFFF;
|
148 |
+
}
|
149 |
+
hr{
|
150 |
+
border-color: #EEEEEE;
|
151 |
+
border-style: none none solid;
|
152 |
+
border-width: 0 0 1px;
|
153 |
+
margin: 2px 0 15px;
|
154 |
+
}
|
155 |
+
.wsldiv {
|
156 |
+
margin: 25px 40px 0 20px;
|
157 |
+
}
|
158 |
+
.wsldiv p{
|
159 |
+
line-height: 1.8em;
|
160 |
+
}
|
161 |
+
.wslgn{
|
162 |
+
margin-left:20px;
|
163 |
+
}
|
164 |
+
.wslgn p{
|
165 |
+
margin-left:20px;
|
166 |
+
}
|
167 |
+
.wslpre{
|
168 |
+
font-size:14m;
|
169 |
+
border:1px solid #E6DB55;
|
170 |
+
border-radius: 3px;
|
171 |
+
padding:5px;
|
172 |
+
width:650px;
|
173 |
+
}
|
174 |
+
ul {
|
175 |
+
list-style: disc outside none;
|
176 |
+
}
|
177 |
+
|
178 |
+
.thumbnails:before,
|
179 |
+
.thumbnails:after {
|
180 |
+
display: table;
|
181 |
+
line-height: 0;
|
182 |
+
content: "";
|
183 |
+
}
|
184 |
+
|
185 |
+
.thumbnail {
|
186 |
+
display: block;
|
187 |
+
padding: 4px;
|
188 |
+
line-height: 20px;
|
189 |
+
border: 1px solid #ddd;
|
190 |
+
-webkit-border-radius: 4px;
|
191 |
+
-moz-border-radius: 4px;
|
192 |
+
border-radius: 4px;
|
193 |
+
-webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.055);
|
194 |
+
-moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.055);
|
195 |
+
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.055);
|
196 |
+
-webkit-transition: all 0.2s ease-in-out;
|
197 |
+
-moz-transition: all 0.2s ease-in-out;
|
198 |
+
-o-transition: all 0.2s ease-in-out;
|
199 |
+
transition: all 0.2s ease-in-out;
|
200 |
+
}
|
201 |
+
|
202 |
+
a.thumbnail:hover {
|
203 |
+
border-color: #0088cc;
|
204 |
+
-webkit-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25);
|
205 |
+
-moz-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25);
|
206 |
+
box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25);
|
207 |
+
}
|
208 |
+
|
209 |
+
.thumbnail > img {
|
210 |
+
display: block;
|
211 |
+
max-width: 100%;
|
212 |
+
margin-right: auto;
|
213 |
+
margin-left: auto;
|
214 |
+
}
|
215 |
+
|
216 |
+
.thumbnail .caption {
|
217 |
+
padding: 9px;
|
218 |
+
color: #555555;
|
219 |
+
}
|
220 |
+
.span4 {
|
221 |
+
width: 220px;
|
222 |
+
}
|
223 |
+
#wp-social-login-connect-with {
|
224 |
+
font-size: 14px;
|
225 |
+
}
|
226 |
+
#wp-social-login-connect-options {
|
227 |
+
margin:5px;
|
228 |
+
}
|
229 |
+
.wsl_connect_with_provider {
|
230 |
+
text-decoration:none;
|
231 |
+
cursor:not-allowed;
|
232 |
+
}
|
233 |
+
#wsl-w-panel {
|
234 |
+
background: linear-gradient(to top, #F5F5F5, #FAFAFA) repeat scroll 0 0 #F5F5F5;
|
235 |
+
border-color: #DFDFDF;
|
236 |
+
border-radius: 3px 3px 3px 3px;
|
237 |
+
border-style: solid;
|
238 |
+
border-width: 1px;
|
239 |
+
font-size: 13px;
|
240 |
+
line-height: 2.1em;
|
241 |
+
margin: 20px 0;
|
242 |
+
overflow: auto;
|
243 |
+
-padding: 23px 10px 12px;
|
244 |
+
padding: 5px;
|
245 |
+
position: relative;
|
246 |
+
}
|
247 |
+
#wsl-w-panel-dismiss:before {
|
248 |
+
background: url("images/xit.gif") no-repeat scroll 0 17% transparent;
|
249 |
+
content: " ";
|
250 |
+
height: 100%;
|
251 |
+
left: -12px;
|
252 |
+
position: absolute;
|
253 |
+
width: 10px;
|
254 |
+
margin: -2px 0;
|
255 |
+
}
|
256 |
+
#wsl-w-panel-dismiss:hover:before {
|
257 |
+
background-position: 100% 17%;
|
258 |
+
}
|
259 |
+
#wsl-w-panel-dismiss {
|
260 |
+
font-size: 13px;
|
261 |
+
line-height: 1;
|
262 |
+
padding: 8px 3px;
|
263 |
+
position: absolute;
|
264 |
+
right: 10px;
|
265 |
+
text-decoration: none;
|
266 |
+
top: 0px;
|
267 |
+
}
|
268 |
+
#wsl-w-panel-updates-tr {
|
269 |
+
display:none;
|
270 |
+
}
|
271 |
+
.hideinside {
|
272 |
+
/* display:none; */
|
273 |
+
}
|
274 |
+
|
275 |
+
.wp-editor-textarea{
|
276 |
+
width:98%;
|
277 |
+
padding:1%;
|
278 |
+
font-family:"Trebuchet MS", Arial, verdana, sans-serif;
|
279 |
+
}
|
280 |
+
.wp-editor-textarea textarea{
|
281 |
+
height:100px;
|
282 |
+
}
|
283 |
+
|
284 |
+
.wp-editor-textarea input {
|
285 |
+
width: auto !important;
|
286 |
+
}
|
287 |
+
|
288 |
+
#wsl_i18n_pre {
|
289 |
+
height: 800px;
|
290 |
+
overflow-x: hidden;
|
291 |
+
overflow-y: scroll;
|
292 |
+
}
|
293 |
+
#wsl_i18n {
|
294 |
+
width:530px;
|
295 |
+
width: 560px;
|
296 |
+
display:none;
|
297 |
+
padding: 10px;
|
298 |
+
border: 1px solid #ddd;
|
299 |
+
background-color: #fff;
|
300 |
+
float:left;
|
301 |
+
margin-left: 20px;
|
302 |
+
padding: 0 10px 10px;
|
303 |
+
}
|
304 |
+
#wsl_i18n_form {
|
305 |
+
width:420px;
|
306 |
+
width:340px;
|
307 |
+
display:none;
|
308 |
+
padding: 10px;
|
309 |
+
border: 1px solid #ddd;
|
310 |
+
background-color: #fff;
|
311 |
+
float:left;
|
312 |
+
}
|
313 |
+
#wsl_i18n_cla {
|
314 |
+
display:none;
|
315 |
+
padding: 10px;
|
316 |
+
border: 1px solid #ddd;
|
317 |
+
background-color: #fff;
|
318 |
+
|
319 |
+
width: 50%;
|
320 |
+
margin: 0px auto;
|
321 |
+
margin-top:50px;
|
322 |
+
}
|
323 |
+
</style>
|
324 |
+
<a name="wsltop"></a>
|
325 |
+
<div class="wsldiv">
|
326 |
+
<h1>
|
327 |
+
WordPress Social Login
|
328 |
+
|
329 |
+
<small><?php echo $WORDPRESS_SOCIAL_LOGIN_VERSION ?></small>
|
330 |
+
|
331 |
+
<?php
|
332 |
+
if( get_option( 'wsl_settings_development_mode_enabled' ) ){
|
333 |
+
?>
|
334 |
+
<span style="color:red;-font-size: 14px;">(<?php _wsl_e("Development mode is enabled!", 'wordpress-social-login') ?>)</span>
|
335 |
+
<?php
|
336 |
+
}
|
337 |
+
?>
|
338 |
+
</h1>
|
339 |
+
|
340 |
+
<h2 class="nav-tab-wrapper">
|
341 |
+
|
342 |
+
<?php
|
343 |
+
foreach( $WORDPRESS_SOCIAL_LOGIN_ADMIN_TABS as $name => $settings ){
|
344 |
+
if( $settings["enabled"] && ( $settings["visible"] || $wslp == $name ) ){
|
345 |
+
if( isset( $settings["admin-url"] ) ){
|
346 |
+
?><a class="nav-tab <?php if( $wslp == $name ) echo "nav-tab-active"; ?>" <?php if( isset( $settings["pull-right"] ) && $settings["pull-right"] ) echo 'style="float:right"'; ?> href="<?php echo $settings["admin-url"] ?>"><?php echo $settings["label"] ?></a><?php
|
347 |
+
}
|
348 |
+
else{
|
349 |
+
?><a class="nav-tab <?php if( $wslp == $name ) echo "nav-tab-active"; ?>" <?php if( isset( $settings["pull-right"] ) && $settings["pull-right"] ) echo 'style="float:right"'; ?> href="options-general.php?page=wordpress-social-login&wslp=<?php echo $name ?>"><?php echo $settings["label"] ?></a><?php
|
350 |
+
}
|
351 |
+
}
|
352 |
+
}
|
353 |
+
?>
|
354 |
+
</h2>
|
355 |
+
|
356 |
+
<div id="wsl_admin_tab_content">
|
357 |
+
<?php
|
358 |
+
// HOOKABLE:
|
359 |
+
do_action( "wsl_admin_ui_header_end" );
|
360 |
+
}
|
361 |
+
|
362 |
+
// --------------------------------------------------------------------
|
363 |
+
|
364 |
+
/**
|
365 |
+
* Renders wsl admin pages footer
|
366 |
+
*/
|
367 |
+
function wsl_admin_ui_footer()
|
368 |
+
{
|
369 |
+
// HOOKABLE:
|
370 |
+
do_action( "wsl_admin_ui_footer_start" );
|
371 |
+
|
372 |
+
GLOBAL $WORDPRESS_SOCIAL_LOGIN_VERSION;
|
373 |
+
?>
|
374 |
+
</div> <!-- ./wsl_admin_tab_content -->
|
375 |
+
<div class="clear"></div>
|
376 |
+
<?php wsl_admin_localize_widget(); ?>
|
377 |
+
|
378 |
+
<script>
|
379 |
+
// check for new versions and updates
|
380 |
+
jQuery.getScript("http://hybridauth.sourceforge.net/wsl/wsl.version.check.and.updates.php?v=<?php echo $WORDPRESS_SOCIAL_LOGIN_VERSION ?>");
|
381 |
+
</script>
|
382 |
+
<?php
|
383 |
+
// HOOKABLE:
|
384 |
+
do_action( "wsl_admin_ui_footer_end" );
|
385 |
+
}
|
386 |
+
|
387 |
+
// --------------------------------------------------------------------
|
388 |
+
|
389 |
+
/**
|
390 |
+
* Renders wsl admin error page
|
391 |
+
*/
|
392 |
+
function wsl_admin_ui_error()
|
393 |
+
{
|
394 |
+
// HOOKABLE:
|
395 |
+
do_action( "wsl_admin_ui_error_start" );
|
396 |
+
?>
|
397 |
+
<style>
|
398 |
+
#wsl_div_warn {
|
399 |
+
padding: 10px;
|
400 |
+
border: 1px solid #ddd;
|
401 |
+
background-color: #fff;
|
402 |
+
|
403 |
+
width: 55%;
|
404 |
+
margin: 0px auto;
|
405 |
+
margin-top:30px;
|
406 |
+
}
|
407 |
+
</style>
|
408 |
+
<div id="wsl_div_warn">
|
409 |
+
<h3 style="margin:0px;"><?php _wsl_e('Something wrong!', 'wordpress-social-login') ?></h3>
|
410 |
+
|
411 |
+
<hr />
|
412 |
+
|
413 |
+
<p>
|
414 |
+
<?php _wsl_e('Unknown or Disabled <b>Component</b>! Check the list of enabled components or the typed URL', 'wordpress-social-login') ?> .
|
415 |
+
</p>
|
416 |
+
|
417 |
+
<p>
|
418 |
+
<?php _wsl_e("If you believe you've found a problem with <b>WordPress Social Login</b>, be sure to let us know so we can fix it", 'wordpress-social-login') ?>.
|
419 |
+
</p>
|
420 |
+
|
421 |
+
<hr />
|
422 |
+
|
423 |
+
<div>
|
424 |
+
<a class="button-secondary" href="http://hybridauth.sourceforge.net/wsl/support.html" target="_blank"><?php _wsl_e( "Report as bug", 'wordpress-social-login' ) ?></a>
|
425 |
+
<a class="button-primary" href="options-general.php?page=wordpress-social-login&wslp=components" style="float:right"><?php _wsl_e( "Check enabled components", 'wordpress-social-login' ) ?></a>
|
426 |
+
</div>
|
427 |
+
</div>
|
428 |
+
|
429 |
+
<?php
|
430 |
+
// HOOKABLE:
|
431 |
+
do_action( "wsl_admin_ui_error_end" );
|
432 |
+
}
|
433 |
+
|
434 |
+
// --------------------------------------------------------------------
|
435 |
+
|
436 |
+
/**
|
437 |
+
* Renders wsl #FAIL page
|
438 |
+
*/
|
439 |
+
function wsl_admin_ui_fail()
|
440 |
+
{
|
441 |
+
// HOOKABLE:
|
442 |
+
do_action( "wsl_admin_ui_fail_start" );
|
443 |
+
?>
|
444 |
+
<style>
|
445 |
+
h1 {
|
446 |
+
color: #333333;
|
447 |
+
text-shadow: 1px 1px 1px #FFFFFF;
|
448 |
+
font-size: 2.8em;
|
449 |
+
font-weight: 200;
|
450 |
+
line-height: 1.2em;
|
451 |
+
margin: 0.2em 200px 0 0;
|
452 |
+
}
|
453 |
+
hr{
|
454 |
+
border-color: #EEEEEE;
|
455 |
+
border-style: none none solid;
|
456 |
+
border-width: 0 0 1px;
|
457 |
+
margin: 2px 0 15px;
|
458 |
+
}
|
459 |
+
.wsldiv {
|
460 |
+
margin: 30px 70px 0 70px;
|
461 |
+
}
|
462 |
+
.wsldiv p{
|
463 |
+
ont-size: 14px;
|
464 |
+
line-height: 1.8em;
|
465 |
+
}
|
466 |
+
.wslpre{
|
467 |
+
font-size:14m;
|
468 |
+
border:1px solid #E6DB55;
|
469 |
+
border-radius: 3px;
|
470 |
+
padding:5px;
|
471 |
+
width:650px;
|
472 |
+
}
|
473 |
+
ul {
|
474 |
+
list-style: disc outside none;
|
475 |
+
}
|
476 |
+
</style>
|
477 |
+
|
478 |
+
<div class="wsldiv">
|
479 |
+
<h1><?php _e("WordPress Social Login - FAIL!", 'wordpress-social-login') ?></h1>
|
480 |
+
|
481 |
+
<hr />
|
482 |
+
|
483 |
+
<p>
|
484 |
+
<?php _e('Despite the efforts, the plugin <a href="http://profiles.wordpress.org/miled/" target="_blank">author</a> and other <a href="https://github.com/hybridauth/WordPress-Social-Login/graphs/contributors" target="_blank">contributors</a>, put into <b>WordPress Social Login</b> in terms of reliability, portability, <br />and maintenance', 'wordpress-social-login') ?>.
|
485 |
+
<b style="color:red;"><?php _e('Your server failed the requirements check for this plugin!', 'wordpress-social-login') ?></b>
|
486 |
+
</p>
|
487 |
+
<p>
|
488 |
+
<?php _e('These requirements are usually met by default by most "modern" web hosting providers, however some complications may <br />occur with <b>shared hosting</b> and, or <b>custom wordpress installations</b>', 'wordpress-social-login') ?>.
|
489 |
+
</p>
|
490 |
+
<p>
|
491 |
+
<?php _e("To determine what may cause this failure, run the <b>WordPress Social Login Requirements Test</b> by clicking the button bellow", 'wordpress-social-login') ?>:
|
492 |
+
|
493 |
+
<br />
|
494 |
+
<br />
|
495 |
+
<a class="button-primary" href='<?php echo WORDPRESS_SOCIAL_LOGIN_PLUGIN_URL ?>/services/diagnostics.php' target='_blank'><?php _e("Run the plugin requirements test", 'wordpress-social-login') ?></a>
|
496 |
+
<a class="button-primary" href='<?php echo WORDPRESS_SOCIAL_LOGIN_PLUGIN_URL ?>/services/siteinfo.php' target='_blank'><?php _e("System Information", 'wordpress-social-login') ?></a>
|
497 |
+
</p>
|
498 |
+
|
499 |
+
<br />
|
500 |
+
<hr />
|
501 |
+
|
502 |
+
<p>
|
503 |
+
<?php _e("<b>WordPress Social Login</b> is an open source software licenced under The MIT License (MIT)", 'wordpress-social-login') ?>
|
504 |
+
</p>
|
505 |
+
|
506 |
+
<pre class="wslpre">
|
507 |
+
Copyright (C) 2011-2013 Mohamed Mrassi and contributors
|
508 |
+
|
509 |
+
Permission is hereby granted, free of charge, to any person obtaining
|
510 |
+
a copy of this software and associated documentation files (the
|
511 |
+
"Software"), to deal in the Software without restriction, including
|
512 |
+
without limitation the rights to use, copy, modify, merge, publish,
|
513 |
+
distribute, sublicense, and/or sell copies of the Software, and to
|
514 |
+
permit persons to whom the Software is furnished to do so, subject to
|
515 |
+
the following conditions:
|
516 |
+
|
517 |
+
The above copyright notice and this permission notice shall be
|
518 |
+
included in all copies or substantial portions of the Software.
|
519 |
+
|
520 |
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
521 |
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
522 |
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
523 |
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
524 |
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
525 |
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
526 |
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
527 |
+
</pre>
|
528 |
+
<br />
|
529 |
+
<script>
|
530 |
+
jQuery.getScript("http://hybridauth.sourceforge.net/wsl/wsl.version.check.and.updates.php?v=<?php echo $WORDPRESS_SOCIAL_LOGIN_VERSION ?>&fail=true");
|
531 |
+
</script>
|
532 |
+
<?php
|
533 |
+
// HOOKABLE:
|
534 |
+
do_action( "wsl_admin_ui_fail_end" );
|
535 |
+
}
|
536 |
+
|
537 |
+
// --------------------------------------------------------------------
|
538 |
+
|
539 |
+
/**
|
540 |
+
* Renders wsl admin welcome panel
|
541 |
+
*/
|
542 |
+
function wsl_admin_welcome_panel()
|
543 |
+
{
|
544 |
+
if( isset( $_REQUEST["wsldwp"] ) && (int) $_REQUEST["wsldwp"] ){
|
545 |
+
$wsldwp = (int) $_REQUEST["wsldwp"];
|
546 |
+
|
547 |
+
update_option( "wsl_settings_welcome_panel_enabled", wsl_version() );
|
548 |
+
|
549 |
+
return;
|
550 |
+
}
|
551 |
+
|
552 |
+
// if new user or wsl updated, then we display wsl welcome panel
|
553 |
+
if( get_option( 'wsl_settings_welcome_panel_enabled' ) == wsl_version() ){
|
554 |
+
return;
|
555 |
+
}
|
556 |
+
?>
|
557 |
+
<!--
|
558 |
+
if you want to know if a UI was made by devloper, then here is a tip: he will always use tables
|
559 |
+
|
560 |
+
//> wsl-w-panel is shamelessly borrowered and modified from wordpress welcome-panel
|
561 |
+
-->
|
562 |
+
<div id="wsl-w-panel">
|
563 |
+
<a href="options-general.php?page=wordpress-social-login&wslp=<?php echo $wslp ?>&wsldwp=1" id="wsl-w-panel-dismiss"><?php _e("Dismiss", 'wordpress-social-login') ?></a>
|
564 |
+
|
565 |
+
<table width="100%" border="0" style="margin:0;padding:0;">
|
566 |
+
<tr>
|
567 |
+
<td width="10" valign="top"></td>
|
568 |
+
<td width="300" valign="top">
|
569 |
+
<b style="font-size: 16px;"><?php _wsl_e("Welcome!", 'wordpress-social-login') ?></b>
|
570 |
+
<p>
|
571 |
+
<?php _wsl_e("If you are still new to WordPress Social Login, we have provided a few walkthroughs to get you started", 'wordpress-social-login') ?>.
|
572 |
+
</p>
|
573 |
+
</td>
|
574 |
+
<td width="40" valign="top"></td>
|
575 |
+
<td width="260" valign="top">
|
576 |
+
<br />
|
577 |
+
<p>
|
578 |
+
<b><?php _wsl_e("Get Started", 'wordpress-social-login') ?></b>
|
579 |
+
</p>
|
580 |
+
<ul style="margin-left:25px;">
|
581 |
+
<li><?php _wsl_e('<a href="http://hybridauth.sourceforge.net/wsl/configure.html" target="_blank">Setup and Configuration</a>', 'wordpress-social-login') ?></li>
|
582 |
+
<li><?php _wsl_e('<a href="http://hybridauth.sourceforge.net/wsl/customize.html" target="_blank">Customize WSL Widgets</a>', 'wordpress-social-login') ?></li>
|
583 |
+
<li><?php _wsl_e('<a href="http://hybridauth.sourceforge.net/wsl/userdata.html" target="_blank">Manage users and contacts</a>', 'wordpress-social-login') ?></li>
|
584 |
+
<li><?php _wsl_e('<a href="http://hybridauth.sourceforge.net/wsl/index.html" target="_blank">WSL User Guide</a> and <a href="http://hybridauth.sourceforge.net/wsl/faq.html" target="_blank">FAQ</a>', 'wordpress-social-login') ?></li>
|
585 |
+
</ul>
|
586 |
+
</td>
|
587 |
+
<td width="" valign="top">
|
588 |
+
<br />
|
589 |
+
<p>
|
590 |
+
<b><?php echo sprintf( _wsl__( "What's new on WSL %s", 'wordpress-social-login'), wsl_version() ) ?></b>
|
591 |
+
</p>
|
592 |
+
<ul style="margin-left:25px;">
|
593 |
+
<li><?php _wsl_e('In a similar way to WordPress plugins, WSL uses <a href="options-general.php?page=wordpress-social-login&wslp=components">Components</a>', 'wordpress-social-login') ?>,</li>
|
594 |
+
<li><?php _wsl_e('<b>Email Validation</b> is replaced with <b>Profile Completion</b>', 'wordpress-social-login') ?>,</li>
|
595 |
+
<li><?php _wsl_e('<b>User Moderation</b> made compatible with <a href="http://wordpress.org/extend/plugins/theme-my-login/" target="_blank">Theme My Login</a> plugin', 'wordpress-social-login') ?>,</li>
|
596 |
+
<li><?php _wsl_e('A number of enhancements and new options now available', 'wordpress-social-login') ?>.</li>
|
597 |
+
</ul>
|
598 |
+
</td>
|
599 |
+
</tr>
|
600 |
+
<tr id="wsl-w-panel-updates-tr">
|
601 |
+
<td colspan="5" style="border-top:1px solid #ccc;" id="wsl-w-panel-updates-td">
|
602 |
+
|
603 |
+
</td>
|
604 |
+
</tr>
|
605 |
+
</table>
|
606 |
+
</div>
|
607 |
+
<?php
|
608 |
+
}
|
609 |
+
|
610 |
+
// --------------------------------------------------------------------
|
611 |
+
|
612 |
+
/**
|
613 |
+
* Renders wsl localization widget
|
614 |
+
*/
|
615 |
+
function wsl_admin_localize_widget()
|
616 |
+
{
|
617 |
+
global $WORDPRESS_SOCIAL_LOGIN_TEXTS;
|
618 |
+
|
619 |
+
// default endpoint_url
|
620 |
+
$assets_url = WORDPRESS_SOCIAL_LOGIN_PLUGIN_URL;
|
621 |
+
|
622 |
+
// overwrite endpoint_url if need'd
|
623 |
+
if( get_option( 'wsl_settings_base_url' ) ){
|
624 |
+
$assets_url = strtolower( get_option( 'wsl_settings_base_url' ) );
|
625 |
+
}
|
626 |
+
|
627 |
+
$assets_url .= '/assets/img/';
|
628 |
+
|
629 |
+
$current_user = wp_get_current_user();
|
630 |
+
|
631 |
+
$wslp = "networks";
|
632 |
+
|
633 |
+
if( isset( $_REQUEST["wslp"] ) ){
|
634 |
+
$wslp = $_REQUEST["wslp"];
|
635 |
+
}
|
636 |
+
?>
|
637 |
+
<form action="http://hybridauth.sourceforge.net/wsl/i18n.contributions.php" method="post" target="_blank">
|
638 |
+
<input type="hidden" name="wsl_i18n_site_url" value="<?php bloginfo('url'); ?>" />
|
639 |
+
<input type="hidden" name="wsl_i18n_site_charset" value="<?php bloginfo('charset'); ?>" />
|
640 |
+
<input type="hidden" name="wsl_i18n_site_language" value="<?php bloginfo('language'); ?>" />
|
641 |
+
<input type="hidden" name="wsl_i18n_current_page" value="<?php echo $wslp ?>" />
|
642 |
+
|
643 |
+
<input type="hidden" name="wsl_version" value="<?php echo wsl_version() ?>" />
|
644 |
+
|
645 |
+
<div id="wsl_i18n_cla">
|
646 |
+
<h3 style="margin:0px;"><?php _wsl_e( "Contributor License Agreement", 'wordpress-social-login' ) ?></h3>
|
647 |
+
|
648 |
+
<hr />
|
649 |
+
|
650 |
+
<p>
|
651 |
+
<?php _wsl_e( "You are about to submit your contributions to the WordPress Social Login Website to be reviewed for inclusion in future versions", 'wordpress-social-login' ) ?>.
|
652 |
+
|
653 |
+
<?php _wsl_e( "You hereby grant the permission to publish your contribution, in whole or in part, and to made it available under the <b>MIT License</b>, for the <b>Wordpress community</b> to, freely use or misuse", 'wordpress-social-login' ) ?>.
|
654 |
+
</p>
|
655 |
+
|
656 |
+
<hr />
|
657 |
+
|
658 |
+
<div>
|
659 |
+
<a class="button-secondary" href="admin.php?page=wordpress-social-login"><?php _wsl_e( "Hell No", 'wordpress-social-login' ) ?></a>
|
660 |
+
<input style="float:right" type="submit" value="<?php _wsl_e( "Yes, I agree to contribute my translation", 'wordpress-social-login' ) ?>" class="button-primary" onClick="wsl_i18n_done()" >
|
661 |
+
</div>
|
662 |
+
</div>
|
663 |
+
<div id="wsl_i18n_form">
|
664 |
+
<h3 style="margin:0px;"><?php _wsl_e( "Help us translate this page into your language", 'wordpress-social-login' ) ?></h3>
|
665 |
+
|
666 |
+
<hr />
|
667 |
+
|
668 |
+
<p><?php _wsl_e( "You can <b>translate as much you please as much as you want</b>. You don't have to translate everything in this page. Ignore any string you want or aleardy translated. You could also use this tool to fix any typo you may find or to improve the current language expressions", 'wordpress-social-login' ) ?>.</p>
|
669 |
+
|
670 |
+
<p><?php _wsl_e( "All the texts on this page are automatically extracted and generated on the form beside. If the translation tool has scapped something you may consider as irrelevant, please leave that particular field empty", 'wordpress-social-login' ) ?>.</p>
|
671 |
+
|
672 |
+
<p><?php _wsl_e( "Your contributions will be sent to the WordPress Social Login website for inclusion in future versions", 'wordpress-social-login' ) ?>.</p>
|
673 |
+
</div>
|
674 |
+
<div id="wsl_i18n">
|
675 |
+
<pre id="wsl_i18n_pre"></pre>
|
676 |
+
<hr />
|
677 |
+
<table width="100%" cellspacing="2" cellpadding="5" border="0">
|
678 |
+
<tbody>
|
679 |
+
<tr>
|
680 |
+
<td align="right"><strong><?php _wsl_e( "Target Language", 'wordpress-social-login' ) ?></strong></td>
|
681 |
+
<td>
|
682 |
+
<select name="wsl_i18n_locale" style="width:400px;"><option value="en">English (enhancement)</option><option value="af">Afrikaans</option><option value="sq">Albanian</option><option value="ar">Arabic</option><option value="eu">Basque</option><option value="be">Belarusian</option><option value="bn_IN">Bengali (India)</option><option value="bg">Bulgarian</option><option value="ca">Catalan</option><option value="zh_CN">Chinese (Simplified)</option><option value="zh_TW">Chinese (Traditional)</option><option value="cs">Czech</option><option value="da">Danish</option><option value="nl">Dutch</option><option value="eo">Esperanto</option><option value="et">Estonian</option><option value="fi">Finnish</option><option value="fr">French</option><option value="fy_NL">Frisian</option><option value="gl">Galician</option><option value="ka">Georgian</option><option value="de">German</option><option value="el">Greek</option><option value="gu_IN">Gujarati</option><option value="he">Hebrew</option><option value="hi_IN">Hindi</option><option value="hu">Hungarian</option><option value="is">Icelandic</option><option value="id">Indonesian</option><option value="ga_IE">Irish</option><option value="it">Italian</option><option value="ja">Japanese</option><option value="kn">Kannada</option><option value="ko">Korean</option><option value="ku">Kurdish</option><option value="lv">Latvian</option><option value="lt">Lithuanian</option><option value="mk">Macedonian</option><option value="mr">Marathi</option><option value="mn">Mongolian</option><option value="nb_NO">Norwegian (Bokmal)</option><option value="nn_NO">Norwegian (Lengadocian)</option><option value="oc">Occitan (Lengadocian)</option><option value="pl">Polish</option><option value="pt_BR">Portuguese (Brazilian)</option><option value="pt_PT">Portuguese (Portugal)</option><option value="pa_IN">Punjabi</option><option value="ro">Romanian</option><option value="ru">Russian</option><option value="sr">Serbian</option><option value="si">Sinhala</option><option value="sk">Slovak</option><option value="sl">Slovenian</option><option value="es">Spanish</option><option value="es_AR">Spanish (Argentina)</option><option value="sv_SE">Swedish</option><option value="te">Telgu</option><option value="th">Thai</option><option value="tr">Turkish</option><option value="uk">Ukrainian</option></select>
|
683 |
+
</td>
|
684 |
+
</tr>
|
685 |
+
<tr>
|
686 |
+
<td align="right"><strong><?php _wsl_e( "Your Name", 'wordpress-social-login' ) ?></strong><br />(<?php _wsl_e( "optional", 'wordpress-social-login' ) ?>)</td>
|
687 |
+
<td>
|
688 |
+
<input name="wsl_i18n_name" type="text" value="<?php echo htmlspecialchars( $current_user->display_name . " <" . get_bloginfo('admin_email') . ">" ); ?>" class="inputgnrc" style="width:400px;">
|
689 |
+
</td>
|
690 |
+
</tr>
|
691 |
+
<tr>
|
692 |
+
<td align="right"><strong><?php _wsl_e( "Comment", 'wordpress-social-login' ) ?></strong><br />(<?php _wsl_e( "optional", 'wordpress-social-login' ) ?>)</td>
|
693 |
+
<td>
|
694 |
+
<textarea name="wsl_i18n_comment" style="width:400px;height:60px;"></textarea>
|
695 |
+
</td>
|
696 |
+
</tr>
|
697 |
+
</tbody>
|
698 |
+
</table>
|
699 |
+
<hr />
|
700 |
+
<div style="float:right">
|
701 |
+
<a class="button-primary" href="javascript:void(0);" onClick="wsl_i18n_cla()"><?php _wsl_e( "Submit changes", 'wordpress-social-login' ) ?></a>
|
702 |
+
</div>
|
703 |
+
</div>
|
704 |
+
</form>
|
705 |
+
<script>
|
706 |
+
function wsl_i18n_cla(){
|
707 |
+
jQuery("#wsl_i18n_form").hide()
|
708 |
+
jQuery("#wsl_i18n").hide()
|
709 |
+
jQuery("#wsl_i18n_cla").show()
|
710 |
+
}
|
711 |
+
|
712 |
+
function wsl_i18n_done(){
|
713 |
+
jQuery("#wsl_i18n_form").hide()
|
714 |
+
jQuery("#wsl_i18n").hide()
|
715 |
+
jQuery("#wsl_i18n_cla").hide()
|
716 |
+
|
717 |
+
jQuery("#wsl_admin_tab_content").show()
|
718 |
+
jQuery("#l10n-footer").show()
|
719 |
+
}
|
720 |
+
|
721 |
+
function wsl_i18n(){
|
722 |
+
if(typeof jQuery=="undefined"){
|
723 |
+
alert( "Error: WordPress Social Login require jQuery to be installed on your wordpress in order to works!" )
|
724 |
+
|
725 |
+
return
|
726 |
+
}
|
727 |
+
|
728 |
+
jQuery("#wsl_admin_tab_content").hide()
|
729 |
+
jQuery("#l10n-footer").hide()
|
730 |
+
jQuery("#wsl_i18n_form").show()
|
731 |
+
jQuery("#wsl_i18n").show()
|
732 |
+
jQuery("#wsl_i18n_cla").hide()
|
733 |
+
|
734 |
+
var __wsl_texts = <?php echo json_encode ( array_keys( $WORDPRESS_SOCIAL_LOGIN_TEXTS ) ); ?>
|
735 |
+
|
736 |
+
jQuery.each( __wsl_texts, function(index, string) {
|
737 |
+
if( string.length >= 2 ){
|
738 |
+
if( string.length >= 100 ) jQuery("#wsl_i18n_pre").append( index + ".\n" + '<textarea id="wsl_i18n_target_'+ index +'" class="wsl_i18n_input" style="width:98%;height:60px;" name="wsl_i18n_target_'+ index +'">' + string + '</textarea>' + "\n" )
|
739 |
+
if( string.length < 100 ) jQuery("#wsl_i18n_pre").append( index + ".\n" + '<input id="wsl_i18n_target_'+ index +'" class="wsl_i18n_input inputgnrc" type="text" style="width:98%;" name="wsl_i18n_target_'+ index +'" value="' + string + '" >' + "\n" )
|
740 |
+
|
741 |
+
jQuery("#wsl_i18n_pre").append( '<textarea id="wsl_i18n_default_'+ index +'" style="display:none;" name="wsl_i18n_default_'+ index +'">' + string + '</textarea>' + "\n" )
|
742 |
+
}
|
743 |
+
|
744 |
+
jQuery("#wsl_i18n_target_" + index).change(function() {
|
745 |
+
jQuery(this).css( "border-color", "#C09853" )
|
746 |
+
|
747 |
+
if( jQuery(this).val() ){
|
748 |
+
jQuery(this).css( "border-color", "#468847" )
|
749 |
+
}
|
750 |
+
|
751 |
+
if( jQuery(this).val() == jQuery("#wsl_i18n_default_" + index).val() ){
|
752 |
+
jQuery(this).css( "border-color", "#DFDFDF" )
|
753 |
+
}
|
754 |
+
|
755 |
+
if( jQuery(this).val() && jQuery(this).val().length < 2 ){
|
756 |
+
jQuery(this).css( "border-color", "#B94A48" )
|
757 |
+
}
|
758 |
+
})
|
759 |
+
})
|
760 |
+
}
|
761 |
+
</script>
|
762 |
+
<div id="l10n-footer" style="float: left; display: block; ">
|
763 |
+
<br style="clear:both;" />
|
764 |
+
<hr />
|
765 |
+
<img src="<?php echo $assets_url ?>flags.png">
|
766 |
+
<a href="#wsltop" onclick="return wsl_i18n();">
|
767 |
+
<?php _wsl_e( "Help us translate this page into your language", 'wordpress-social-login' ) ?>
|
768 |
+
</a>
|
769 |
+
</div>
|
770 |
+
<?php
|
771 |
+
|
772 |
+
return;
|
773 |
+
}
|
774 |
+
|
775 |
+
// --------------------------------------------------------------------
|
includes/services/wsl.authentication.php
ADDED
@@ -0,0 +1,989 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/*!
|
3 |
+
* WordPress Social Login
|
4 |
+
*
|
5 |
+
* http://hybridauth.sourceforge.net/wsl/index.html | http://github.com/hybridauth/WordPress-Social-Login
|
6 |
+
* (c) 2011-2013 Mohamed Mrassi and contributors | http://wordpress.org/extend/plugins/wordpress-social-login/
|
7 |
+
*/
|
8 |
+
|
9 |
+
/**
|
10 |
+
* .. Here's where the dragon resides ..
|
11 |
+
*
|
12 |
+
* Authenticate users via social networks. to sum things up, here is how stuff works:
|
13 |
+
*
|
14 |
+
* [icons links] A wild visitor appear and click on one of these providers icons which will redirect him to wp-login.php
|
15 |
+
* => [wp-login.php] wp-login.php will call wsl_process_login() and attempt to authenticate the user throught Hybridauth Library;
|
16 |
+
* => [Hybridauth] <=> [Provider] Hybridauth and the Provider will have some little chat on their own;
|
17 |
+
* => [Provider] If the visitor consent and agrees to authenticate, then horray for you;
|
18 |
+
* => [wp-login.php] Provider will then redirect the user to back wp-login.php where wsl_process_login() is fired;
|
19 |
+
* => [callback URL] If things goes as expected, the wsl_process_login will log the user on your website and redirect him (again lolz) there.
|
20 |
+
*
|
21 |
+
* when wsl_process_login() is triggered, it will attempt to reconize the user.
|
22 |
+
* If he exist on the database as WSL user, then fine we cut things short.
|
23 |
+
* If not, attempt to reconize users based on his email (this only when users authenticate through Facebook, Google, Yahoo or Foursquare as these provides verified emails).
|
24 |
+
* Otherwise create new account for him.
|
25 |
+
*/
|
26 |
+
|
27 |
+
// Exit if accessed directly
|
28 |
+
if ( !defined( 'ABSPATH' ) ) exit;
|
29 |
+
|
30 |
+
// --------------------------------------------------------------------
|
31 |
+
|
32 |
+
function wsl_process_login()
|
33 |
+
{
|
34 |
+
if( ! wsl_process_login_checks() ){
|
35 |
+
return null;
|
36 |
+
}
|
37 |
+
|
38 |
+
if( $_REQUEST[ 'action' ] == "wordpress_social_authenticate" ){
|
39 |
+
wsl_process_login_auth();
|
40 |
+
}
|
41 |
+
else{
|
42 |
+
wsl_process_login_reauth();
|
43 |
+
}
|
44 |
+
}
|
45 |
+
|
46 |
+
add_action( 'init', 'wsl_process_login' );
|
47 |
+
|
48 |
+
// --------------------------------------------------------------------
|
49 |
+
|
50 |
+
function wsl_process_login_checks()
|
51 |
+
{
|
52 |
+
if( ! isset( $_REQUEST[ 'action' ] ) ){
|
53 |
+
return false;
|
54 |
+
}
|
55 |
+
|
56 |
+
if( ! in_array( $_REQUEST[ 'action' ], array( "wordpress_social_login", "wordpress_social_link", "wordpress_social_authenticate" ) ) ){
|
57 |
+
return false;
|
58 |
+
}
|
59 |
+
|
60 |
+
// dont be silly
|
61 |
+
if( $_REQUEST[ 'action' ] == "wordpress_social_link" && ! is_user_logged_in() ){
|
62 |
+
wsl_render_notices_pages( _wsl__("Bouncer say don't be silly!", 'wordpress-social-login') );
|
63 |
+
|
64 |
+
return false;
|
65 |
+
}
|
66 |
+
|
67 |
+
if( $_REQUEST[ 'action' ] == "wordpress_social_link" && get_option( 'wsl_settings_bouncer_linking_accounts_enabled' ) != 1 ){
|
68 |
+
wsl_render_notices_pages( _wsl__("Bouncer say this makes no sense.", 'wordpress-social-login') );
|
69 |
+
|
70 |
+
return false;
|
71 |
+
}
|
72 |
+
|
73 |
+
// Bouncer :: Allow authentication
|
74 |
+
if( get_option( 'wsl_settings_bouncer_authentication_enabled' ) == 2 ){
|
75 |
+
wsl_render_notices_pages( _wsl__("WSL is disabled!", 'wordpress-social-login') );
|
76 |
+
|
77 |
+
return false;
|
78 |
+
}
|
79 |
+
|
80 |
+
return true;
|
81 |
+
}
|
82 |
+
|
83 |
+
// --------------------------------------------------------------------
|
84 |
+
|
85 |
+
function wsl_process_login_auth()
|
86 |
+
{
|
87 |
+
$assets_base_url = WORDPRESS_SOCIAL_LOGIN_PLUGIN_URL . '/assets/img/';
|
88 |
+
|
89 |
+
// let display a loading message. should be better than a white screen
|
90 |
+
if( isset( $_REQUEST["provider"] ) && ! isset( $_REQUEST["redirect_to_provider"] ) ){
|
91 |
+
wsl_process_login_render_loading_page();
|
92 |
+
}
|
93 |
+
|
94 |
+
// if user select a provider to login with
|
95 |
+
// and redirect_to_provider eq ture
|
96 |
+
if( ! ( isset( $_REQUEST["provider"] ) && isset( $_REQUEST["redirect_to_provider"] ) ) ){
|
97 |
+
wsl_render_notices_pages( _wsl__("Bouncer says this makes no sense.", 'wordpress-social-login') );
|
98 |
+
|
99 |
+
return false;
|
100 |
+
}
|
101 |
+
|
102 |
+
try{
|
103 |
+
// Bouncer :: Accounts Linking is enabled
|
104 |
+
if( get_option( 'wsl_settings_bouncer_linking_accounts_enabled' ) != 1 && isset( $_REQUEST["link"] ) ){
|
105 |
+
wp_die( _wsl__("Bouncer say you are doin it wrong.", 'wordpress-social-login') );
|
106 |
+
}
|
107 |
+
|
108 |
+
if( ! isset( $_REQUEST["link"] ) && is_user_logged_in() ){
|
109 |
+
global $current_user;
|
110 |
+
get_currentuserinfo();
|
111 |
+
|
112 |
+
wp_die( sprintf( _wsl__("You are already logged in as <b>%</b>.", 'wordpress-social-login'), $current_user->display_name ) );
|
113 |
+
}
|
114 |
+
|
115 |
+
# Hybrid_Auth already used?
|
116 |
+
if ( class_exists('Hybrid_Auth', false) ) {
|
117 |
+
return wsl_render_notices_pages( _wsl__("Error: Another plugin seems to be using HybridAuth Library and made WordPress Social Login unusable. We recommand to find this plugin and to kill it with fire!", 'wordpress-social-login') );
|
118 |
+
}
|
119 |
+
|
120 |
+
// load hybridauth
|
121 |
+
require_once WORDPRESS_SOCIAL_LOGIN_ABS_PATH . "/hybridauth/Hybrid/Auth.php";
|
122 |
+
|
123 |
+
// selected provider name
|
124 |
+
$provider = @ trim( strip_tags( $_REQUEST["provider"] ) );
|
125 |
+
|
126 |
+
// build required configuratoin for this provider
|
127 |
+
if( ! get_option( 'wsl_settings_' . $provider . '_enabled' ) ){
|
128 |
+
throw new Exception( _wsl__( 'Unknown or disabled provider', 'wordpress-social-login') );
|
129 |
+
}
|
130 |
+
|
131 |
+
// default endpoint_url/callback_url
|
132 |
+
$endpoint_url = WORDPRESS_SOCIAL_LOGIN_HYBRIDAUTH_ENDPOINT_URL;
|
133 |
+
$callback_url = null; // autogenerated by hybridauth
|
134 |
+
|
135 |
+
// overwrite endpoint_url if need'd
|
136 |
+
if( get_option( 'wsl_settings_base_url' ) ){
|
137 |
+
$endpoint_url = ''; // fixme!
|
138 |
+
$callback_url = ''; // fixme!
|
139 |
+
}
|
140 |
+
|
141 |
+
// check hybridauth_base_url
|
142 |
+
if( ! strstr( $endpoint_url, "http://" ) && ! strstr( $endpoint_url, "https://" ) ){
|
143 |
+
throw new Exception( 'Invalid base_url: ' . $endpoint_url, 9 );
|
144 |
+
}
|
145 |
+
|
146 |
+
$config = array();
|
147 |
+
$config["base_url"] = $endpoint_url;
|
148 |
+
$config["providers"] = array();
|
149 |
+
$config["providers"][$provider] = array();
|
150 |
+
$config["providers"][$provider]["enabled"] = true;
|
151 |
+
|
152 |
+
// provider application id ?
|
153 |
+
if( get_option( 'wsl_settings_' . $provider . '_app_id' ) ){
|
154 |
+
$config["providers"][$provider]["keys"]["id"] = get_option( 'wsl_settings_' . $provider . '_app_id' );
|
155 |
+
}
|
156 |
+
|
157 |
+
// provider application key ?
|
158 |
+
if( get_option( 'wsl_settings_' . $provider . '_app_key' ) ){
|
159 |
+
$config["providers"][$provider]["keys"]["key"] = get_option( 'wsl_settings_' . $provider . '_app_key' );
|
160 |
+
}
|
161 |
+
|
162 |
+
// provider application secret ?
|
163 |
+
if( get_option( 'wsl_settings_' . $provider . '_app_secret' ) ){
|
164 |
+
$config["providers"][$provider]["keys"]["secret"] = get_option( 'wsl_settings_' . $provider . '_app_secret' );
|
165 |
+
}
|
166 |
+
|
167 |
+
// reset scope for if facebook
|
168 |
+
if( strtolower( $provider ) == "facebook" ){
|
169 |
+
$config["providers"][$provider]["scope"] = "email, user_about_me, user_birthday, user_hometown, user_website";
|
170 |
+
$config["providers"][$provider]["display"] = "popup";
|
171 |
+
}
|
172 |
+
|
173 |
+
// reset scope for if google
|
174 |
+
if( strtolower( $provider ) == "google" ){
|
175 |
+
$config["providers"][$provider]["scope"] = "https://www.googleapis.com/auth/userinfo.profile https://www.googleapis.com/auth/userinfo.email";
|
176 |
+
}
|
177 |
+
|
178 |
+
// Contacts import
|
179 |
+
if( get_option( 'wsl_settings_contacts_import_facebook' ) == 1 && strtolower( $provider ) == "facebook" ){
|
180 |
+
$config["providers"][$provider]["scope"] = "email, user_about_me, user_birthday, user_hometown, user_website, read_friendlists";
|
181 |
+
}
|
182 |
+
|
183 |
+
if( get_option( 'wsl_settings_contacts_import_google' ) == 1 && strtolower( $provider ) == "google" ){
|
184 |
+
$config["providers"][$provider]["scope"] = "https://www.googleapis.com/auth/userinfo.profile https://www.googleapis.com/auth/userinfo.email https://www.google.com/m8/feeds/";
|
185 |
+
}
|
186 |
+
|
187 |
+
// create an instance for Hybridauth
|
188 |
+
$hybridauth = new Hybrid_Auth( $config );
|
189 |
+
|
190 |
+
// try to authenticate the selected $provider
|
191 |
+
$params = array();
|
192 |
+
|
193 |
+
// if callback_url defined, overwrite Hybrid_Auth::getCurrentUrl();
|
194 |
+
if( $callback_url ){
|
195 |
+
$params["hauth_return_to"] = $callback_url;
|
196 |
+
}
|
197 |
+
|
198 |
+
$adapter = $hybridauth->authenticate( $provider, $params );
|
199 |
+
|
200 |
+
// further testing
|
201 |
+
if( get_option( 'wsl_settings_development_mode_enabled' ) ){
|
202 |
+
$profile = $adapter->getUserProfile( $provider );
|
203 |
+
}
|
204 |
+
|
205 |
+
if( get_option( 'wsl_settings_use_popup' ) == 1 || ! get_option( 'wsl_settings_use_popup' ) ){
|
206 |
+
?>
|
207 |
+
<html><head><script>
|
208 |
+
function init() {
|
209 |
+
window.opener.wsl_wordpress_social_login({
|
210 |
+
'action' : 'wordpress_social_login',
|
211 |
+
'provider' : '<?php echo $provider ?>'
|
212 |
+
});
|
213 |
+
|
214 |
+
window.close()
|
215 |
+
}
|
216 |
+
</script></head><body onload="init();"></body></html>
|
217 |
+
<?php
|
218 |
+
}
|
219 |
+
elseif( get_option( 'wsl_settings_use_popup' ) == 2 ){
|
220 |
+
$redirect_to = site_url();
|
221 |
+
|
222 |
+
if( isset( $_REQUEST[ 'redirect_to' ] ) ){
|
223 |
+
$redirect_to = urldecode( $_REQUEST[ 'redirect_to' ] );
|
224 |
+
}
|
225 |
+
?>
|
226 |
+
<html><head><script>
|
227 |
+
function init() { document.loginform.submit() }
|
228 |
+
</script></head><body onload="init();">
|
229 |
+
<form name="loginform" method="post" action="<?php echo site_url( 'wp-login.php', 'login_post' ); ?>">
|
230 |
+
<input type="hidden" id="redirect_to" name="redirect_to" value="<?php echo $redirect_to ?>">
|
231 |
+
<input type="hidden" id="provider" name="provider" value="<?php echo $provider ?>">
|
232 |
+
<?php
|
233 |
+
if( isset( $_REQUEST["link"] ) && (int) $_REQUEST["link"] ){
|
234 |
+
?>
|
235 |
+
<input type="hidden" id="action" name="action" value="wordpress_social_link">
|
236 |
+
<?php
|
237 |
+
} else {
|
238 |
+
?>
|
239 |
+
<input type="hidden" id="action" name="action" value="wordpress_social_login">
|
240 |
+
<?php
|
241 |
+
}
|
242 |
+
?>
|
243 |
+
</form></body></html>
|
244 |
+
<?php
|
245 |
+
}
|
246 |
+
}
|
247 |
+
catch( Exception $e ){
|
248 |
+
wsl_process_login_render_error_page( $e, $config, $hybridauth, $adapter, $profile );
|
249 |
+
}
|
250 |
+
|
251 |
+
die();
|
252 |
+
}
|
253 |
+
|
254 |
+
// --------------------------------------------------------------------
|
255 |
+
|
256 |
+
function wsl_process_login_render_error_page( $e, $config, $hybridauth, $adapter, $profile )
|
257 |
+
{
|
258 |
+
$assets_base_url = WORDPRESS_SOCIAL_LOGIN_PLUGIN_URL . '/assets/img/';
|
259 |
+
|
260 |
+
$message = _wsl__("Unspecified error!", 'wordpress-social-login');
|
261 |
+
$hint = "";
|
262 |
+
|
263 |
+
switch( $e->getCode() ){
|
264 |
+
case 0 : $message = _wsl__("Unspecified error.", 'wordpress-social-login'); break;
|
265 |
+
case 1 : $message = _wsl__("Hybriauth configuration error.", 'wordpress-social-login'); break;
|
266 |
+
case 2 : $message = _wsl__("Provider not properly configured.", 'wordpress-social-login'); break;
|
267 |
+
case 3 : $message = _wsl__("Unknown or disabled provider.", 'wordpress-social-login'); break;
|
268 |
+
case 4 : $message = _wsl__("Missing provider application credentials.", 'wordpress-social-login');
|
269 |
+
$hint = sprintf( _wsl__("<b>What does this error mean ?</b><br />Most likely, you didn't setup the correct application credentials for this provider. These credentials are required in order for <b>%s</b> users to access your website and for WordPress Social Login to work.", 'wordpress-social-login'), $provider ) . _wsl__('<br />Instructions for use can be found in the <a href="http://hybridauth.sourceforge.net/wsl/configure.html" target="_blank">User Manual</a>.', 'wordpress-social-login');
|
270 |
+
break;
|
271 |
+
case 5 : $message = _wsl__("Authentification failed. The user has canceled the authentication or the provider refused the connection.", 'wordpress-social-login'); break;
|
272 |
+
case 6 : $message = _wsl__("User profile request failed. Most likely the user is not connected to the provider and he should to authenticate again.", 'wordpress-social-login');
|
273 |
+
if( is_object( $adapter ) ) $adapter->logout();
|
274 |
+
break;
|
275 |
+
case 7 : $message = _wsl__("User not connected to the provider.", 'wordpress-social-login');
|
276 |
+
if( is_object( $adapter ) ) $adapter->logout();
|
277 |
+
break;
|
278 |
+
case 8 : $message = _wsl__("Provider does not support this feature.", 'wordpress-social-login'); break;
|
279 |
+
|
280 |
+
case 9 : $message = $e->getMessage(); break;
|
281 |
+
}
|
282 |
+
|
283 |
+
@ session_destroy();
|
284 |
+
?>
|
285 |
+
<!DOCTYPE html>
|
286 |
+
<head>
|
287 |
+
<meta name="robots" content="NOINDEX, NOFOLLOW">
|
288 |
+
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
|
289 |
+
<title></title>
|
290 |
+
<style>
|
291 |
+
HR {
|
292 |
+
width:100%;
|
293 |
+
border: 0;
|
294 |
+
border-bottom: 1px solid #ccc;
|
295 |
+
padding: 50px;
|
296 |
+
}
|
297 |
+
html {
|
298 |
+
background: #f9f9f9;
|
299 |
+
}
|
300 |
+
#wsl {
|
301 |
+
background: #fff;
|
302 |
+
color: #333;
|
303 |
+
font-family: sans-serif;
|
304 |
+
margin: 2em auto;
|
305 |
+
padding: 1em 2em;
|
306 |
+
-webkit-border-radius: 3px;
|
307 |
+
border-radius: 3px;
|
308 |
+
border: 1px solid #dfdfdf;
|
309 |
+
max-width: 700px;
|
310 |
+
font-size: 14px;
|
311 |
+
}
|
312 |
+
</style>
|
313 |
+
<head>
|
314 |
+
<body>
|
315 |
+
<div id="wsl">
|
316 |
+
<table width="100%" border="0">
|
317 |
+
<tr>
|
318 |
+
<td align="center"><br /><img src="<?php echo $assets_base_url ?>alert.png" /></td>
|
319 |
+
</tr>
|
320 |
+
<tr>
|
321 |
+
<td align="center"><br /><h4><?php _wsl_e("Something bad happen!", 'wordpress-social-login') ?></h4><br /></td>
|
322 |
+
</tr>
|
323 |
+
<tr>
|
324 |
+
<td align="center">
|
325 |
+
<p style="line-height: 20px;padding: 8px;background-color: #FFEBE8;border:1px solid #CC0000;border-radius: 3px;padding: 10px;text-align:center;">
|
326 |
+
<?php echo $message ; ?>
|
327 |
+
</p>
|
328 |
+
</td>
|
329 |
+
</tr>
|
330 |
+
|
331 |
+
<?php if( $hint ) { ?>
|
332 |
+
<tr>
|
333 |
+
<td align="center">
|
334 |
+
<p style="line-height: 25px;padding: 8px;border-top:1px solid #ccc;padding: 10px;text-align:left;">
|
335 |
+
<?php echo $hint ; ?>
|
336 |
+
</p>
|
337 |
+
</td>
|
338 |
+
</tr>
|
339 |
+
<?php } ?>
|
340 |
+
|
341 |
+
<?php
|
342 |
+
// Development mode on?
|
343 |
+
if( get_option( 'wsl_settings_development_mode_enabled' ) ){
|
344 |
+
wsl_process_login_render_debug_section( $e, $config, $hybridauth, $adapter, $profile );
|
345 |
+
}
|
346 |
+
?>
|
347 |
+
</table>
|
348 |
+
</div>
|
349 |
+
</body>
|
350 |
+
</html>
|
351 |
+
<?php
|
352 |
+
die();
|
353 |
+
}
|
354 |
+
|
355 |
+
// --------------------------------------------------------------------
|
356 |
+
|
357 |
+
function wsl_process_login_render_debug_section( $e, $config, $hybridauth, $adapter, $profile )
|
358 |
+
{
|
359 |
+
?>
|
360 |
+
<tr>
|
361 |
+
<td align="center">
|
362 |
+
<div style="padding: 5px;margin: 5px;background: none repeat scroll 0 0 #F5F5F5;border-radius:3px;">
|
363 |
+
<div id="bug_report">
|
364 |
+
<form method="post" action="http://hybridauth.sourceforge.net/reports/index.php?product=wp-plugin&v=<?php echo $_SESSION["wsl::plugin"] ?>">
|
365 |
+
<table width="90%" border="0">
|
366 |
+
<tr>
|
367 |
+
<td align="left" valign="top">
|
368 |
+
<h3>Expection</h3>
|
369 |
+
<pre style="width:800px;"><?php print_r( $e ) ?></pre>
|
370 |
+
|
371 |
+
<hr />
|
372 |
+
|
373 |
+
<h3>HybridAuth</h3>
|
374 |
+
<pre style="width:800px;"><?php print_r( array( $config, $hybridauth, $adapter, $profile ) ) ?></pre>
|
375 |
+
</td>
|
376 |
+
</tr>
|
377 |
+
<tr>
|
378 |
+
<td align="center" valign="top">
|
379 |
+
<input type="submit" style="width: 300px;height: 33px;" value="Send the error report to the developer" />
|
380 |
+
</td>
|
381 |
+
</tr>
|
382 |
+
</table>
|
383 |
+
|
384 |
+
<textarea name="report" style="display:none;"><?php echo base64_encode( print_r( array( $e, $config, $hybridauth, $adapter, $profile, $_SERVER ), TRUE ) ) ?></textarea>
|
385 |
+
</form>
|
386 |
+
<small>
|
387 |
+
<?php _wsl_e("Note: This message can be disabled from the plugin settings by setting <b>Development mode</b> to <b>Disabled</b>", 'wordpress-social-login') ?>.
|
388 |
+
</small>
|
389 |
+
</div>
|
390 |
+
</div>
|
391 |
+
</td>
|
392 |
+
</tr>
|
393 |
+
<?php
|
394 |
+
}
|
395 |
+
|
396 |
+
// --------------------------------------------------------------------
|
397 |
+
|
398 |
+
function wsl_process_login_render_loading_page()
|
399 |
+
{
|
400 |
+
$assets_base_url = WORDPRESS_SOCIAL_LOGIN_PLUGIN_URL . '/assets/img/';
|
401 |
+
|
402 |
+
// selected provider
|
403 |
+
$provider = @ trim( strip_tags( $_REQUEST["provider"] ) );
|
404 |
+
|
405 |
+
if( isset( $_REQUEST["link"] ) && (int) $_REQUEST["link"] ){
|
406 |
+
// todo
|
407 |
+
}
|
408 |
+
else{
|
409 |
+
$_SESSION["HA::STORE"] = ARRAY();
|
410 |
+
}
|
411 |
+
?>
|
412 |
+
<!DOCTYPE html>
|
413 |
+
<head>
|
414 |
+
<meta name="robots" content="NOINDEX, NOFOLLOW">
|
415 |
+
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
|
416 |
+
<title><?php _wsl_e("Redirecting...", 'wordpress-social-login') ?></title>
|
417 |
+
<head>
|
418 |
+
<script>
|
419 |
+
function init(){
|
420 |
+
setTimeout( function(){window.location.href = window.location.href + "&redirect_to_provider=true"}, 750 );
|
421 |
+
}
|
422 |
+
</script>
|
423 |
+
<style>
|
424 |
+
html {
|
425 |
+
background: #f9f9f9;
|
426 |
+
}
|
427 |
+
#wsl {
|
428 |
+
background: #fff;
|
429 |
+
color: #333;
|
430 |
+
font-family: sans-serif;
|
431 |
+
margin: 2em auto;
|
432 |
+
padding: 1em 2em;
|
433 |
+
-webkit-border-radius: 3px;
|
434 |
+
border-radius: 3px;
|
435 |
+
border: 1px solid #dfdfdf;
|
436 |
+
max-width: 700px;
|
437 |
+
font-size: 14px;
|
438 |
+
}
|
439 |
+
</style>
|
440 |
+
</head>
|
441 |
+
<body onload="init();">
|
442 |
+
<div id="wsl">
|
443 |
+
<table width="100%" border="0">
|
444 |
+
<tr>
|
445 |
+
<td align="center" height="40px"><br /><br /><?php echo sprintf( _wsl__( "Contacting <b>%s</b>, please wait...", 'wordpress-social-login'), ucfirst( $provider ) ) ?></td>
|
446 |
+
</tr>
|
447 |
+
<tr>
|
448 |
+
<td align="center" height="80px" valign="middle"><img src="<?php echo $assets_base_url ?>loading.gif" /></td>
|
449 |
+
</tr>
|
450 |
+
</table>
|
451 |
+
</div>
|
452 |
+
</body>
|
453 |
+
</html>
|
454 |
+
<?php
|
455 |
+
die();
|
456 |
+
}
|
457 |
+
|
458 |
+
// --------------------------------------------------------------------
|
459 |
+
|
460 |
+
function wsl_process_login_reauth()
|
461 |
+
{
|
462 |
+
// HOOKABLE:
|
463 |
+
do_action( "wsl_hook_process_login_before_start" );
|
464 |
+
|
465 |
+
// HOOKABLE:
|
466 |
+
$redirect_to = apply_filters("wsl_hook_process_login_alter_redirect_to", wsl_process_login_get_redirect_to() ) ;
|
467 |
+
|
468 |
+
// HOOKABLE:
|
469 |
+
$provider = apply_filters("wsl_hook_process_login_alter_provider", wsl_process_login_get_provider() ) ;
|
470 |
+
|
471 |
+
// authenticate user via a social network ( $provider )
|
472 |
+
list(
|
473 |
+
$user_id , // ..
|
474 |
+
$adapter , // ..
|
475 |
+
$hybridauth_user_profile , // ..
|
476 |
+
$hybridauth_user_id , // ..
|
477 |
+
$hybridauth_user_email , // ..
|
478 |
+
$request_user_login , // ..
|
479 |
+
$request_user_email , // ..
|
480 |
+
)
|
481 |
+
= wsl_process_login_hybridauth_authenticate( $provider, $redirect_to );
|
482 |
+
|
483 |
+
// if user found on database
|
484 |
+
if( $user_id ){
|
485 |
+
$user_data = get_userdata( $user_id );
|
486 |
+
$user_login = $user_data->user_login;
|
487 |
+
$user_email = $hybridauth_user_profile->email;
|
488 |
+
}
|
489 |
+
|
490 |
+
// otherwise, create new user and associate provider identity
|
491 |
+
else{
|
492 |
+
list(
|
493 |
+
$user_id , // ..
|
494 |
+
$user_login , // ..
|
495 |
+
$user_email , // ..
|
496 |
+
)
|
497 |
+
= wsl_process_login_create_wp_user( $provider, $hybridauth_user_profile, $request_user_login, $request_user_email );
|
498 |
+
}
|
499 |
+
|
500 |
+
// There was a bug when *_create_wp_user returned WP_Error, so just in case
|
501 |
+
if( ! is_integer( $user_id ) ){
|
502 |
+
return wsl_render_notices_pages( _wsl__("Invalid user_id returned by create_wp_user.", 'wordpress-social-login') );
|
503 |
+
}
|
504 |
+
|
505 |
+
// finally create a wp session for the user
|
506 |
+
return wsl_process_login_authenticate_wp_user( $user_id, $provider, $redirect_to, $adapter, $hybridauth_user_profile );
|
507 |
+
}
|
508 |
+
|
509 |
+
// --------------------------------------------------------------------
|
510 |
+
|
511 |
+
function wsl_process_login_get_redirect_to()
|
512 |
+
{
|
513 |
+
if ( isset( $_REQUEST[ 'redirect_to' ] ) && $_REQUEST[ 'redirect_to' ] != '' ){
|
514 |
+
$redirect_to = $_REQUEST[ 'redirect_to' ];
|
515 |
+
|
516 |
+
// Redirect to https if user wants ssl
|
517 |
+
if ( isset( $secure_cookie ) && $secure_cookie && false !== strpos( $redirect_to, 'wp-admin') ){
|
518 |
+
$redirect_to = preg_replace( '|^http://|', 'https://', $redirect_to );
|
519 |
+
}
|
520 |
+
|
521 |
+
if ( strpos( $redirect_to, 'wp-admin') && ! is_user_logged_in() ){
|
522 |
+
$redirect_to = get_option( 'wsl_settings_redirect_url' );
|
523 |
+
}
|
524 |
+
|
525 |
+
if ( strpos( $redirect_to, 'wp-login.php') ){
|
526 |
+
$redirect_to = get_option( 'wsl_settings_redirect_url' );
|
527 |
+
}
|
528 |
+
}
|
529 |
+
|
530 |
+
if( get_option( 'wsl_settings_redirect_url' ) != site_url() ){
|
531 |
+
$redirect_to = get_option( 'wsl_settings_redirect_url' );
|
532 |
+
}
|
533 |
+
|
534 |
+
if( empty( $redirect_to ) ){
|
535 |
+
$redirect_to = get_option( 'wsl_settings_redirect_url' );
|
536 |
+
}
|
537 |
+
|
538 |
+
if( empty( $redirect_to ) ){
|
539 |
+
$redirect_to = site_url();
|
540 |
+
}
|
541 |
+
|
542 |
+
return $redirect_to;
|
543 |
+
}
|
544 |
+
|
545 |
+
// --------------------------------------------------------------------
|
546 |
+
|
547 |
+
function wsl_process_login_get_provider()
|
548 |
+
{
|
549 |
+
// selected provider name
|
550 |
+
$provider = @ trim( strip_tags( $_REQUEST["provider"] ) );
|
551 |
+
|
552 |
+
return $provider;
|
553 |
+
}
|
554 |
+
|
555 |
+
// --------------------------------------------------------------------
|
556 |
+
|
557 |
+
function wsl_process_login_hybridauth_authenticate( $provider, $redirect_to )
|
558 |
+
{
|
559 |
+
try{
|
560 |
+
# Hybrid_Auth already used?
|
561 |
+
if ( class_exists('Hybrid_Auth', false) ) {
|
562 |
+
return wsl_render_notices_pages( _wsl__("Error: Another plugin seems to be using HybridAuth Library and made WordPress Social Login unusable. We recommand to find this plugin and to kill it with fire!", 'wordpress-social-login') );
|
563 |
+
}
|
564 |
+
|
565 |
+
// load hybridauth
|
566 |
+
require_once WORDPRESS_SOCIAL_LOGIN_ABS_PATH . "/hybridauth/Hybrid/Auth.php";
|
567 |
+
|
568 |
+
// build required configuratoin for this provider
|
569 |
+
if( ! get_option( 'wsl_settings_' . $provider . '_enabled' ) ){
|
570 |
+
throw new Exception( 'Unknown or disabled provider' );
|
571 |
+
}
|
572 |
+
|
573 |
+
$config = array();
|
574 |
+
$config["providers"] = array();
|
575 |
+
$config["providers"][$provider] = array();
|
576 |
+
$config["providers"][$provider]["enabled"] = true;
|
577 |
+
|
578 |
+
// provider application id ?
|
579 |
+
if( get_option( 'wsl_settings_' . $provider . '_app_id' ) ){
|
580 |
+
$config["providers"][$provider]["keys"]["id"] = get_option( 'wsl_settings_' . $provider . '_app_id' );
|
581 |
+
}
|
582 |
+
|
583 |
+
// provider application key ?
|
584 |
+
if( get_option( 'wsl_settings_' . $provider . '_app_key' ) ){
|
585 |
+
$config["providers"][$provider]["keys"]["key"] = get_option( 'wsl_settings_' . $provider . '_app_key' );
|
586 |
+
}
|
587 |
+
|
588 |
+
// provider application secret ?
|
589 |
+
if( get_option( 'wsl_settings_' . $provider . '_app_secret' ) ){
|
590 |
+
$config["providers"][$provider]["keys"]["secret"] = get_option( 'wsl_settings_' . $provider . '_app_secret' );
|
591 |
+
}
|
592 |
+
|
593 |
+
// create an instance for Hybridauth
|
594 |
+
$hybridauth = new Hybrid_Auth( $config );
|
595 |
+
|
596 |
+
// try to authenticate the selected $provider
|
597 |
+
if( $hybridauth->isConnectedWith( $provider ) ){
|
598 |
+
$adapter = $hybridauth->getAdapter( $provider );
|
599 |
+
|
600 |
+
$hybridauth_user_profile = $adapter->getUserProfile();
|
601 |
+
|
602 |
+
// check hybridauth user email
|
603 |
+
$hybridauth_user_id = (int) wsl_get_user_by_meta( $provider, $hybridauth_user_profile->identifier );
|
604 |
+
$hybridauth_user_email = sanitize_email( $hybridauth_user_profile->email );
|
605 |
+
$hybridauth_user_login = sanitize_user( $hybridauth_user_profile->displayName );
|
606 |
+
|
607 |
+
$request_user_login = "";
|
608 |
+
$request_user_email = "";
|
609 |
+
|
610 |
+
# {{{ linking new accounts
|
611 |
+
// Bouncer :: Accounts Linking is enabled
|
612 |
+
if( get_option( 'wsl_settings_bouncer_linking_accounts_enabled' ) == 1 ){
|
613 |
+
// if user is linking account
|
614 |
+
// . we DO import contacts
|
615 |
+
// . we DO store the user profile
|
616 |
+
//
|
617 |
+
// . we DONT create another entry on user table
|
618 |
+
// . we DONT create nor update his data on usermeata table
|
619 |
+
if( $_REQUEST[ 'action' ] == "wordpress_social_link" ){
|
620 |
+
global $current_user;
|
621 |
+
|
622 |
+
get_currentuserinfo();
|
623 |
+
$user_id = $current_user->ID;
|
624 |
+
|
625 |
+
return wsl_process_login_authenticate_wp_user_linked_account( $user_id, $provider, $redirect_to, $adapter, $hybridauth_user_profile );
|
626 |
+
}
|
627 |
+
|
628 |
+
// check if connected user is linked account
|
629 |
+
$linked_account = wsl_get_user_linked_account_by_provider_and_identifier( $provider, $hybridauth_user_profile->identifier );
|
630 |
+
|
631 |
+
// if linked account found, we connect the actual user
|
632 |
+
if( $linked_account ){
|
633 |
+
if( count( $linked_account ) > 1 ){
|
634 |
+
return wsl_render_notices_pages( _wsl__("This $provider is linked to many accounts!", 'wordpress-social-login') );
|
635 |
+
}
|
636 |
+
|
637 |
+
$user_id = $linked_account[0]->user_id;
|
638 |
+
|
639 |
+
if( ! $user_id ){
|
640 |
+
return wsl_render_notices_pages( _wsl__("Something wrong!", 'wordpress-social-login') );
|
641 |
+
}
|
642 |
+
|
643 |
+
return wsl_process_login_authenticate_wp_user( $user_id, $provider, $redirect_to, $adapter, $hybridauth_user_profile );
|
644 |
+
}
|
645 |
+
}
|
646 |
+
# }}} linking new accounts
|
647 |
+
|
648 |
+
# {{{ module Bouncer
|
649 |
+
// Bouncer :: Filters by emails domains name
|
650 |
+
if( get_option( 'wsl_settings_bouncer_new_users_restrict_domain_enabled' ) == 1 ){
|
651 |
+
if( empty( $hybridauth_user_email ) ){
|
652 |
+
return wsl_render_notices_pages( get_option( 'wsl_settings_bouncer_new_users_restrict_domain_text_bounce' ) );
|
653 |
+
}
|
654 |
+
|
655 |
+
$list = get_option( 'wsl_settings_bouncer_new_users_restrict_domain_list' );
|
656 |
+
$list = preg_split( '/$\R?^/m', $list );
|
657 |
+
|
658 |
+
$current = strstr( $hybridauth_user_email, '@' );
|
659 |
+
|
660 |
+
$shall_pass = false;
|
661 |
+
foreach( $list as $item ){
|
662 |
+
if( trim( strtolower( "@$item" ) ) == strtolower( $current ) ){
|
663 |
+
$shall_pass = true;
|
664 |
+
}
|
665 |
+
}
|
666 |
+
|
667 |
+
if( ! $shall_pass ){
|
668 |
+
return wsl_render_notices_pages( get_option( 'wsl_settings_bouncer_new_users_restrict_domain_text_bounce' ) );
|
669 |
+
}
|
670 |
+
}
|
671 |
+
|
672 |
+
// Bouncer :: Filters by e-mails addresses
|
673 |
+
if( get_option( 'wsl_settings_bouncer_new_users_restrict_email_enabled' ) == 1 ){
|
674 |
+
if( empty( $hybridauth_user_email ) ){
|
675 |
+
return wsl_render_notices_pages( get_option( 'wsl_settings_bouncer_new_users_restrict_email_text_bounce' ) );
|
676 |
+
}
|
677 |
+
|
678 |
+
$list = get_option( 'wsl_settings_bouncer_new_users_restrict_email_list' );
|
679 |
+
$list = preg_split( '/$\R?^/m', $list );
|
680 |
+
|
681 |
+
$shall_pass = false;
|
682 |
+
foreach( $list as $item ){
|
683 |
+
if( trim( strtolower( $item ) ) == strtolower( $hybridauth_user_email ) ){
|
684 |
+
$shall_pass = true;
|
685 |
+
}
|
686 |
+
}
|
687 |
+
|
688 |
+
if( ! $shall_pass ){
|
689 |
+
return wsl_render_notices_pages( get_option( 'wsl_settings_bouncer_new_users_restrict_email_text_bounce' ) );
|
690 |
+
}
|
691 |
+
}
|
692 |
+
|
693 |
+
// Bouncer :: Filters by profile urls
|
694 |
+
if( get_option( 'wsl_settings_bouncer_new_users_restrict_profile_enabled' ) == 1 ){
|
695 |
+
$list = get_option( 'wsl_settings_bouncer_new_users_restrict_profile_list' );
|
696 |
+
$list = preg_split( '/$\R?^/m', $list );
|
697 |
+
|
698 |
+
$shall_pass = false;
|
699 |
+
foreach( $list as $item ){
|
700 |
+
if( trim( strtolower( $item ) ) == strtolower( $hybridauth_user_profile->profileURL ) ){
|
701 |
+
$shall_pass = true;
|
702 |
+
}
|
703 |
+
}
|
704 |
+
|
705 |
+
if( ! $shall_pass ){
|
706 |
+
return wsl_render_notices_pages( get_option( 'wsl_settings_bouncer_new_users_restrict_profile_text_bounce' ) );
|
707 |
+
}
|
708 |
+
}
|
709 |
+
|
710 |
+
// if user do not exist
|
711 |
+
if( ! $hybridauth_user_id ){
|
712 |
+
// Bouncer :: Accept new registrations
|
713 |
+
if( get_option( 'wsl_settings_bouncer_registration_enabled' ) == 2 ){
|
714 |
+
return wsl_render_notices_pages( _wsl__("registration is now closed!", 'wordpress-social-login') );
|
715 |
+
}
|
716 |
+
|
717 |
+
// Bouncer :: Profile Completion
|
718 |
+
if(
|
719 |
+
( get_option( 'wsl_settings_bouncer_profile_completion_require_email' ) == 1 && empty( $hybridauth_user_email ) ) ||
|
720 |
+
get_option( 'wsl_settings_bouncer_profile_completion_change_username' ) == 1
|
721 |
+
){
|
722 |
+
do
|
723 |
+
{
|
724 |
+
list( $shall_pass, $request_user_login, $request_user_email ) = wsl_process_login_complete_registration( $provider, $redirect_to, $hybridauth_user_email, $hybridauth_user_login );
|
725 |
+
}
|
726 |
+
while( ! $shall_pass );
|
727 |
+
}
|
728 |
+
}
|
729 |
+
# }}} module Bouncer
|
730 |
+
}
|
731 |
+
else{
|
732 |
+
throw new Exception( 'User not connected with ' . $provider . '!' );
|
733 |
+
}
|
734 |
+
}
|
735 |
+
catch( Exception $e ){
|
736 |
+
return wsl_render_notices_pages( sprintf( _wsl__("Unspecified error. #%d", 'wordpress-social-login'), $e->getCode() ) );
|
737 |
+
}
|
738 |
+
|
739 |
+
$user_id = null;
|
740 |
+
|
741 |
+
// if the user email is verified, then try to map to legacy account if exist
|
742 |
+
// > Currently only Facebook, Google, Yahaoo and Foursquare do provide the verified user email.
|
743 |
+
if ( ! empty( $hybridauth_user_profile->emailVerified ) ){
|
744 |
+
$user_id = (int) email_exists( $hybridauth_user_profile->emailVerified );
|
745 |
+
}
|
746 |
+
|
747 |
+
// try to get user by meta if not
|
748 |
+
if( ! $user_id ){
|
749 |
+
$user_id = (int) wsl_get_user_by_meta( $provider, $hybridauth_user_profile->identifier );
|
750 |
+
}
|
751 |
+
|
752 |
+
return array(
|
753 |
+
$user_id,
|
754 |
+
$adapter,
|
755 |
+
$hybridauth_user_profile,
|
756 |
+
$hybridauth_user_id,
|
757 |
+
$hybridauth_user_email,
|
758 |
+
$request_user_login,
|
759 |
+
$request_user_email,
|
760 |
+
);
|
761 |
+
}
|
762 |
+
|
763 |
+
// --------------------------------------------------------------------
|
764 |
+
|
765 |
+
function wsl_process_login_create_wp_user( $provider, $hybridauth_user_profile, $request_user_login, $request_user_email )
|
766 |
+
{
|
767 |
+
// HOOKABLE: any action to fire right before a user created on database
|
768 |
+
do_action( 'wsl_hook_process_login_before_create_wp_user' );
|
769 |
+
|
770 |
+
$user_login = null;
|
771 |
+
$user_email = null;
|
772 |
+
|
773 |
+
// if coming from "complete registration form"
|
774 |
+
if( $request_user_email && $request_user_login ){
|
775 |
+
$user_login = $request_user_login;
|
776 |
+
$user_email = $request_user_email;
|
777 |
+
}
|
778 |
+
|
779 |
+
# else, validate/generate the login and user email
|
780 |
+
else{
|
781 |
+
// generate a valid user login
|
782 |
+
$user_login = trim( str_replace( ' ', '_', strtolower( $hybridauth_user_profile->displayName ) ) );
|
783 |
+
$user_email = $hybridauth_user_profile->email;
|
784 |
+
|
785 |
+
if( empty( $user_login ) ){
|
786 |
+
$user_login = trim( $hybridauth_user_profile->lastName . " " . $hybridauth_user_profile->firstName );
|
787 |
+
}
|
788 |
+
|
789 |
+
if( empty( $user_login ) ){
|
790 |
+
$user_login = strtolower( $provider ) . "_user_" . md5( $hybridauth_user_profile->identifier );
|
791 |
+
}
|
792 |
+
|
793 |
+
// user name should be unique
|
794 |
+
if ( username_exists ( $user_login ) ){
|
795 |
+
$i = 1;
|
796 |
+
$user_login_tmp = $user_login;
|
797 |
+
|
798 |
+
do
|
799 |
+
{
|
800 |
+
$user_login_tmp = $user_login . "_" . ($i++);
|
801 |
+
} while (username_exists ($user_login_tmp));
|
802 |
+
|
803 |
+
$user_login = $user_login_tmp;
|
804 |
+
}
|
805 |
+
|
806 |
+
// generate an email if none
|
807 |
+
if ( ! isset ( $user_email ) OR ! is_email( $user_email ) ){
|
808 |
+
$user_email = strtolower( $provider . "_user_" . $user_login ) . "@example.com";
|
809 |
+
}
|
810 |
+
|
811 |
+
// email should be unique
|
812 |
+
if ( email_exists ( $user_email ) ){
|
813 |
+
do
|
814 |
+
{
|
815 |
+
$user_email = md5(uniqid(wp_rand(10000,99000)))."@example.com";
|
816 |
+
} while( email_exists( $user_email ) );
|
817 |
+
}
|
818 |
+
|
819 |
+
$user_login = sanitize_user ($user_login, true);
|
820 |
+
|
821 |
+
if( ! validate_username( $user_login ) ){
|
822 |
+
$user_login = strtolower( $provider ) . "_user_" . md5( $hybridauth_user_profile->identifier );
|
823 |
+
}
|
824 |
+
}
|
825 |
+
|
826 |
+
$display_name = $hybridauth_user_profile->displayName;
|
827 |
+
|
828 |
+
if( $request_user_login || empty ( $display_name ) ){
|
829 |
+
$display_name = $user_login;
|
830 |
+
}
|
831 |
+
|
832 |
+
$userdata = array(
|
833 |
+
'user_login' => $user_login,
|
834 |
+
'user_email' => $user_email,
|
835 |
+
|
836 |
+
'display_name' => $display_name,
|
837 |
+
|
838 |
+
'first_name' => $hybridauth_user_profile->firstName,
|
839 |
+
'last_name' => $hybridauth_user_profile->lastName,
|
840 |
+
'user_url' => $hybridauth_user_profile->profileURL,
|
841 |
+
'description' => $hybridauth_user_profile->description,
|
842 |
+
|
843 |
+
'user_pass' => wp_generate_password()
|
844 |
+
);
|
845 |
+
|
846 |
+
// Bouncer :: Membership level
|
847 |
+
if( get_option( 'wsl_settings_bouncer_new_users_membership_default_role' ) != "default" ){
|
848 |
+
$userdata['role'] = get_option( 'wsl_settings_bouncer_new_users_membership_default_role' );
|
849 |
+
}
|
850 |
+
|
851 |
+
// Bouncer :: User Moderation : None
|
852 |
+
if( get_option( 'wsl_settings_bouncer_new_users_moderation_level' ) == 1 ){
|
853 |
+
// well do nothing..
|
854 |
+
}
|
855 |
+
|
856 |
+
// Bouncer :: User Moderation : Yield to Theme My Login plugin
|
857 |
+
if( get_option( 'wsl_settings_bouncer_new_users_moderation_level' ) > 100 ){
|
858 |
+
$userdata['role'] = "pending";
|
859 |
+
}
|
860 |
+
|
861 |
+
// HOOKABLE: change the user data
|
862 |
+
$userdata = apply_filters( 'wsl_hook_process_login_alter_userdata', $userdata, $provider, $hybridauth_user_profile );
|
863 |
+
|
864 |
+
// HOOKABLE: any action to fire right before a user created on database
|
865 |
+
do_action( 'wsl_hook_process_login_before_insert_user', $userdata, $provider, $hybridauth_user_profile );
|
866 |
+
|
867 |
+
// HOOKABLE: delegate user insert to a custom function
|
868 |
+
$user_id = apply_filters( 'wsl_hook_process_login_alter_insert_user', $userdata, $provider, $hybridauth_user_profile );
|
869 |
+
|
870 |
+
// Create a new user
|
871 |
+
if( ! $user_id || ! is_integer( $user_id ) ){
|
872 |
+
$user_id = wp_insert_user( $userdata );
|
873 |
+
}
|
874 |
+
|
875 |
+
// update user metadata
|
876 |
+
if( $user_id && is_integer( $user_id ) ){
|
877 |
+
update_user_meta( $user_id, $provider, $hybridauth_user_profile->identifier );
|
878 |
+
}
|
879 |
+
|
880 |
+
// do not continue without user_id or we'll edit god knows what
|
881 |
+
else {
|
882 |
+
if( is_wp_error( $user_id ) ){
|
883 |
+
return wsl_render_notices_pages( _wsl__("An error occurred while creating a new user!" . $user_id->get_error_message(), 'wordpress-social-login') );
|
884 |
+
}
|
885 |
+
|
886 |
+
return wsl_render_notices_pages( _wsl__("An error occurred while creating a new user!", 'wordpress-social-login') );
|
887 |
+
}
|
888 |
+
|
889 |
+
// Send notifications
|
890 |
+
if ( get_option( 'wsl_settings_users_notification' ) == 1 ){
|
891 |
+
wsl_admin_notification( $user_id, $provider );
|
892 |
+
}
|
893 |
+
|
894 |
+
// HOOKABLE: any action to fire right after a user created on database
|
895 |
+
do_action( 'wsl_hook_process_login_after_create_wp_user', $user_id, $provider, $hybridauth_user_profile );
|
896 |
+
|
897 |
+
return array(
|
898 |
+
$user_id,
|
899 |
+
$user_login,
|
900 |
+
$user_email
|
901 |
+
);
|
902 |
+
}
|
903 |
+
|
904 |
+
// --------------------------------------------------------------------
|
905 |
+
|
906 |
+
function wsl_process_login_authenticate_wp_user( $user_id, $provider, $redirect_to, $adapter, $hybridauth_user_profile )
|
907 |
+
{
|
908 |
+
// There was a bug when this function received non-integer user_id and updated random users, let's be safe
|
909 |
+
if( !is_integer( $user_id ) ){
|
910 |
+
return wsl_render_notices_pages( _wsl__("Invalid user_id", 'wordpress-social-login') );
|
911 |
+
}
|
912 |
+
|
913 |
+
// calculate user age
|
914 |
+
$user_age = $hybridauth_user_profile->age;
|
915 |
+
|
916 |
+
// not that precise you say... well welcome to my world
|
917 |
+
if( ! $user_age && (int) $hybridauth_user_profile->birthYear ){
|
918 |
+
$user_age = (int) date("Y") - (int) $hybridauth_user_profile->birthYear;
|
919 |
+
}
|
920 |
+
|
921 |
+
// update some stuff
|
922 |
+
$newdata['user_id'] = $user_id; //not to be changed
|
923 |
+
$newdata['user'] = $provider;
|
924 |
+
$newdata['user_gender'] = $hybridauth_user_profile->gender;
|
925 |
+
$newdata['user_age'] = $user_age;
|
926 |
+
$newdata['user_image'] = $hybridauth_user_profile->photoURL;
|
927 |
+
|
928 |
+
// HOOKABLE:
|
929 |
+
$newdata = apply_filters( 'wsl_hook_process_login_alter_update_userdata', $newdata, $hybridauth_user_profile, $provider );
|
930 |
+
|
931 |
+
update_user_meta ( $user_id, 'wsl_user' , $newdata['user'] );
|
932 |
+
update_user_meta ( $user_id, 'wsl_user_gender', $newdata['user_gender'] );
|
933 |
+
update_user_meta ( $user_id, 'wsl_user_age' , $newdata['user_age'] );
|
934 |
+
update_user_meta ( $user_id, 'wsl_user_image' , $newdata['user_image'] );
|
935 |
+
|
936 |
+
// launch contact import if enabled
|
937 |
+
wsl_import_user_contacts( $provider, $adapter, $user_id );
|
938 |
+
|
939 |
+
// store user hybridauth user profile if needed
|
940 |
+
wsl_store_hybridauth_user_data( $user_id, $provider, $hybridauth_user_profile );
|
941 |
+
|
942 |
+
// Bouncer :: User Moderation : E-mail Confirmation � Yield to Theme My Login plugin
|
943 |
+
if( get_option( 'wsl_settings_bouncer_new_users_moderation_level' ) == 101 ){
|
944 |
+
$redirect_to = site_url( 'wp-login.php', 'login_post' ) . ( strpos( site_url( 'wp-login.php', 'login_post' ), '?' ) ? '&' : '?' ) . "pending=activation";
|
945 |
+
|
946 |
+
@ Theme_My_Login_User_Moderation::new_user_activation_notification( $user_id );
|
947 |
+
}
|
948 |
+
|
949 |
+
// Bouncer :: User Moderation : Admin Approval � Yield to Theme My Login plugin
|
950 |
+
elseif( get_option( 'wsl_settings_bouncer_new_users_moderation_level' ) == 102 ){
|
951 |
+
$redirect_to = site_url( 'wp-login.php', 'login_post' ) . ( strpos( site_url( 'wp-login.php', 'login_post' ), '?' ) ? '&' : '?' ) . "pending=approval";
|
952 |
+
}
|
953 |
+
|
954 |
+
// otherwise, let him go..
|
955 |
+
else{
|
956 |
+
// HOOKABLE:
|
957 |
+
do_action( "wsl_hook_process_login_before_set_auth_cookie", $user_id, $provider, $hybridauth_user_profile );
|
958 |
+
|
959 |
+
// That's it. create a session for user_id and redirect him to redirect_to
|
960 |
+
wp_set_auth_cookie( $user_id );
|
961 |
+
}
|
962 |
+
|
963 |
+
// HOOKABLE:
|
964 |
+
do_action( "wsl_hook_process_login_before_redirect", $user_id, $provider, $hybridauth_user_profile );
|
965 |
+
|
966 |
+
wp_safe_redirect( $redirect_to );
|
967 |
+
|
968 |
+
exit();
|
969 |
+
}
|
970 |
+
|
971 |
+
// --------------------------------------------------------------------
|
972 |
+
|
973 |
+
function wsl_process_login_authenticate_wp_user_linked_account( $user_id, $provider, $redirect_to, $hybridauth_user_profile )
|
974 |
+
{
|
975 |
+
// launch contact import if enabled
|
976 |
+
wsl_import_user_contacts( $provider, $adapter, $user_id );
|
977 |
+
|
978 |
+
// store user hybridauth user profile if needed
|
979 |
+
wsl_store_hybridauth_user_data( $user_id, $provider, $hybridauth_user_profile );
|
980 |
+
|
981 |
+
// HOOKABLE:
|
982 |
+
do_action( "wsl_hook_process_login_linked_account_before_redirect", $user_id, $provider, $hybridauth_user_profile );
|
983 |
+
|
984 |
+
wp_safe_redirect( $redirect_to );
|
985 |
+
|
986 |
+
exit();
|
987 |
+
}
|
988 |
+
|
989 |
+
// --------------------------------------------------------------------
|
includes/services/wsl.mail.notification.php
ADDED
@@ -0,0 +1,44 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/*!
|
3 |
+
* WordPress Social Login
|
4 |
+
*
|
5 |
+
* http://hybridauth.sourceforge.net/wsl/index.html | http://github.com/hybridauth/WordPress-Social-Login
|
6 |
+
* (c) 2011-2013 Mohamed Mrassi and contributors | http://wordpress.org/extend/plugins/wordpress-social-login/
|
7 |
+
*/
|
8 |
+
|
9 |
+
/**
|
10 |
+
* Email notifications to send. so far only the admin one is implemented
|
11 |
+
*/
|
12 |
+
|
13 |
+
// Exit if accessed directly
|
14 |
+
if ( !defined( 'ABSPATH' ) ) exit;
|
15 |
+
|
16 |
+
// --------------------------------------------------------------------
|
17 |
+
|
18 |
+
/**
|
19 |
+
* send a notification to blog administrator when a new user register using WSL
|
20 |
+
* again borrowed from http://wordpress.org/extend/plugins/oa-social-login/
|
21 |
+
*/
|
22 |
+
function wsl_admin_notification( $user_id, $provider )
|
23 |
+
{
|
24 |
+
//Get the user details
|
25 |
+
$user = new WP_User($user_id);
|
26 |
+
$user_login = stripslashes($user->user_login);
|
27 |
+
|
28 |
+
// The blogname option is escaped with esc_html on the way into the database
|
29 |
+
// in sanitize_option we want to reverse this for the plain text arena of emails.
|
30 |
+
$blogname = wp_specialchars_decode(get_option('blogname'), ENT_QUOTES);
|
31 |
+
|
32 |
+
$message = sprintf(__('New user registration on your site: %s', 'wordpress-social-login'), $blogname ) . "\r\n\r\n";
|
33 |
+
$message .= sprintf(__('Username: %s' , 'wordpress-social-login'), $user_login ) . "\r\n";
|
34 |
+
$message .= sprintf(__('Provider: %s' , 'wordpress-social-login'), $provider ) . "\r\n";
|
35 |
+
$message .= sprintf(__('Profile: %s' , 'wordpress-social-login'), $user->user_url ) . "\r\n";
|
36 |
+
$message .= sprintf(__('Email: %s' , 'wordpress-social-login'), $user->user_email) . "\r\n";
|
37 |
+
$message .= "\r\n--\r\n";
|
38 |
+
$message .= "WordPress Social Login\r\n";
|
39 |
+
$message .= "http://wordpress.org/extend/plugins/wordpress-social-login/\r\n";
|
40 |
+
|
41 |
+
@wp_mail(get_option('admin_email'), '[WordPress Social Login] '.sprintf(__('[%s] New User Registration', 'wordpress-social-login'), $blogname), $message);
|
42 |
+
}
|
43 |
+
|
44 |
+
// --------------------------------------------------------------------
|
includes/services/wsl.user.avatar.php
ADDED
@@ -0,0 +1,77 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/*!
|
3 |
+
* WordPress Social Login
|
4 |
+
*
|
5 |
+
* http://hybridauth.sourceforge.net/wsl/index.html | http://github.com/hybridauth/WordPress-Social-Login
|
6 |
+
* (c) 2011-2013 Mohamed Mrassi and contributors | http://wordpress.org/extend/plugins/wordpress-social-login/
|
7 |
+
*/
|
8 |
+
|
9 |
+
/**
|
10 |
+
* Displaying the user avatar when available on the comment section
|
11 |
+
*/
|
12 |
+
|
13 |
+
// Exit if accessed directly
|
14 |
+
if ( !defined( 'ABSPATH' ) ) exit;
|
15 |
+
|
16 |
+
// --------------------------------------------------------------------
|
17 |
+
|
18 |
+
/**
|
19 |
+
* wsl_user_custom_avatar is borrowed from http://wordpress.org/extend/plugins/oa-social-login/
|
20 |
+
* thanks a million mate
|
21 |
+
*/
|
22 |
+
function wsl_user_custom_avatar($avatar, $mixed, $size, $default, $alt)
|
23 |
+
{
|
24 |
+
//Check if avatars are enabled
|
25 |
+
if( get_option ( 'wsl_settings_users_avatars' ) )
|
26 |
+
{
|
27 |
+
//Current comment
|
28 |
+
global $comment;
|
29 |
+
|
30 |
+
//Chosen user
|
31 |
+
$user_id = null;
|
32 |
+
|
33 |
+
//Check if we have an user identifier
|
34 |
+
if (is_numeric ($mixed))
|
35 |
+
{
|
36 |
+
if ($mixed > 0)
|
37 |
+
{
|
38 |
+
$user_id = $mixed;
|
39 |
+
}
|
40 |
+
}
|
41 |
+
//Check if we are in a comment
|
42 |
+
elseif (is_object ($comment) AND property_exists ($comment, 'user_id') AND !empty ($comment->user_id))
|
43 |
+
{
|
44 |
+
$user_id = $comment->user_id;
|
45 |
+
}
|
46 |
+
//Check if we have an email
|
47 |
+
elseif (is_string ($mixed) && ($user = get_user_by ('email', $mixed)))
|
48 |
+
{
|
49 |
+
$user_id = $user->ID;
|
50 |
+
}
|
51 |
+
//Check if we have an user object
|
52 |
+
else if (is_object ($mixed))
|
53 |
+
{
|
54 |
+
if (property_exists ($mixed, 'user_id') AND is_numeric ($mixed->user_id))
|
55 |
+
{
|
56 |
+
$user_id = $mixed->user_id;
|
57 |
+
}
|
58 |
+
}
|
59 |
+
|
60 |
+
//User found?
|
61 |
+
if ( $user_id )
|
62 |
+
{
|
63 |
+
$user_thumbnail = get_user_meta ( $user_id, 'wsl_user_image', true );
|
64 |
+
|
65 |
+
if ( $user_thumbnail )
|
66 |
+
{
|
67 |
+
return '<img src="' . $user_thumbnail . '" class="avatar avatar-wordpress-social-login avatar-' . $size . ' photo" height="' . $size . '" width="' . $size . '" />';
|
68 |
+
}
|
69 |
+
}
|
70 |
+
}
|
71 |
+
|
72 |
+
return $avatar;
|
73 |
+
}
|
74 |
+
|
75 |
+
add_filter( 'get_avatar', 'wsl_user_custom_avatar', 10, 5 );
|
76 |
+
|
77 |
+
// --------------------------------------------------------------------
|
includes/services/wsl.user.data.php
ADDED
@@ -0,0 +1,257 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/*!
|
3 |
+
* WordPress Social Login
|
4 |
+
*
|
5 |
+
* http://hybridauth.sourceforge.net/wsl/index.html | http://github.com/hybridauth/WordPress-Social-Login
|
6 |
+
* (c) 2011-2013 Mohamed Mrassi and contributors | http://wordpress.org/extend/plugins/wordpress-social-login/
|
7 |
+
*/
|
8 |
+
|
9 |
+
/**
|
10 |
+
* User data functions (database related)
|
11 |
+
*/
|
12 |
+
|
13 |
+
// Exit if accessed directly
|
14 |
+
if ( !defined( 'ABSPATH' ) ) exit;
|
15 |
+
|
16 |
+
// --------------------------------------------------------------------
|
17 |
+
|
18 |
+
/**
|
19 |
+
* Return all user prodile stored on wslusersprofiles
|
20 |
+
*/
|
21 |
+
function wsl_get_user_linked_account_by_user_id( $user_id )
|
22 |
+
{
|
23 |
+
global $wpdb;
|
24 |
+
|
25 |
+
$sql = "SELECT * FROM `{$wpdb->prefix}wslusersprofiles` where user_id = '$user_id'";
|
26 |
+
$rs = $wpdb->get_results( $sql );
|
27 |
+
|
28 |
+
return $rs;
|
29 |
+
}
|
30 |
+
|
31 |
+
// --------------------------------------------------------------------
|
32 |
+
|
33 |
+
/**
|
34 |
+
* Return a contact data
|
35 |
+
*/
|
36 |
+
function wsl_get_contact_data_by_user_id( $field, $contact_id ){
|
37 |
+
global $wpdb;
|
38 |
+
|
39 |
+
$sql = "SELECT $field as data_field FROM `{$wpdb->prefix}wsluserscontacts` where ID = '$contact_id'";
|
40 |
+
$rs = $wpdb->get_results( $sql );
|
41 |
+
|
42 |
+
return $rs[0]->data_field;
|
43 |
+
}
|
44 |
+
|
45 |
+
// --------------------------------------------------------------------
|
46 |
+
|
47 |
+
function wsl_get_user_by_meta( $provider, $user_uid )
|
48 |
+
{
|
49 |
+
global $wpdb;
|
50 |
+
|
51 |
+
$sql = "SELECT user_id FROM `{$wpdb->prefix}usermeta` WHERE meta_key = '%s' AND meta_value = '%s'";
|
52 |
+
|
53 |
+
return $wpdb->get_var( $wpdb->prepare( $sql, $provider, $user_uid ) );
|
54 |
+
}
|
55 |
+
|
56 |
+
// --------------------------------------------------------------------
|
57 |
+
|
58 |
+
function wsl_get_user_data_by_id( $field, $user_id )
|
59 |
+
{
|
60 |
+
global $wpdb;
|
61 |
+
|
62 |
+
$sql = "SELECT %s FROM `{$wpdb->prefix}users` WHERE ID = '%s'";
|
63 |
+
|
64 |
+
return $wpdb->get_var( $wpdb->prepare( $sql, $field, $user_id ) );
|
65 |
+
}
|
66 |
+
|
67 |
+
// --------------------------------------------------------------------
|
68 |
+
|
69 |
+
function wsl_get_user_linked_account_by_provider_and_identifier( $provider, $identifier )
|
70 |
+
{
|
71 |
+
global $wpdb;
|
72 |
+
|
73 |
+
$sql = "SELECT * FROM `{$wpdb->prefix}wslusersprofiles` where provider = '$provider' and identifier = '$identifier'";
|
74 |
+
$rs = $wpdb->get_results( $sql );
|
75 |
+
|
76 |
+
return $rs;
|
77 |
+
}
|
78 |
+
|
79 |
+
// --------------------------------------------------------------------
|
80 |
+
|
81 |
+
function wsl_store_hybridauth_user_data( $user_id, $provider, $profile )
|
82 |
+
{
|
83 |
+
global $wpdb;
|
84 |
+
|
85 |
+
$sql = "SELECT id, object_sha FROM `{$wpdb->prefix}wslusersprofiles` where user_id = '$user_id' and provider = '$provider'";
|
86 |
+
$rs = $wpdb->get_results( $sql );
|
87 |
+
|
88 |
+
$profile_sha = sha1( serialize( $profile ) );
|
89 |
+
|
90 |
+
// if $profile didnt change, no need for update
|
91 |
+
if( $rs && $rs[0]->object_sha == $profile_sha ){
|
92 |
+
return;
|
93 |
+
}
|
94 |
+
|
95 |
+
$table_data = array(
|
96 |
+
"user_id" => $user_id,
|
97 |
+
"provider" => $provider,
|
98 |
+
"object_sha" => $profile_sha
|
99 |
+
);
|
100 |
+
|
101 |
+
foreach( $profile as $key => $value ) {
|
102 |
+
$table_data[ strtolower($key) ] = (string) $value;
|
103 |
+
}
|
104 |
+
|
105 |
+
// if $profile updated we re/store on database
|
106 |
+
if( $rs && $rs[0]->object_sha != $profile_sha ){
|
107 |
+
$wpdb->update( "{$wpdb->prefix}wslusersprofiles", $table_data, array( "id" => $rs[0]->id ) );
|
108 |
+
}
|
109 |
+
else{
|
110 |
+
$wpdb->insert( "{$wpdb->prefix}wslusersprofiles", $table_data );
|
111 |
+
}
|
112 |
+
}
|
113 |
+
|
114 |
+
// --------------------------------------------------------------------
|
115 |
+
|
116 |
+
/**
|
117 |
+
* Contacts import
|
118 |
+
*
|
119 |
+
* We import a user contact per provider only once.
|
120 |
+
*/
|
121 |
+
function wsl_import_user_contacts( $provider, $adapter, $user_id )
|
122 |
+
{
|
123 |
+
if( ! (
|
124 |
+
get_option( 'wsl_settings_contacts_import_facebook' ) == 1 && strtolower( $provider ) == "facebook" ||
|
125 |
+
get_option( 'wsl_settings_contacts_import_google' ) == 1 && strtolower( $provider ) == "google" ||
|
126 |
+
get_option( 'wsl_settings_contacts_import_twitter' ) == 1 && strtolower( $provider ) == "twitter" ||
|
127 |
+
get_option( 'wsl_settings_contacts_import_live' ) == 1 && strtolower( $provider ) == "live" ||
|
128 |
+
get_option( 'wsl_settings_contacts_import_linkedin' ) == 1 && strtolower( $provider ) == "linkedin"
|
129 |
+
) ){
|
130 |
+
return;
|
131 |
+
}
|
132 |
+
|
133 |
+
global $wpdb;
|
134 |
+
|
135 |
+
// grab the user's friends list
|
136 |
+
$user_contacts = $adapter->getUserContacts();
|
137 |
+
// print_r( $user_contacts ); die();
|
138 |
+
// update contact only one time per provider, this behaviour may change depend on the feedback reviced
|
139 |
+
if( ! $user_contacts ){
|
140 |
+
return;
|
141 |
+
}
|
142 |
+
|
143 |
+
$wpdb->query(
|
144 |
+
$wpdb->prepare( "DELETE FROM `{$wpdb->prefix}wsluserscontacts` WHERE user_id = '%d' AND provider = '%s'", $user_id, $provider )
|
145 |
+
);
|
146 |
+
|
147 |
+
foreach( $user_contacts as $contact ){
|
148 |
+
$wpdb->insert(
|
149 |
+
"{$wpdb->prefix}wsluserscontacts",
|
150 |
+
array(
|
151 |
+
"user_id" => $user_id,
|
152 |
+
"provider" => $provider,
|
153 |
+
"identifier" => $contact->identifier,
|
154 |
+
"full_name" => $contact->displayName,
|
155 |
+
"email" => $contact->email,
|
156 |
+
"profile_url" => $contact->profileURL,
|
157 |
+
"photo_url" => $contact->photoURL,
|
158 |
+
)
|
159 |
+
);
|
160 |
+
}
|
161 |
+
}
|
162 |
+
|
163 |
+
// --------------------------------------------------------------------
|
164 |
+
|
165 |
+
function wsl_get_list_connected_providers()
|
166 |
+
{
|
167 |
+
// load hybridauth
|
168 |
+
require_once WORDPRESS_SOCIAL_LOGIN_ABS_PATH . "/hybridauth/Hybrid/Auth.php";
|
169 |
+
|
170 |
+
GLOBAL $WORDPRESS_SOCIAL_LOGIN_PROVIDERS_CONFIG;
|
171 |
+
|
172 |
+
$config = array();
|
173 |
+
|
174 |
+
foreach( $WORDPRESS_SOCIAL_LOGIN_PROVIDERS_CONFIG AS $item ){
|
175 |
+
$provider_id = @ $item["provider_id"];
|
176 |
+
|
177 |
+
$config["providers"][$provider_id]["enabled"] = true;
|
178 |
+
}
|
179 |
+
|
180 |
+
$hybridauth = new Hybrid_Auth( $config );
|
181 |
+
|
182 |
+
return Hybrid_Auth::getConnectedProviders();
|
183 |
+
}
|
184 |
+
|
185 |
+
// --------------------------------------------------------------------
|
186 |
+
|
187 |
+
function wsl_get_user_linked_accounts_by_user_id( $user_id )
|
188 |
+
{
|
189 |
+
global $wpdb;
|
190 |
+
|
191 |
+
$sql = "SELECT * FROM `{$wpdb->prefix}wslusersprofiles` where user_id = '$user_id'";
|
192 |
+
$rs = $wpdb->get_results( $sql );
|
193 |
+
|
194 |
+
return $rs;
|
195 |
+
}
|
196 |
+
|
197 |
+
// --------------------------------------------------------------------
|
198 |
+
|
199 |
+
function wsl_get_user_linked_accounts_field_by_id( $id, $field )
|
200 |
+
{
|
201 |
+
global $wpdb;
|
202 |
+
|
203 |
+
$sql = "SELECT $field as data_field FROM `{$wpdb->prefix}wslusersprofiles` where id = '$id'";
|
204 |
+
$rs = $wpdb->get_results( $sql );
|
205 |
+
|
206 |
+
return $rs[0]->data_field;
|
207 |
+
}
|
208 |
+
|
209 |
+
// --------------------------------------------------------------------
|
210 |
+
|
211 |
+
function wsl_get_user_by_meta_key_and_user_id( $meta_key, $user_id )
|
212 |
+
{
|
213 |
+
global $wpdb;
|
214 |
+
|
215 |
+
$sql = "SELECT meta_value FROM `{$wpdb->prefix}usermeta` where meta_key = '$meta_key' and user_id = '$user_id'";
|
216 |
+
$rs = $wpdb->get_results( $sql );
|
217 |
+
|
218 |
+
return $rs[0]->meta_value;
|
219 |
+
}
|
220 |
+
|
221 |
+
// --------------------------------------------------------------------
|
222 |
+
|
223 |
+
function wsl_get_user_data_by_user_id( $field, $user_id )
|
224 |
+
{
|
225 |
+
global $wpdb;
|
226 |
+
|
227 |
+
$sql = "SELECT $field as data_field FROM `{$wpdb->prefix}users` where ID = '$user_id'";
|
228 |
+
$rs = $wpdb->get_results( $sql );
|
229 |
+
|
230 |
+
return $rs[0]->data_field;
|
231 |
+
}
|
232 |
+
|
233 |
+
// --------------------------------------------------------------------
|
234 |
+
|
235 |
+
function wsl_delete_userprofiles( $user_id )
|
236 |
+
{
|
237 |
+
global $wpdb;
|
238 |
+
|
239 |
+
$sql = "DELETE FROM `{$wpdb->prefix}wslusersprofiles` where user_id = '$user_id'";
|
240 |
+
$wpdb->query( $sql );
|
241 |
+
}
|
242 |
+
|
243 |
+
add_action( 'delete_user', 'wsl_delete_userprofiles' );
|
244 |
+
|
245 |
+
// --------------------------------------------------------------------
|
246 |
+
|
247 |
+
function wsl_delete_usercontacts( $user_id )
|
248 |
+
{
|
249 |
+
global $wpdb;
|
250 |
+
|
251 |
+
$sql = "DELETE FROM `{$wpdb->prefix}wsluserscontacts` where user_id = '$user_id'";
|
252 |
+
$wpdb->query( $sql );
|
253 |
+
}
|
254 |
+
|
255 |
+
add_action( 'delete_user', 'wsl_delete_usercontacts' );
|
256 |
+
|
257 |
+
// --------------------------------------------------------------------
|
includes/settings/wsl.compatibilities.php
ADDED
@@ -0,0 +1,202 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/*!
|
3 |
+
* WordPress Social Login
|
4 |
+
*
|
5 |
+
* http://hybridauth.sourceforge.net/wsl/index.html | http://github.com/hybridauth/WordPress-Social-Login
|
6 |
+
* (c) 2011-2013 Mohamed Mrassi and contributors | http://wordpress.org/extend/plugins/wordpress-social-login/
|
7 |
+
*/
|
8 |
+
|
9 |
+
/**
|
10 |
+
* Check and upgrade compatibilities from old WSL versions
|
11 |
+
*/
|
12 |
+
|
13 |
+
// Exit if accessed directly
|
14 |
+
if ( !defined( 'ABSPATH' ) ) exit;
|
15 |
+
|
16 |
+
// --------------------------------------------------------------------
|
17 |
+
|
18 |
+
/**
|
19 |
+
* Check and upgrade compatibilities from old WSL versions
|
20 |
+
*
|
21 |
+
* Here we attempt to:
|
22 |
+
* - set to default all settings when WSL is installed
|
23 |
+
* - make wsl compatible when updating from old versions by registring any option
|
24 |
+
*
|
25 |
+
* Side note: the things here are not optimal and the list is kind of long. If you have any
|
26 |
+
* better idea on how to tackle this issue, please don't hesitate to share it!
|
27 |
+
*/
|
28 |
+
function wsl_check_compatibilities()
|
29 |
+
{
|
30 |
+
# widget settings / customize
|
31 |
+
if( ! get_option( 'wsl_settings_redirect_url' ) ){
|
32 |
+
update_option( 'wsl_settings_redirect_url', site_url() );
|
33 |
+
}
|
34 |
+
|
35 |
+
if( ! get_option( 'wsl_settings_connect_with_label' ) ){
|
36 |
+
update_option( 'wsl_settings_connect_with_label', "Connect with:" );
|
37 |
+
}
|
38 |
+
|
39 |
+
if( ! get_option( 'wsl_settings_use_popup' ) ){
|
40 |
+
update_option( 'wsl_settings_use_popup', 2 );
|
41 |
+
}
|
42 |
+
|
43 |
+
if( ! get_option( 'wsl_settings_widget_display' ) ){
|
44 |
+
update_option( 'wsl_settings_widget_display', 1 );
|
45 |
+
}
|
46 |
+
|
47 |
+
if( ! get_option( 'wsl_settings_authentication_widget_css' ) ){
|
48 |
+
update_option( 'wsl_settings_authentication_widget_css', "#wp-social-login-connect-with {font-weight: bold;}\n#wp-social-login-connect-options {padding:10px;}\n#wp-social-login-connect-options a {text-decoration: none;}\n#wp-social-login-connect-options img {border:0 none;}\n.wsl_connect_with_provider {}" );
|
49 |
+
}
|
50 |
+
|
51 |
+
# bouncer
|
52 |
+
if( ! get_option( 'wsl_settings_bouncer_registration_enabled' ) ){
|
53 |
+
update_option( 'wsl_settings_bouncer_registration_enabled', 1 );
|
54 |
+
}
|
55 |
+
|
56 |
+
if( ! get_option( 'wsl_settings_bouncer_authentication_enabled' ) ){
|
57 |
+
update_option( 'wsl_settings_bouncer_authentication_enabled', 1 );
|
58 |
+
}
|
59 |
+
|
60 |
+
if( ! get_option( 'wsl_settings_bouncer_linking_accounts_enabled' ) ){
|
61 |
+
update_option( 'wsl_settings_bouncer_linking_accounts_enabled', 2 );
|
62 |
+
}
|
63 |
+
|
64 |
+
if( get_option( 'wsl_settings_bouncer_email_validation_enabled' ) == 1 ){
|
65 |
+
update_option( 'wsl_settings_bouncer_profile_completion_require_email', 1 );
|
66 |
+
|
67 |
+
delete_option( 'wsl_settings_bouncer_email_validation_enabled' );
|
68 |
+
delete_option( 'wsl_settings_bouncer_email_validation_text_notice' );
|
69 |
+
delete_option( 'wsl_settings_bouncer_email_validation_text_submit_button' );
|
70 |
+
delete_option( 'wsl_settings_bouncer_email_validation_text_email' );
|
71 |
+
delete_option( 'wsl_settings_bouncer_email_validation_text_username' );
|
72 |
+
delete_option( 'wsl_settings_bouncer_email_validation_text_email_invalid' );
|
73 |
+
delete_option( 'wsl_settings_bouncer_email_validation_text_username_invalid' );
|
74 |
+
delete_option( 'wsl_settings_bouncer_email_validation_text_email_exists' );
|
75 |
+
delete_option( 'wsl_settings_bouncer_email_validation_text_username_exists' );
|
76 |
+
delete_option( 'wsl_settings_bouncer_email_validation_text_connected_with' );
|
77 |
+
}
|
78 |
+
|
79 |
+
if( ! get_option( 'wsl_settings_bouncer_profile_completion_require_email' ) ){
|
80 |
+
update_option( 'wsl_settings_bouncer_profile_completion_require_email', 2 );
|
81 |
+
}
|
82 |
+
|
83 |
+
if( ! get_option( 'wsl_settings_bouncer_profile_completion_change_email' ) ){
|
84 |
+
update_option( 'wsl_settings_bouncer_profile_completion_change_email', 2 );
|
85 |
+
}
|
86 |
+
|
87 |
+
if( ! get_option( 'wsl_settings_bouncer_profile_completion_change_username' ) ){
|
88 |
+
update_option( 'wsl_settings_bouncer_profile_completion_change_username', 2 );
|
89 |
+
}
|
90 |
+
|
91 |
+
if( ! get_option( 'wsl_settings_bouncer_profile_completion_text_notice' ) ){
|
92 |
+
update_option( 'wsl_settings_bouncer_profile_completion_text_notice', _wsl__("Almost there, we just need to check a couple of things", 'wordpress-social-login') );
|
93 |
+
}
|
94 |
+
|
95 |
+
if( ! get_option( 'wsl_settings_bouncer_profile_completion_text_submit_button' ) ){
|
96 |
+
update_option( 'wsl_settings_bouncer_profile_completion_text_submit_button', _wsl__("Continue", 'wordpress-social-login') );
|
97 |
+
}
|
98 |
+
|
99 |
+
if( ! get_option( 'wsl_settings_bouncer_profile_completion_text_email' ) ){
|
100 |
+
update_option( 'wsl_settings_bouncer_profile_completion_text_email', _wsl__("E-mail", 'wordpress-social-login') );
|
101 |
+
}
|
102 |
+
|
103 |
+
if( ! get_option( 'wsl_settings_bouncer_profile_completion_text_username' ) ){
|
104 |
+
update_option( 'wsl_settings_bouncer_profile_completion_text_username', _wsl__("Username", 'wordpress-social-login') );
|
105 |
+
}
|
106 |
+
|
107 |
+
if( ! get_option( 'wsl_settings_bouncer_profile_completion_text_email_invalid' ) ){
|
108 |
+
update_option( 'wsl_settings_bouncer_profile_completion_text_email_invalid', _wsl__("E-mail is not valid!", 'wordpress-social-login') );
|
109 |
+
}
|
110 |
+
|
111 |
+
if( ! get_option( 'wsl_settings_bouncer_profile_completion_text_username_invalid' ) ){
|
112 |
+
update_option( 'wsl_settings_bouncer_profile_completion_text_username_invalid', _wsl__("Username is not valid!", 'wordpress-social-login') );
|
113 |
+
}
|
114 |
+
|
115 |
+
if( ! get_option( 'wsl_settings_bouncer_profile_completion_text_email_exists' ) ){
|
116 |
+
update_option( 'wsl_settings_bouncer_profile_completion_text_email_exists', _wsl__("That E-mail is already registered!", 'wordpress-social-login') );
|
117 |
+
}
|
118 |
+
|
119 |
+
if( ! get_option( 'wsl_settings_bouncer_profile_completion_text_username_exists' ) ){
|
120 |
+
update_option( 'wsl_settings_bouncer_profile_completion_text_username_exists', _wsl__("That Username is already registered!", 'wordpress-social-login') );
|
121 |
+
}
|
122 |
+
|
123 |
+
if( ! get_option( 'wsl_settings_bouncer_profile_completion_text_connected_with' ) ){
|
124 |
+
update_option( 'wsl_settings_bouncer_profile_completion_text_connected_with', _wsl__("You are now connected via", 'wordpress-social-login') );
|
125 |
+
}
|
126 |
+
|
127 |
+
if( ! get_option( 'wsl_settings_bouncer_new_users_moderation_level' ) ){
|
128 |
+
update_option( 'wsl_settings_bouncer_new_users_moderation_level', 1 );
|
129 |
+
}
|
130 |
+
|
131 |
+
if( ! get_option( 'wsl_settings_bouncer_new_users_membership_default_role' ) ){
|
132 |
+
update_option( 'wsl_settings_bouncer_new_users_membership_default_role', "default" );
|
133 |
+
}
|
134 |
+
|
135 |
+
if( ! get_option( 'wsl_settings_bouncer_new_users_restrict_domain_enabled' ) ){
|
136 |
+
update_option( 'wsl_settings_bouncer_new_users_restrict_domain_enabled', 2 );
|
137 |
+
}
|
138 |
+
|
139 |
+
if( ! get_option( 'wsl_settings_bouncer_new_users_restrict_domain_text_bounce' ) ){
|
140 |
+
update_option( 'wsl_settings_bouncer_new_users_restrict_domain_text_bounce', _wsl__("Bouncer says no.", 'wordpress-social-login') );
|
141 |
+
}
|
142 |
+
|
143 |
+
if( ! get_option( 'wsl_settings_bouncer_new_users_restrict_email_enabled' ) ){
|
144 |
+
update_option( 'wsl_settings_bouncer_new_users_restrict_email_enabled', 2 );
|
145 |
+
}
|
146 |
+
|
147 |
+
if( ! get_option( 'wsl_settings_bouncer_new_users_restrict_email_text_bounce' ) ){
|
148 |
+
update_option( 'wsl_settings_bouncer_new_users_restrict_email_text_bounce', _wsl__("Bouncer say he refuses.", 'wordpress-social-login') );
|
149 |
+
}
|
150 |
+
|
151 |
+
if( ! get_option( 'wsl_settings_bouncer_new_users_restrict_profile_enabled' ) ){
|
152 |
+
update_option( 'wsl_settings_bouncer_new_users_restrict_profile_enabled', 2 );
|
153 |
+
}
|
154 |
+
|
155 |
+
if( ! get_option( 'wsl_settings_bouncer_new_users_restrict_profile_text_bounce' ) ){
|
156 |
+
update_option( 'wsl_settings_bouncer_new_users_restrict_profile_text_bounce', _wsl__("Bouncer say only Mundo can go where he pleases!", 'wordpress-social-login') );
|
157 |
+
}
|
158 |
+
|
159 |
+
# contacts import
|
160 |
+
if( ! get_option( 'wsl_settings_contacts_import_facebook' ) ){
|
161 |
+
update_option( 'wsl_settings_contacts_import_facebook', 2 );
|
162 |
+
}
|
163 |
+
|
164 |
+
if( ! get_option( 'wsl_settings_contacts_import_google' ) ){
|
165 |
+
update_option( 'wsl_settings_contacts_import_google', 2 );
|
166 |
+
}
|
167 |
+
|
168 |
+
if( ! get_option( 'wsl_settings_contacts_import_twitter' ) ){
|
169 |
+
update_option( 'wsl_settings_contacts_import_twitter', 2 );
|
170 |
+
}
|
171 |
+
|
172 |
+
if( ! get_option( 'wsl_settings_contacts_import_live' ) ){
|
173 |
+
update_option( 'wsl_settings_contacts_import_live', 2 );
|
174 |
+
}
|
175 |
+
|
176 |
+
if( ! get_option( 'wsl_settings_contacts_import_linkedin' ) ){
|
177 |
+
update_option( 'wsl_settings_contacts_import_linkedin', 2 );
|
178 |
+
}
|
179 |
+
|
180 |
+
// enable default providers
|
181 |
+
GLOBAL $WORDPRESS_SOCIAL_LOGIN_PROVIDERS_CONFIG;
|
182 |
+
$nok = true;
|
183 |
+
foreach( $WORDPRESS_SOCIAL_LOGIN_PROVIDERS_CONFIG AS $item ){
|
184 |
+
$provider_id = $item["provider_id"];
|
185 |
+
|
186 |
+
if( get_option( 'wsl_settings_' . $provider_id . '_enabled' ) ){
|
187 |
+
$nok = false;
|
188 |
+
}
|
189 |
+
}
|
190 |
+
|
191 |
+
if( $nok ){
|
192 |
+
foreach( $WORDPRESS_SOCIAL_LOGIN_PROVIDERS_CONFIG AS $item ){
|
193 |
+
$provider_id = $item["provider_id"];
|
194 |
+
|
195 |
+
if( isset( $item["default_network"] ) && $item["default_network"] ){
|
196 |
+
update_option( 'wsl_settings_' . $provider_id . '_enabled', 1 );
|
197 |
+
}
|
198 |
+
}
|
199 |
+
}
|
200 |
+
}
|
201 |
+
|
202 |
+
// --------------------------------------------------------------------
|
includes/settings/wsl.database.php
ADDED
@@ -0,0 +1,102 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/*!
|
3 |
+
* WordPress Social Login
|
4 |
+
*
|
5 |
+
* http://hybridauth.sourceforge.net/wsl/index.html | http://github.com/hybridauth/WordPress-Social-Login
|
6 |
+
* (c) 2011-2013 Mohamed Mrassi and contributors | http://wordpress.org/extend/plugins/wordpress-social-login/
|
7 |
+
*/
|
8 |
+
|
9 |
+
/**
|
10 |
+
* Functions & utililies related to wsl database installation and migrations
|
11 |
+
*
|
12 |
+
* After WSl activated, wsl_database_migration_process will attempt to create or upgrade the required database
|
13 |
+
* tables.
|
14 |
+
*
|
15 |
+
* Currently there is 2 tables used by WSL :
|
16 |
+
* - wslusersprofiles: where sotred the users profile as provided by Hybridauth
|
17 |
+
* - wsluserscontacts: where sotred the users contact list as provided by Hybridauth
|
18 |
+
*/
|
19 |
+
|
20 |
+
// Exit if accessed directly
|
21 |
+
if ( !defined( 'ABSPATH' ) ) exit;
|
22 |
+
|
23 |
+
// --------------------------------------------------------------------
|
24 |
+
|
25 |
+
global $wsl_database_migration_version;
|
26 |
+
|
27 |
+
$wsl_database_migration_version = 4;
|
28 |
+
|
29 |
+
// --------------------------------------------------------------------
|
30 |
+
|
31 |
+
function wsl_database_migration_hook ()
|
32 |
+
{
|
33 |
+
wsl_database_migration_process();
|
34 |
+
}
|
35 |
+
|
36 |
+
add_action( 'plugins_loaded', 'wsl_database_migration_process' );
|
37 |
+
|
38 |
+
// --------------------------------------------------------------------
|
39 |
+
|
40 |
+
function wsl_database_migration_process()
|
41 |
+
{
|
42 |
+
global $wpdb;
|
43 |
+
global $wsl_database_migration_version;
|
44 |
+
|
45 |
+
$wsluserscontacts = "{$wpdb->prefix}wsluserscontacts";
|
46 |
+
$wslusersprofiles = "{$wpdb->prefix}wslusersprofiles";
|
47 |
+
$installed_ver = get_option( "wsl_database_migration_version" );
|
48 |
+
|
49 |
+
if( $installed_ver != $wsl_database_migration_version ) {
|
50 |
+
require_once( ABSPATH . 'wp-admin/includes/upgrade.php' );
|
51 |
+
|
52 |
+
$sql = "CREATE TABLE " . $wsluserscontacts . " (
|
53 |
+
id int(11) NOT NULL AUTO_INCREMENT,
|
54 |
+
user_id int(11) NOT NULL,
|
55 |
+
provider varchar(50) NOT NULL,
|
56 |
+
identifier varchar(255) NOT NULL,
|
57 |
+
full_name varchar(255) NOT NULL,
|
58 |
+
email varchar(255) NOT NULL,
|
59 |
+
profile_url varchar(255) NOT NULL,
|
60 |
+
photo_url varchar(255) NOT NULL,
|
61 |
+
PRIMARY KEY (id)
|
62 |
+
);";
|
63 |
+
dbDelta( $sql );
|
64 |
+
|
65 |
+
$sql = "CREATE TABLE " . $wslusersprofiles . " (
|
66 |
+
`id` int(11) NOT NULL AUTO_INCREMENT,
|
67 |
+
`user_id` int(11) NOT NULL,
|
68 |
+
`provider` varchar(255) NOT NULL,
|
69 |
+
`object_sha` varchar(255) NOT NULL COMMENT 'to check if hybridauth user profile object has changed from last time, if yes we update the user profile here ',
|
70 |
+
`identifier` varchar(255) NOT NULL,
|
71 |
+
`profileurl` varchar(255) NOT NULL,
|
72 |
+
`websiteurl` varchar(255) NOT NULL,
|
73 |
+
`photourl` varchar(255) NOT NULL,
|
74 |
+
`displayname` varchar(255) NOT NULL,
|
75 |
+
`description` varchar(255) NOT NULL,
|
76 |
+
`firstname` varchar(255) NOT NULL,
|
77 |
+
`lastname` varchar(255) NOT NULL,
|
78 |
+
`gender` varchar(255) NOT NULL,
|
79 |
+
`language` varchar(255) NOT NULL,
|
80 |
+
`age` varchar(255) NOT NULL,
|
81 |
+
`birthday` varchar(255) NOT NULL,
|
82 |
+
`birthmonth` varchar(255) NOT NULL,
|
83 |
+
`birthyear` varchar(255) NOT NULL,
|
84 |
+
`email` varchar(255) NOT NULL,
|
85 |
+
`emailverified` varchar(255) NOT NULL,
|
86 |
+
`phone` varchar(255) NOT NULL,
|
87 |
+
`address` varchar(255) NOT NULL,
|
88 |
+
`country` varchar(255) NOT NULL,
|
89 |
+
`region` varchar(255) NOT NULL,
|
90 |
+
`city` varchar(255) NOT NULL,
|
91 |
+
`zip` varchar(255) NOT NULL,
|
92 |
+
PRIMARY KEY (`id`)
|
93 |
+
)";
|
94 |
+
dbDelta( $sql );
|
95 |
+
|
96 |
+
update_option( "wsl_database_migration_version", $wsl_database_migration_version );
|
97 |
+
}
|
98 |
+
|
99 |
+
add_option( "wsl_database_migration_version", $wsl_database_migration_version );
|
100 |
+
}
|
101 |
+
|
102 |
+
// --------------------------------------------------------------------
|
includes/settings/wsl.initialization.php
ADDED
@@ -0,0 +1,405 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/*!
|
3 |
+
* WordPress Social Login
|
4 |
+
*
|
5 |
+
* http://hybridauth.sourceforge.net/wsl/index.html | http://github.com/hybridauth/WordPress-Social-Login
|
6 |
+
* (c) 2011-2013 Mohamed Mrassi and contributors | http://wordpress.org/extend/plugins/wordpress-social-login/
|
7 |
+
*/
|
8 |
+
|
9 |
+
/**
|
10 |
+
* Check wsl requirements and register wsl settings
|
11 |
+
*
|
12 |
+
* More information ca be found at http://hybridauth.sourceforge.net/wsl/developer.html
|
13 |
+
*/
|
14 |
+
|
15 |
+
// Exit if accessed directly
|
16 |
+
if ( !defined( 'ABSPATH' ) ) exit;
|
17 |
+
|
18 |
+
// --------------------------------------------------------------------
|
19 |
+
|
20 |
+
/** used by the localization widget */
|
21 |
+
$WORDPRESS_SOCIAL_LOGIN_TEXTS = array();
|
22 |
+
|
23 |
+
/** list of wsl components */
|
24 |
+
$WORDPRESS_SOCIAL_LOGIN_COMPONENTS = ARRAY(
|
25 |
+
"core" => array( "type" => "core" , "label" => __("WSL Core" , 'wordpress-social-login'), "description" => __("WordPress Social Login core.", 'wordpress-social-login') ),
|
26 |
+
"networks" => array( "type" => "core" , "label" => __("Networks" , 'wordpress-social-login'), "description" => __("Social networks setup.", 'wordpress-social-login') ),
|
27 |
+
"login-widget" => array( "type" => "core" , "label" => __("Widget" , 'wordpress-social-login'), "description" => __("Authentication widget customization.", 'wordpress-social-login') ),
|
28 |
+
"bouncer" => array( "type" => "core" , "label" => __("Bouncer" , 'wordpress-social-login'), "description" => __("WordPress Social Login advanced configuration.", 'wordpress-social-login') ),
|
29 |
+
"diagnostics" => array( "type" => "core" , "label" => __("Diagnostics" , 'wordpress-social-login'), "description" => __("WordPress Social Login diagnostics.", 'wordpress-social-login') ),
|
30 |
+
"basicinsights" => array( "type" => "plugin", "label" => __("Basic Insights" , 'wordpress-social-login'), "description" => __("WordPress Social Login basic insights. When enabled <b>Basic Insights</b> will on <b>Networks</b> tab.", 'wordpress-social-login') ),
|
31 |
+
"users" => array( "type" => "plugin", "label" => __("Users" , 'wordpress-social-login'), "description" => __("WordPress Social Login users manager.", 'wordpress-social-login') ),
|
32 |
+
"contacts" => array( "type" => "plugin", "label" => __("Contacts" , 'wordpress-social-login'), "description" => __("WordPress Social Login users contacts manager", 'wordpress-social-login') ),
|
33 |
+
);
|
34 |
+
|
35 |
+
/** list of wsl admin tabs */
|
36 |
+
$WORDPRESS_SOCIAL_LOGIN_ADMIN_TABS = ARRAY(
|
37 |
+
"networks" => array( "label" => __("Networks" , 'wordpress-social-login') , "enabled" => true , "visible" => true , "component" => "networks" , "default" => true ),
|
38 |
+
"login-widget" => array( "label" => __("Widget" , 'wordpress-social-login') , "enabled" => true , "visible" => true , "component" => "login-widget" ),
|
39 |
+
"bouncer" => array( "label" => __("Bouncer" , 'wordpress-social-login') , "enabled" => true , "visible" => true , "component" => "bouncer" ),
|
40 |
+
"users" => array( "label" => __("Users" , 'wordpress-social-login') , "enabled" => false, "visible" => true , "component" => "users" ),
|
41 |
+
"contacts" => array( "label" => __("Contacts" , 'wordpress-social-login') , "enabled" => false, "visible" => true , "component" => "contacts" ),
|
42 |
+
"diagnostics" => array( "label" => __("Diagnostics" , 'wordpress-social-login') , "enabled" => true , "visible" => false , "component" => "diagnostics" , "pull-right" => true , "welcome-panel" => false ),
|
43 |
+
"help" => array( "label" => __('?' , 'wordpress-social-login') , "enabled" => true , "visible" => true , "component" => "core" , "pull-right" => true , "welcome-panel" => false ),
|
44 |
+
"components" => array( "label" => __("Components" , 'wordpress-social-login') , "enabled" => true , "visible" => true , "component" => "core" , "pull-right" => true , "welcome-panel" => false ),
|
45 |
+
"advanced" => array( "label" => __("Advanced" , 'wordpress-social-login') , "enabled" => true , "visible" => false , "component" => "core" , "pull-right" => true , "welcome-panel" => false ),
|
46 |
+
);
|
47 |
+
|
48 |
+
// --------------------------------------------------------------------
|
49 |
+
|
50 |
+
/**
|
51 |
+
* Register new wsl components
|
52 |
+
*/
|
53 |
+
function wsl_register_component( $component, $config, $tabs )
|
54 |
+
{
|
55 |
+
GLOBAL $WORDPRESS_SOCIAL_LOGIN_COMPONENTS;
|
56 |
+
|
57 |
+
// sure it can be overwritten.. just not recommended
|
58 |
+
if( isset( $WORDPRESS_SOCIAL_LOGIN_COMPONENTS[ $component ] ) ){
|
59 |
+
return wsl_render_notices_pages( _wsl__("An installed plugin is trying to o-ver-write WordPress Social Login config in a bad way.", 'wordpress-social-login') );
|
60 |
+
}
|
61 |
+
|
62 |
+
$config["type"] = "plugin";
|
63 |
+
$WORDPRESS_SOCIAL_LOGIN_COMPONENTS[ $component ] = $config;
|
64 |
+
|
65 |
+
if( is_array( $tabs ) && count( $tabs ) ){
|
66 |
+
foreach( $tabs as $tab => $config ){
|
67 |
+
$config["component"] = $component;
|
68 |
+
|
69 |
+
wsl_register_admin_tab( $tab, $config );
|
70 |
+
}
|
71 |
+
}
|
72 |
+
}
|
73 |
+
|
74 |
+
add_action( 'wsl_register_component', 'wsl_register_component', 10, 3 );
|
75 |
+
|
76 |
+
// --------------------------------------------------------------------
|
77 |
+
|
78 |
+
/**
|
79 |
+
* Register new wsl admin tab
|
80 |
+
*/
|
81 |
+
function wsl_register_admin_tab( $tab, $config )
|
82 |
+
{
|
83 |
+
GLOBAL $WORDPRESS_SOCIAL_LOGIN_ADMIN_TABS;
|
84 |
+
|
85 |
+
// sure it can be overwritten.. just not recommended
|
86 |
+
if( isset( $WORDPRESS_SOCIAL_LOGIN_ADMIN_TABS[ $tab ] ) ){
|
87 |
+
return wsl_render_notices_pages( _wsl__("An installed plugin is trying to o-ver-write WordPress Social Login config in a bad way.", 'wordpress-social-login') );
|
88 |
+
}
|
89 |
+
|
90 |
+
$WORDPRESS_SOCIAL_LOGIN_ADMIN_TABS[ $tab ] = $config;
|
91 |
+
}
|
92 |
+
|
93 |
+
add_action( 'wsl_register_admin_tab', 'wsl_register_admin_tab', 10, 2 );
|
94 |
+
|
95 |
+
// --------------------------------------------------------------------
|
96 |
+
|
97 |
+
/**
|
98 |
+
* Check if a component is enabled
|
99 |
+
*/
|
100 |
+
function wsl_is_component_enabled( $component )
|
101 |
+
{
|
102 |
+
if( get_option( "wsl_components_" . $component . "_enabled" ) == 1 ){
|
103 |
+
return true;
|
104 |
+
}
|
105 |
+
|
106 |
+
return false;
|
107 |
+
}
|
108 |
+
|
109 |
+
// --------------------------------------------------------------------
|
110 |
+
|
111 |
+
/**
|
112 |
+
* Register wsl components (Bulk action)
|
113 |
+
*/
|
114 |
+
function wsl_register_components()
|
115 |
+
{
|
116 |
+
GLOBAL $WORDPRESS_SOCIAL_LOGIN_COMPONENTS;
|
117 |
+
GLOBAL $WORDPRESS_SOCIAL_LOGIN_ADMIN_TABS;
|
118 |
+
|
119 |
+
foreach( $WORDPRESS_SOCIAL_LOGIN_ADMIN_TABS as $tab => $config ){
|
120 |
+
$WORDPRESS_SOCIAL_LOGIN_ADMIN_TABS[ $tab ][ "enabled" ] = false;
|
121 |
+
}
|
122 |
+
|
123 |
+
foreach( $WORDPRESS_SOCIAL_LOGIN_COMPONENTS as $component => $config ){
|
124 |
+
$WORDPRESS_SOCIAL_LOGIN_COMPONENTS[ $component ][ "enabled" ] = false;
|
125 |
+
|
126 |
+
if( get_option( "wsl_components_" . $component . "_enabled" ) == 1 ){
|
127 |
+
$WORDPRESS_SOCIAL_LOGIN_COMPONENTS[ $component ][ "enabled" ] = true;
|
128 |
+
}
|
129 |
+
|
130 |
+
if( $WORDPRESS_SOCIAL_LOGIN_COMPONENTS[ $component ][ "type" ] == "core" ){
|
131 |
+
$WORDPRESS_SOCIAL_LOGIN_COMPONENTS[ $component ][ "enabled" ] = true;
|
132 |
+
|
133 |
+
update_option( "wsl_components_" . $component . "_enabled", 1 );
|
134 |
+
}
|
135 |
+
|
136 |
+
foreach( $WORDPRESS_SOCIAL_LOGIN_ADMIN_TABS as $tab => $tconfig ){
|
137 |
+
if( $tconfig["component"] == $component ){
|
138 |
+
|
139 |
+
if( $WORDPRESS_SOCIAL_LOGIN_COMPONENTS[ $component ][ "enabled" ] ){
|
140 |
+
$WORDPRESS_SOCIAL_LOGIN_ADMIN_TABS[ $tab ][ "enabled" ] = true;
|
141 |
+
}
|
142 |
+
}
|
143 |
+
}
|
144 |
+
}
|
145 |
+
}
|
146 |
+
|
147 |
+
// --------------------------------------------------------------------
|
148 |
+
|
149 |
+
/**
|
150 |
+
* Check wsl minimun requirements. Display fail page if they are not met.
|
151 |
+
*/
|
152 |
+
function wsl_check_requirements()
|
153 |
+
{
|
154 |
+
if
|
155 |
+
(
|
156 |
+
! version_compare( PHP_VERSION, '5.2.0', '>=' )
|
157 |
+
|| ! isset( $_SESSION["wsl::plugin"] )
|
158 |
+
|| ! function_exists('curl_init')
|
159 |
+
|| ! function_exists('json_decode')
|
160 |
+
|| ini_get('register_globals')
|
161 |
+
)
|
162 |
+
return false;
|
163 |
+
|
164 |
+
$curl_version = curl_version();
|
165 |
+
|
166 |
+
if ( ! ( $curl_version['features'] & CURL_VERSION_SSL ) )
|
167 |
+
return false;
|
168 |
+
|
169 |
+
return true;
|
170 |
+
}
|
171 |
+
|
172 |
+
// --------------------------------------------------------------------
|
173 |
+
|
174 |
+
/**
|
175 |
+
* Register wsl core settings ( options; components )
|
176 |
+
*/
|
177 |
+
function wsl_register_setting()
|
178 |
+
{
|
179 |
+
GLOBAL $WORDPRESS_SOCIAL_LOGIN_PROVIDERS_CONFIG;
|
180 |
+
GLOBAL $WORDPRESS_SOCIAL_LOGIN_COMPONENTS;
|
181 |
+
GLOBAL $WORDPRESS_SOCIAL_LOGIN_ADMIN_TABS;
|
182 |
+
|
183 |
+
// HOOKABLE:
|
184 |
+
do_action( 'wsl_register_setting_begin' );
|
185 |
+
|
186 |
+
wsl_register_components();
|
187 |
+
|
188 |
+
// idps credentials
|
189 |
+
foreach( $WORDPRESS_SOCIAL_LOGIN_PROVIDERS_CONFIG AS $item ){
|
190 |
+
$provider_id = @ $item["provider_id"];
|
191 |
+
$require_client_id = @ $item["require_client_id"];
|
192 |
+
$require_registration = @ $item["new_app_link"];
|
193 |
+
|
194 |
+
register_setting( 'wsl-settings-group', 'wsl_settings_' . $provider_id . '_enabled' );
|
195 |
+
|
196 |
+
if ( $require_registration ){ // require application?
|
197 |
+
if ( $require_client_id ){ // key or id ?
|
198 |
+
register_setting( 'wsl-settings-group', 'wsl_settings_' . $provider_id . '_app_id' );
|
199 |
+
}
|
200 |
+
else{
|
201 |
+
register_setting( 'wsl-settings-group', 'wsl_settings_' . $provider_id . '_app_key' );
|
202 |
+
}
|
203 |
+
|
204 |
+
register_setting( 'wsl-settings-group', 'wsl_settings_' . $provider_id . '_app_secret' );
|
205 |
+
}
|
206 |
+
}
|
207 |
+
|
208 |
+
register_setting( 'wsl-settings-group-customize' , 'wsl_settings_connect_with_label' );
|
209 |
+
register_setting( 'wsl-settings-group-customize' , 'wsl_settings_social_icon_set' );
|
210 |
+
register_setting( 'wsl-settings-group-customize' , 'wsl_settings_users_avatars' );
|
211 |
+
register_setting( 'wsl-settings-group-customize' , 'wsl_settings_use_popup' );
|
212 |
+
register_setting( 'wsl-settings-group-customize' , 'wsl_settings_widget_display' );
|
213 |
+
register_setting( 'wsl-settings-group-customize' , 'wsl_settings_redirect_url' );
|
214 |
+
register_setting( 'wsl-settings-group-customize' , 'wsl_settings_users_notification' );
|
215 |
+
register_setting( 'wsl-settings-group-customize' , 'wsl_settings_authentication_widget_css' );
|
216 |
+
|
217 |
+
register_setting( 'wsl-settings-group-contacts-import' , 'wsl_settings_contacts_import_facebook' );
|
218 |
+
register_setting( 'wsl-settings-group-contacts-import' , 'wsl_settings_contacts_import_google' );
|
219 |
+
register_setting( 'wsl-settings-group-contacts-import' , 'wsl_settings_contacts_import_twitter' );
|
220 |
+
register_setting( 'wsl-settings-group-contacts-import' , 'wsl_settings_contacts_import_live' );
|
221 |
+
register_setting( 'wsl-settings-group-contacts-import' , 'wsl_settings_contacts_import_linkedin' );
|
222 |
+
|
223 |
+
register_setting( 'wsl-settings-group-bouncer' , 'wsl_settings_bouncer_registration_enabled' );
|
224 |
+
register_setting( 'wsl-settings-group-bouncer' , 'wsl_settings_bouncer_authentication_enabled' );
|
225 |
+
|
226 |
+
register_setting( 'wsl-settings-group-bouncer' , 'wsl_settings_bouncer_profile_completion_require_email' );
|
227 |
+
register_setting( 'wsl-settings-group-bouncer' , 'wsl_settings_bouncer_profile_completion_change_email' );
|
228 |
+
register_setting( 'wsl-settings-group-bouncer' , 'wsl_settings_bouncer_profile_completion_change_username' );
|
229 |
+
register_setting( 'wsl-settings-group-bouncer' , 'wsl_settings_bouncer_profile_completion_text_notice' );
|
230 |
+
register_setting( 'wsl-settings-group-bouncer' , 'wsl_settings_bouncer_profile_completion_text_submit_button' );
|
231 |
+
register_setting( 'wsl-settings-group-bouncer' , 'wsl_settings_bouncer_profile_completion_text_connected_with' );
|
232 |
+
register_setting( 'wsl-settings-group-bouncer' , 'wsl_settings_bouncer_profile_completion_text_email' );
|
233 |
+
register_setting( 'wsl-settings-group-bouncer' , 'wsl_settings_bouncer_profile_completion_text_username' );
|
234 |
+
register_setting( 'wsl-settings-group-bouncer' , 'wsl_settings_bouncer_profile_completion_text_email_invalid' );
|
235 |
+
register_setting( 'wsl-settings-group-bouncer' , 'wsl_settings_bouncer_profile_completion_text_username_invalid' );
|
236 |
+
register_setting( 'wsl-settings-group-bouncer' , 'wsl_settings_bouncer_profile_completion_text_email_exists' );
|
237 |
+
register_setting( 'wsl-settings-group-bouncer' , 'wsl_settings_bouncer_profile_completion_text_username_exists' );
|
238 |
+
|
239 |
+
register_setting( 'wsl-settings-group-bouncer' , 'wsl_settings_bouncer_new_users_moderation_level' );
|
240 |
+
register_setting( 'wsl-settings-group-bouncer' , 'wsl_settings_bouncer_new_users_membership_default_role' );
|
241 |
+
|
242 |
+
register_setting( 'wsl-settings-group-bouncer' , 'wsl_settings_bouncer_new_users_restrict_domain_enabled' );
|
243 |
+
register_setting( 'wsl-settings-group-bouncer' , 'wsl_settings_bouncer_new_users_restrict_domain_list' );
|
244 |
+
register_setting( 'wsl-settings-group-bouncer' , 'wsl_settings_bouncer_new_users_restrict_domain_text_bounce' );
|
245 |
+
register_setting( 'wsl-settings-group-bouncer' , 'wsl_settings_bouncer_new_users_restrict_email_enabled' );
|
246 |
+
register_setting( 'wsl-settings-group-bouncer' , 'wsl_settings_bouncer_new_users_restrict_email_list' );
|
247 |
+
register_setting( 'wsl-settings-group-bouncer' , 'wsl_settings_bouncer_new_users_restrict_email_text_bounce' );
|
248 |
+
register_setting( 'wsl-settings-group-bouncer' , 'wsl_settings_bouncer_new_users_restrict_profile_enabled' );
|
249 |
+
register_setting( 'wsl-settings-group-bouncer' , 'wsl_settings_bouncer_new_users_restrict_profile_list' );
|
250 |
+
register_setting( 'wsl-settings-group-bouncer' , 'wsl_settings_bouncer_new_users_restrict_profile_text_bounce' );
|
251 |
+
|
252 |
+
register_setting( 'wsl-settings-group-advanced-settings', 'wsl_settings_base_url' );
|
253 |
+
|
254 |
+
register_setting( 'wsl-settings-group-development' , 'wsl_settings_development_mode_enabled' );
|
255 |
+
|
256 |
+
add_option( 'wsl_settings_welcome_panel_enabled' );
|
257 |
+
|
258 |
+
// update old/all default wsl-settings
|
259 |
+
wsl_check_compatibilities();
|
260 |
+
|
261 |
+
// HOOKABLE:
|
262 |
+
do_action( 'wsl_register_setting_end' );
|
263 |
+
}
|
264 |
+
|
265 |
+
// --------------------------------------------------------------------
|
266 |
+
|
267 |
+
/**
|
268 |
+
* Display WordPress Social Login on top bar menu
|
269 |
+
*/
|
270 |
+
function wsl_admin_menu_top_bar()
|
271 |
+
{
|
272 |
+
if ( ! is_user_logged_in() ) {
|
273 |
+
return ;
|
274 |
+
}
|
275 |
+
|
276 |
+
if ( ! is_admin() ) {
|
277 |
+
return ;
|
278 |
+
}
|
279 |
+
|
280 |
+
if ( ! is_admin_bar_showing() ) {
|
281 |
+
return ;
|
282 |
+
}
|
283 |
+
|
284 |
+
if ( ! current_user_can( 'manage_options' ) ) {
|
285 |
+
return ;
|
286 |
+
}
|
287 |
+
|
288 |
+
global $wp_admin_bar;
|
289 |
+
|
290 |
+
$wp_admin_bar->add_menu(array(
|
291 |
+
'id' => 'wp-admin-wordpress-social-login',
|
292 |
+
'title' => __('WordPress Social Login', 'wordpress-social-login'),
|
293 |
+
'href' => 'options-general.php?page=wordpress-social-login'
|
294 |
+
));
|
295 |
+
|
296 |
+
$wp_admin_bar->add_menu(array(
|
297 |
+
"id" => "wp-admin-wordpress-social-login-item-1",
|
298 |
+
"title" => __('Social networks setup', 'wordpress-social-login'),
|
299 |
+
'href' => 'options-general.php?page=wordpress-social-login',
|
300 |
+
"parent" => "wp-admin-wordpress-social-login"
|
301 |
+
));
|
302 |
+
|
303 |
+
$wp_admin_bar->add_menu(array(
|
304 |
+
"id" => "wp-admin-wordpress-social-login-item-2",
|
305 |
+
"title" => __('Widget customization', 'wordpress-social-login'),
|
306 |
+
'href' => 'options-general.php?page=wordpress-social-login&wslp=login-widget',
|
307 |
+
"parent" => "wp-admin-wordpress-social-login"
|
308 |
+
));
|
309 |
+
|
310 |
+
$wp_admin_bar->add_menu(array(
|
311 |
+
"id" => "wp-admin-wordpress-social-login-item-3",
|
312 |
+
"title" => __('User Guide and FAQ', 'wordpress-social-login'),
|
313 |
+
'href' => 'http://hybridauth.sourceforge.net/wsl/index.html',
|
314 |
+
"parent" => "wp-admin-wordpress-social-login",
|
315 |
+
'meta' => array( 'target' => '_blank' )
|
316 |
+
));
|
317 |
+
}
|
318 |
+
|
319 |
+
add_action('wp_before_admin_bar_render', 'wsl_admin_menu_top_bar');
|
320 |
+
|
321 |
+
// --------------------------------------------------------------------
|
322 |
+
|
323 |
+
/**
|
324 |
+
* Display WordPress Social Login on settings as submenu
|
325 |
+
*/
|
326 |
+
function wsl_admin_menu()
|
327 |
+
{
|
328 |
+
add_options_page('WP Social Login', 'WP Social Login', 'manage_options', 'wordpress-social-login', 'wsl_admin_init' );
|
329 |
+
|
330 |
+
add_action( 'admin_init', 'wsl_register_setting' );
|
331 |
+
}
|
332 |
+
|
333 |
+
add_action('admin_menu', 'wsl_admin_menu' );
|
334 |
+
|
335 |
+
// --------------------------------------------------------------------
|
336 |
+
|
337 |
+
/**
|
338 |
+
* Display WordPress Social Login on sidebar
|
339 |
+
*/
|
340 |
+
function wsl_admin_menu_sidebar()
|
341 |
+
{
|
342 |
+
add_menu_page( 'WP Social Login', 'WP Social Login', 'manage_options', 'wordpress-social-login', 'wsl_admin_init' );
|
343 |
+
}
|
344 |
+
|
345 |
+
// add_action('admin_menu', 'wsl_admin_menu_sidebar');
|
346 |
+
|
347 |
+
// --------------------------------------------------------------------
|
348 |
+
|
349 |
+
/**
|
350 |
+
* Add a new column to wp-admin/users.php
|
351 |
+
*/
|
352 |
+
function wsl_manage_users_columns( $columns )
|
353 |
+
{
|
354 |
+
$columns['wsl_column'] = "WP Social Login";
|
355 |
+
|
356 |
+
return $columns;
|
357 |
+
}
|
358 |
+
|
359 |
+
add_filter('manage_users_columns', 'wsl_manage_users_columns');
|
360 |
+
|
361 |
+
|
362 |
+
// --------------------------------------------------------------------
|
363 |
+
|
364 |
+
/**
|
365 |
+
* Alter wp-admin/edit-comments.php
|
366 |
+
*/
|
367 |
+
function wsl_comment_row_actions( $a ) {
|
368 |
+
global $comment;
|
369 |
+
|
370 |
+
$tmp = wsl_get_user_by_meta_key_and_user_id( "wsl_user_image", $comment->user_id);
|
371 |
+
|
372 |
+
if ( $tmp ) {
|
373 |
+
$a[ 'wsl_profile' ] = '<a href="options-general.php?page=wordpress-social-login&wslp=users&uid=' . $comment->user_id . '">' . _wsl__("WSL user profile", 'wordpress-social-login') . '</a>';
|
374 |
+
$a[ 'wsl_contacts' ] = '<a href="options-general.php?page=wordpress-social-login&wslp=contacts&uid=' . $comment->user_id . '">' . _wsl__("WSL user contacts", 'wordpress-social-login') . '</a>';
|
375 |
+
}
|
376 |
+
|
377 |
+
return $a;
|
378 |
+
}
|
379 |
+
|
380 |
+
add_filter( 'comment_row_actions', 'wsl_comment_row_actions', 11, 1 );
|
381 |
+
|
382 |
+
// --------------------------------------------------------------------
|
383 |
+
|
384 |
+
/**
|
385 |
+
* Generate content for the added column to wp-admin/users.php
|
386 |
+
*/
|
387 |
+
function wsl_manage_users_custom_column( $value, $column_name, $user_id )
|
388 |
+
{
|
389 |
+
if ( 'wsl_column' != $column_name ) {
|
390 |
+
return $value;
|
391 |
+
}
|
392 |
+
|
393 |
+
$tmp = wsl_get_user_by_meta_key_and_user_id( "wsl_user_image", $user_id);
|
394 |
+
|
395 |
+
if ( ! $tmp ) {
|
396 |
+
return "";
|
397 |
+
}
|
398 |
+
|
399 |
+
return
|
400 |
+
'<a href="options-general.php?page=wordpress-social-login&wslp=users&uid=' . $user_id . '">' . _wsl__("Profile", 'wordpress-social-login') . '</a> | <a href="options-general.php?page=wordpress-social-login&wslp=contacts&uid=' . $user_id . '">' . _wsl__("Contacts", 'wordpress-social-login') . '</a>';
|
401 |
+
}
|
402 |
+
|
403 |
+
add_action( 'manage_users_custom_column', 'wsl_manage_users_custom_column', 10, 3 );
|
404 |
+
|
405 |
+
// --------------------------------------------------------------------
|
includes/settings/wsl.providers.php
ADDED
@@ -0,0 +1,245 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/*!
|
3 |
+
* WordPress Social Login
|
4 |
+
*
|
5 |
+
* http://hybridauth.sourceforge.net/wsl/index.html | http://github.com/hybridauth/WordPress-Social-Login
|
6 |
+
* (c) 2011-2013 Mohamed Mrassi and contributors | http://wordpress.org/extend/plugins/wordpress-social-login/
|
7 |
+
*/
|
8 |
+
|
9 |
+
/**
|
10 |
+
* List of supported providers by Hybridauth Library
|
11 |
+
*
|
12 |
+
* Here are defined a 24 idp or so. If you need even more of the Hybridauth additional providers,
|
13 |
+
* then you need to download additional providers package at http://hybridauth.sf.net/download.html
|
14 |
+
* and then copy needed additional providers to the library.
|
15 |
+
*
|
16 |
+
* For instance, to get Identica provider working you need to copy 'hybridauth-identica/Providers/Identica.php'
|
17 |
+
* to 'plugins/wordpress-social-login/hybridauth/Hybrid/Providers/Identica.php' and then add it to
|
18 |
+
* $WORDPRESS_SOCIAL_LOGIN_PROVIDERS_CONFIG.
|
19 |
+
*
|
20 |
+
* After that you just need to configure your application ID, private and secret keys at the plugin
|
21 |
+
* configuration pages.
|
22 |
+
*/
|
23 |
+
|
24 |
+
// Exit if accessed directly
|
25 |
+
if ( !defined( 'ABSPATH' ) ) exit;
|
26 |
+
|
27 |
+
// --------------------------------------------------------------------
|
28 |
+
|
29 |
+
$WORDPRESS_SOCIAL_LOGIN_PROVIDERS_CONFIG = ARRAY(
|
30 |
+
ARRAY(
|
31 |
+
"provider_id" => "Facebook",
|
32 |
+
"provider_name" => "Facebook",
|
33 |
+
"require_client_id" => true,
|
34 |
+
"new_app_link" => "https://developers.facebook.com/apps",
|
35 |
+
|
36 |
+
"default_network" => true,
|
37 |
+
"cat" => "socialnetworks",
|
38 |
+
)
|
39 |
+
,
|
40 |
+
ARRAY(
|
41 |
+
"provider_id" => "Google",
|
42 |
+
"provider_name" => "Google",
|
43 |
+
"callback" => true,
|
44 |
+
"require_client_id" => true,
|
45 |
+
"new_app_link" => "https://code.google.com/apis/console/",
|
46 |
+
|
47 |
+
"default_network" => true,
|
48 |
+
"cat" => "socialnetworks",
|
49 |
+
)
|
50 |
+
,
|
51 |
+
ARRAY(
|
52 |
+
"provider_id" => "Twitter",
|
53 |
+
"provider_name" => "Twitter",
|
54 |
+
"new_app_link" => "https://dev.twitter.com/apps",
|
55 |
+
|
56 |
+
"default_network" => true,
|
57 |
+
|
58 |
+
"cat" => "microblogging",
|
59 |
+
)
|
60 |
+
,
|
61 |
+
ARRAY(
|
62 |
+
"provider_id" => "Live",
|
63 |
+
"provider_name" => "Windows Live",
|
64 |
+
"require_client_id" => true,
|
65 |
+
"new_app_link" => "https://manage.dev.live.com/ApplicationOverview.aspx",
|
66 |
+
|
67 |
+
"cat" => "pleasedie",
|
68 |
+
)
|
69 |
+
,
|
70 |
+
ARRAY(
|
71 |
+
"provider_id" => "Yahoo",
|
72 |
+
"provider_name" => "Yahoo!",
|
73 |
+
"new_app_link" => null,
|
74 |
+
|
75 |
+
"cat" => "pleasedie",
|
76 |
+
)
|
77 |
+
,
|
78 |
+
ARRAY(
|
79 |
+
"provider_id" => "MySpace",
|
80 |
+
"provider_name" => "MySpace",
|
81 |
+
"new_app_link" => "http://www.developer.myspace.com/",
|
82 |
+
|
83 |
+
"cat" => "pleasedie",
|
84 |
+
)
|
85 |
+
,
|
86 |
+
ARRAY(
|
87 |
+
"provider_id" => "Foursquare",
|
88 |
+
"provider_name" => "Foursquare",
|
89 |
+
"callback" => true,
|
90 |
+
"require_client_id" => true,
|
91 |
+
"new_app_link" => "https://www.foursquare.com/oauth/",
|
92 |
+
|
93 |
+
"cat" => "microblogging",
|
94 |
+
)
|
95 |
+
,
|
96 |
+
ARRAY(
|
97 |
+
"provider_id" => "LinkedIn",
|
98 |
+
"provider_name" => "LinkedIn",
|
99 |
+
"new_app_link" => "https://www.linkedin.com/secure/developer",
|
100 |
+
|
101 |
+
"cat" => "professional",
|
102 |
+
)
|
103 |
+
,
|
104 |
+
ARRAY(
|
105 |
+
"provider_id" => "AOL",
|
106 |
+
"provider_name" => "AOL",
|
107 |
+
"new_app_link" => null,
|
108 |
+
|
109 |
+
"cat" => "pleasedie",
|
110 |
+
)
|
111 |
+
,
|
112 |
+
ARRAY(
|
113 |
+
"provider_id" => "Vkontakte",
|
114 |
+
"provider_name" => "Vkontakte",
|
115 |
+
"callback" => true,
|
116 |
+
"require_client_id" => true,
|
117 |
+
"new_app_link" => "http://vk.com/developers.php",
|
118 |
+
|
119 |
+
"cat" => "socialnetworks",
|
120 |
+
)
|
121 |
+
,
|
122 |
+
ARRAY(
|
123 |
+
"provider_id" => "LastFM",
|
124 |
+
"provider_name" => "Last.FM",
|
125 |
+
"new_app_link" => "http://www.lastfm.com/api/account",
|
126 |
+
|
127 |
+
"cat" => "media",
|
128 |
+
)
|
129 |
+
,
|
130 |
+
ARRAY(
|
131 |
+
"provider_id" => "Instagram",
|
132 |
+
"provider_name" => "Instagram",
|
133 |
+
"callback" => true,
|
134 |
+
"require_client_id" => true,
|
135 |
+
"new_app_link" => "http://instagr.am/developer/clients/manage/",
|
136 |
+
|
137 |
+
"cat" => "media",
|
138 |
+
)
|
139 |
+
,
|
140 |
+
ARRAY(
|
141 |
+
"provider_id" => "Identica",
|
142 |
+
"provider_name" => "Identica",
|
143 |
+
"new_app_link" => "http://identi.ca/settings/oauthapps/new",
|
144 |
+
|
145 |
+
"cat" => "microblogging",
|
146 |
+
)
|
147 |
+
,
|
148 |
+
ARRAY(
|
149 |
+
"provider_id" => "Tumblr",
|
150 |
+
"provider_name" => "Tumblr",
|
151 |
+
"new_app_link" => "http://www.tumblr.com/oauth/apps",
|
152 |
+
|
153 |
+
"cat" => "microblogging", // o well
|
154 |
+
),
|
155 |
+
ARRAY(
|
156 |
+
"provider_id" => "Goodreads",
|
157 |
+
"provider_name" => "Goodreads",
|
158 |
+
"callback" => true,
|
159 |
+
"new_app_link" => "http://www.goodreads.com/api",
|
160 |
+
|
161 |
+
"cat" => "media",
|
162 |
+
),
|
163 |
+
ARRAY(
|
164 |
+
"provider_id" => "Stackoverflow",
|
165 |
+
"provider_name" => "Stackoverflow",
|
166 |
+
"new_app_link" => null,
|
167 |
+
|
168 |
+
"cat" => "programmers",
|
169 |
+
),
|
170 |
+
ARRAY(
|
171 |
+
"provider_id" => "GitHub",
|
172 |
+
"provider_name" => "GitHub",
|
173 |
+
"require_client_id" => true,
|
174 |
+
"callback" => true,
|
175 |
+
"new_app_link" => "https://github.com/settings/applications/new",
|
176 |
+
|
177 |
+
"cat" => "programmers",
|
178 |
+
),
|
179 |
+
ARRAY(
|
180 |
+
"provider_id" => "500px",
|
181 |
+
"provider_name" => "px500",
|
182 |
+
"new_app_link" => "http://developers.500px.com/",
|
183 |
+
|
184 |
+
"cat" => "media",
|
185 |
+
),
|
186 |
+
ARRAY(
|
187 |
+
"provider_id" => "Skyrock",
|
188 |
+
"provider_name" => "Skyrock",
|
189 |
+
"new_app_link" => "https://www.skyrock.com/developer/application",
|
190 |
+
|
191 |
+
"cat" => "socialnetworks",
|
192 |
+
),
|
193 |
+
ARRAY(
|
194 |
+
"provider_id" => "Mixi",
|
195 |
+
"provider_name" => "Mixi",
|
196 |
+
"new_app_link" => null,
|
197 |
+
|
198 |
+
"cat" => "socialnetworks",
|
199 |
+
),
|
200 |
+
ARRAY(
|
201 |
+
"provider_id" => "Steam",
|
202 |
+
"provider_name" => "Steam",
|
203 |
+
"new_app_link" => null,
|
204 |
+
|
205 |
+
"cat" => "gamers",
|
206 |
+
),
|
207 |
+
ARRAY(
|
208 |
+
"provider_id" => "TwitchTV",
|
209 |
+
"provider_name" => "Twitch.tv",
|
210 |
+
"require_client_id" => true,
|
211 |
+
"callback" => true,
|
212 |
+
"new_app_link" => "http://www.twitch.tv/settings?section=applications",
|
213 |
+
|
214 |
+
"cat" => "gamers",
|
215 |
+
),
|
216 |
+
ARRAY(
|
217 |
+
"provider_id" => "Mailru",
|
218 |
+
"provider_name" => "Mailru",
|
219 |
+
"require_client_id" => true,
|
220 |
+
"callback" => true,
|
221 |
+
"new_app_link" => "http://api.mail.ru/",
|
222 |
+
|
223 |
+
"cat" => "misc",
|
224 |
+
),
|
225 |
+
ARRAY(
|
226 |
+
"provider_id" => "Yandex",
|
227 |
+
"provider_name" => "Yandex",
|
228 |
+
"require_client_id" => true,
|
229 |
+
"callback" => true,
|
230 |
+
"new_app_link" => "http://api.yandex.ru",
|
231 |
+
|
232 |
+
"cat" => "misc",
|
233 |
+
),
|
234 |
+
ARRAY(
|
235 |
+
"provider_id" => "Odnoklassniki",
|
236 |
+
"provider_name" => "Odnoklassniki",
|
237 |
+
"require_client_id" => true,
|
238 |
+
"callback" => true,
|
239 |
+
"new_app_link" => "http://dev.odnoklassniki.ru/",
|
240 |
+
|
241 |
+
"cat" => "socialnetworks",
|
242 |
+
),
|
243 |
+
);
|
244 |
+
|
245 |
+
// --------------------------------------------------------------------
|
includes/widgets/wsl.auth.widget.php
ADDED
@@ -0,0 +1,456 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/*!
|
3 |
+
* WordPress Social Login
|
4 |
+
*
|
5 |
+
* http://hybridauth.sourceforge.net/wsl/index.html | http://github.com/hybridauth/WordPress-Social-Login
|
6 |
+
* (c) 2011-2013 Mohamed Mrassi and contributors | http://wordpress.org/extend/plugins/wordpress-social-login/
|
7 |
+
*/
|
8 |
+
|
9 |
+
/**
|
10 |
+
* Authentication widgets generator
|
11 |
+
*/
|
12 |
+
|
13 |
+
// Exit if accessed directly
|
14 |
+
if ( !defined( 'ABSPATH' ) ) exit;
|
15 |
+
|
16 |
+
// --------------------------------------------------------------------
|
17 |
+
|
18 |
+
function wsl_render_login_form()
|
19 |
+
{
|
20 |
+
if ( is_user_logged_in() && ! is_admin() ){
|
21 |
+
return;
|
22 |
+
}
|
23 |
+
|
24 |
+
// Bouncer :: Allow authentication
|
25 |
+
if( get_option( 'wsl_settings_bouncer_authentication_enabled' ) == 2 ){
|
26 |
+
return;
|
27 |
+
}
|
28 |
+
|
29 |
+
// HOOKABLE: want to generate your own widget? fine, but Bouncer rules tho
|
30 |
+
if( apply_filters( 'wsl_render_login_form_takeover', null ) ){
|
31 |
+
return;
|
32 |
+
}
|
33 |
+
|
34 |
+
// HOOKABLE:
|
35 |
+
do_action( 'wsl_render_login_form_start' );
|
36 |
+
|
37 |
+
GLOBAL $WORDPRESS_SOCIAL_LOGIN_PROVIDERS_CONFIG;
|
38 |
+
|
39 |
+
if( empty( $social_icon_set ) ){
|
40 |
+
$social_icon_set = "wpzoom/";
|
41 |
+
}
|
42 |
+
else{
|
43 |
+
$social_icon_set .= "/";
|
44 |
+
}
|
45 |
+
|
46 |
+
$assets_base_url = WORDPRESS_SOCIAL_LOGIN_PLUGIN_URL . '/assets/img/32x32/' . $social_icon_set;
|
47 |
+
|
48 |
+
// HOOKABLE: allow use of other icon sets
|
49 |
+
$assets_base_url = apply_filters( 'wsl_later_hook_assets_base_url', $assets_base_url );
|
50 |
+
|
51 |
+
$wsl_settings_connect_with_label = get_option( 'wsl_settings_connect_with_label' );
|
52 |
+
|
53 |
+
$current_page_url = 'http';
|
54 |
+
if (isset($_SERVER["HTTPS"]) && ($_SERVER["HTTPS"] == "on")) {
|
55 |
+
$current_page_url .= "s";
|
56 |
+
}
|
57 |
+
$current_page_url .= "://";
|
58 |
+
if ($_SERVER["SERVER_PORT"] != "80") {
|
59 |
+
$current_page_url .= $_SERVER["HTTP_HOST"].":".$_SERVER["SERVER_PORT"].$_SERVER["REQUEST_URI"];
|
60 |
+
}
|
61 |
+
else {
|
62 |
+
$current_page_url .= $_SERVER["HTTP_HOST"].$_SERVER["REQUEST_URI"];
|
63 |
+
}
|
64 |
+
|
65 |
+
$authenticate_base_url = site_url( 'wp-login.php', 'login_post' ) . ( strpos( site_url( 'wp-login.php', 'login_post' ), '?' ) ? '&' : '?' ) . "action=wordpress_social_authenticate&";
|
66 |
+
|
67 |
+
// overwrite endpoint_url if need'd
|
68 |
+
if( get_option( 'wsl_settings_hide_wp_login' ) == 1 ){
|
69 |
+
$authenticate_base_url = WORDPRESS_SOCIAL_LOGIN_PLUGIN_URL . "/services/authenticate.php?";
|
70 |
+
}
|
71 |
+
?>
|
72 |
+
<!--
|
73 |
+
wsl_render_login_form
|
74 |
+
WordPress Social Login Plugin ( <?php echo $_SESSION["wsl::plugin"] ?> )
|
75 |
+
http://wordpress.org/extend/plugins/wordpress-social-login/
|
76 |
+
-->
|
77 |
+
<?php
|
78 |
+
$wsl_settings_authentication_widget_css = get_option( 'wsl_settings_authentication_widget_css' );
|
79 |
+
|
80 |
+
// if not empty and not the default
|
81 |
+
if( ! empty( $wsl_settings_authentication_widget_css ) ){
|
82 |
+
?>
|
83 |
+
<style>
|
84 |
+
<?php echo $wsl_settings_authentication_widget_css ?>
|
85 |
+
</style>
|
86 |
+
<?php
|
87 |
+
}
|
88 |
+
?>
|
89 |
+
<span id="wp-social-login-connect-with"><?php echo $wsl_settings_connect_with_label ?></span>
|
90 |
+
<div id="wp-social-login-connect-options">
|
91 |
+
<?php
|
92 |
+
$nok = true;
|
93 |
+
|
94 |
+
// display provider icons
|
95 |
+
foreach( $WORDPRESS_SOCIAL_LOGIN_PROVIDERS_CONFIG AS $item ){
|
96 |
+
$provider_id = @ $item["provider_id"];
|
97 |
+
$provider_name = @ $item["provider_name"];
|
98 |
+
|
99 |
+
$authenticate_url = $authenticate_base_url . "provider=" . $provider_id . "&redirect_to=" . urlencode( $current_page_url );
|
100 |
+
|
101 |
+
if( get_option( 'wsl_settings_' . $provider_id . '_enabled' ) ){
|
102 |
+
// HOOKABLE: allow use of other icon sets
|
103 |
+
$provider_icon_markup = apply_filters( 'wsl_alter_hook_provider_icon_markup', $provider_id );
|
104 |
+
|
105 |
+
$wsl_settings_use_popup = get_option( 'wsl_settings_use_popup' ) ;
|
106 |
+
|
107 |
+
if( $provider_icon_markup != $provider_id ){
|
108 |
+
echo $provider_icon_markup;
|
109 |
+
}
|
110 |
+
elseif( $wsl_settings_use_popup == 1 ){
|
111 |
+
?>
|
112 |
+
<a rel="nofollow" href="javascript:void(0);" title="Connect with <?php echo $provider_name ?>" class="wsl_connect_with_provider" data-provider="<?php echo $provider_id ?>">
|
113 |
+
<img alt="<?php echo $provider_name ?>" title="<?php echo $provider_name ?>" src="<?php echo $assets_base_url . strtolower( $provider_id ) . '.png' ?>" />
|
114 |
+
</a>
|
115 |
+
<?php
|
116 |
+
}
|
117 |
+
elseif( $wsl_settings_use_popup == 2 ){
|
118 |
+
?>
|
119 |
+
<a rel="nofollow" href="<?php echo esc_url( $authenticate_url ) ?>" title="Connect with <?php echo $provider_name ?>" class="wsl_connect_with_provider" >
|
120 |
+
<img alt="<?php echo $provider_name ?>" title="<?php echo $provider_name ?>" src="<?php echo $assets_base_url . strtolower( $provider_id ) . '.png' ?>" />
|
121 |
+
</a>
|
122 |
+
<?php
|
123 |
+
}
|
124 |
+
|
125 |
+
$nok = false;
|
126 |
+
}
|
127 |
+
}
|
128 |
+
|
129 |
+
if( $nok ){
|
130 |
+
?>
|
131 |
+
<p style="background-color: #FFFFE0;border:1px solid #E6DB55;padding:5px;">
|
132 |
+
<?php _wsl_e( '<strong style="color:red;">WordPress Social Login is not configured yet!</strong><br />Please visit the <strong>Settings\ WP Social Login</strong> administration page to configure this plugin.<br />For more information please refer to the plugin <a href="http://hybridauth.sourceforge.net/userguide/Plugin_WordPress_Social_Login.html">online user guide</a> or contact us at <a href="http://hybridauth.sourceforge.net/">hybridauth.sourceforge.net</a>' , 'wordpress-social-login') ?>
|
133 |
+
</p>
|
134 |
+
<style>
|
135 |
+
#wp-social-login-connect-with{display:none;}
|
136 |
+
</style>
|
137 |
+
<?php
|
138 |
+
}
|
139 |
+
|
140 |
+
// provide popup url for hybridauth callback
|
141 |
+
if( get_option( 'wsl_settings_use_popup' ) == 1 ){
|
142 |
+
?>
|
143 |
+
<input id="wsl_popup_base_url" type="hidden" value="<?php echo esc_url( $authenticate_base_url ) ?>" />
|
144 |
+
<input type="hidden" id="wsl_login_form_uri" value="<?php echo esc_url( site_url( 'wp-login.php', 'login_post' ) ); ?>" />
|
145 |
+
<?php
|
146 |
+
}
|
147 |
+
?>
|
148 |
+
</div>
|
149 |
+
<!-- /wsl_render_login_form -->
|
150 |
+
<?php
|
151 |
+
|
152 |
+
// HOOKABLE:
|
153 |
+
do_action( 'wsl_render_login_form_end' );
|
154 |
+
}
|
155 |
+
|
156 |
+
// --------------------------------------------------------------------
|
157 |
+
|
158 |
+
# {{{ render widget
|
159 |
+
|
160 |
+
function wsl_render_login_form_login()
|
161 |
+
{
|
162 |
+
wsl_render_login_form();
|
163 |
+
}
|
164 |
+
|
165 |
+
add_action( 'wordpress_social_login', 'wsl_render_login_form_login' );
|
166 |
+
|
167 |
+
// --------------------------------------------------------------------
|
168 |
+
|
169 |
+
// display on comment area
|
170 |
+
function wsl_render_comment_form()
|
171 |
+
{
|
172 |
+
if( comments_open() && ! is_user_logged_in() ) {
|
173 |
+
if( ! get_option( 'wsl_settings_widget_display' ) || get_option( 'wsl_settings_widget_display' ) == 1 || get_option( 'wsl_settings_widget_display' ) == 2 ){
|
174 |
+
wsl_render_login_form();
|
175 |
+
}
|
176 |
+
}
|
177 |
+
}
|
178 |
+
|
179 |
+
add_action( 'comment_form_top', 'wsl_render_comment_form' );
|
180 |
+
|
181 |
+
// --------------------------------------------------------------------
|
182 |
+
|
183 |
+
// display on login form
|
184 |
+
function wsl_render_login_form_login_form()
|
185 |
+
{
|
186 |
+
if( get_option( 'wsl_settings_widget_display' ) == 1 || get_option( 'wsl_settings_widget_display' ) == 3 ){
|
187 |
+
wsl_render_login_form();
|
188 |
+
}
|
189 |
+
}
|
190 |
+
|
191 |
+
add_action( 'login_form', 'wsl_render_login_form_login_form' );
|
192 |
+
add_action ('bp_before_account_details_fields', 'wsl_render_login_form_login_form');
|
193 |
+
add_action ('bp_before_sidebar_login_form', 'wsl_render_login_form_login_form');
|
194 |
+
|
195 |
+
// --------------------------------------------------------------------
|
196 |
+
|
197 |
+
// display on login & register form
|
198 |
+
function wsl_render_login_form_login_on_register_and_login()
|
199 |
+
{
|
200 |
+
if( get_option( 'wsl_settings_widget_display' ) == 1 ){
|
201 |
+
wsl_render_login_form();
|
202 |
+
}
|
203 |
+
}
|
204 |
+
|
205 |
+
add_action( 'register_form', 'wsl_render_login_form_login_on_register_and_login' );
|
206 |
+
add_action( 'after_signup_form', 'wsl_render_login_form_login_on_register_and_login' );
|
207 |
+
|
208 |
+
# }}}
|
209 |
+
|
210 |
+
// --------------------------------------------------------------------
|
211 |
+
|
212 |
+
# {{{ shortcode, js and css injectors
|
213 |
+
function wsl_shortcode_handler($args)
|
214 |
+
{
|
215 |
+
if ( ! is_user_logged_in () ){
|
216 |
+
wsl_render_login_form();
|
217 |
+
}
|
218 |
+
}
|
219 |
+
|
220 |
+
add_shortcode ( 'wordpress_social_login', 'wsl_shortcode_handler' );
|
221 |
+
|
222 |
+
// --------------------------------------------------------------------
|
223 |
+
|
224 |
+
function wsl_add_javascripts()
|
225 |
+
{
|
226 |
+
if( get_option( 'wsl_settings_use_popup' ) != 1 ){
|
227 |
+
return null;
|
228 |
+
}
|
229 |
+
|
230 |
+
if( ! wp_script_is( 'wsl_js', 'registered' ) ) {
|
231 |
+
wp_register_script( "wsl_js", WORDPRESS_SOCIAL_LOGIN_PLUGIN_URL . "/assets/js/connect.js" );
|
232 |
+
}
|
233 |
+
|
234 |
+
wp_print_scripts( "jquery" );
|
235 |
+
wp_print_scripts( "wsl_js" );
|
236 |
+
}
|
237 |
+
|
238 |
+
add_action( 'login_head', 'wsl_add_javascripts' );
|
239 |
+
add_action( 'wp_head', 'wsl_add_javascripts' );
|
240 |
+
|
241 |
+
// --------------------------------------------------------------------
|
242 |
+
|
243 |
+
function wsl_add_stylesheets()
|
244 |
+
{
|
245 |
+
if( ! wp_style_is( 'wsl_css', 'registered' ) ) {
|
246 |
+
wp_register_style( "wsl_css", WORDPRESS_SOCIAL_LOGIN_PLUGIN_URL . "/assets/css/style.css" );
|
247 |
+
}
|
248 |
+
|
249 |
+
if ( did_action( 'wp_print_styles' ) ) {
|
250 |
+
wp_print_styles( 'wsl_css' );
|
251 |
+
}
|
252 |
+
else{
|
253 |
+
wp_enqueue_style( "social_connect" );
|
254 |
+
}
|
255 |
+
}
|
256 |
+
|
257 |
+
add_action( 'login_head', 'wsl_add_stylesheets' );
|
258 |
+
add_action( 'wp_head', 'wsl_add_stylesheets' );
|
259 |
+
# }}}
|
260 |
+
|
261 |
+
// --------------------------------------------------------------------
|
262 |
+
|
263 |
+
# {{{ linking new accounts
|
264 |
+
|
265 |
+
// render a new widget on wp-admin/profile.php to permit linking profiles
|
266 |
+
// only one linked account per provider is permitted!!
|
267 |
+
function wsl_render_login_form_admin_head_user_profile_generate_html()
|
268 |
+
{
|
269 |
+
if ( ! is_user_logged_in() ){
|
270 |
+
return;
|
271 |
+
}
|
272 |
+
|
273 |
+
// HOOKABLE: allow users to generate their own
|
274 |
+
if( apply_filters( 'wsl_hook_profile_widget', null ) ){
|
275 |
+
return;
|
276 |
+
}
|
277 |
+
|
278 |
+
# if ob_start()/ob_end_clean() dont work for you then i can do nothing for you
|
279 |
+
ob_start();
|
280 |
+
|
281 |
+
global $current_user;
|
282 |
+
global $WORDPRESS_SOCIAL_LOGIN_PROVIDERS_CONFIG;
|
283 |
+
|
284 |
+
get_currentuserinfo();
|
285 |
+
|
286 |
+
$user_id = $current_user->ID;
|
287 |
+
|
288 |
+
$linked_accounts = wsl_get_user_linked_accounts_by_user_id( $user_id );
|
289 |
+
|
290 |
+
// if not WSL user, then nothing to show, yet
|
291 |
+
if( ! $linked_accounts ){
|
292 |
+
return;
|
293 |
+
}
|
294 |
+
|
295 |
+
if( empty( $social_icon_set ) ){
|
296 |
+
$social_icon_set = "wpzoom/";
|
297 |
+
}
|
298 |
+
else{
|
299 |
+
$social_icon_set .= "/";
|
300 |
+
}
|
301 |
+
|
302 |
+
$assets_base_url = WORDPRESS_SOCIAL_LOGIN_PLUGIN_URL . '/assets/img/32x32/' . $social_icon_set;
|
303 |
+
?>
|
304 |
+
<h3><?php _wsl_e("Social networks", 'wordpress-social-login') ?></h3>
|
305 |
+
<table class="form-table">
|
306 |
+
<tr>
|
307 |
+
<td valign="top">
|
308 |
+
<table id="wsl-user-profile-injected-table-b">
|
309 |
+
<tr>
|
310 |
+
<th width="80"><?php _wsl_e("Provider", 'wordpress-social-login') ?></th>
|
311 |
+
<th><?php _wsl_e("Identity", 'wordpress-social-login') ?></th>
|
312 |
+
</tr>
|
313 |
+
<?php
|
314 |
+
foreach( $linked_accounts AS $item ){
|
315 |
+
$identity = $item->profileurl;
|
316 |
+
$photourl = $item->photourl;
|
317 |
+
|
318 |
+
if( ! $identity ){
|
319 |
+
$identity = $item->identifier;
|
320 |
+
}
|
321 |
+
?>
|
322 |
+
<tr>
|
323 |
+
<td>
|
324 |
+
<?php if( $photourl ) { ?>
|
325 |
+
<img src="<?php echo $photourl ?>" style="vertical-align: top;width:16px;height:16px;" >
|
326 |
+
<?php } else { ?>
|
327 |
+
<img src="<?php echo $assets_base_url . strtolower( $item->provider ) . '.png' ?>" style="vertical-align: top;width:16px;height:16px;" />
|
328 |
+
<?php } ?>
|
329 |
+
<?php echo ucfirst( $item->provider ); ?>
|
330 |
+
</td>
|
331 |
+
<td><?php echo $identity; ?></td>
|
332 |
+
</tr>
|
333 |
+
<?php
|
334 |
+
}
|
335 |
+
?>
|
336 |
+
</table>
|
337 |
+
</td>
|
338 |
+
</tr>
|
339 |
+
</tr>
|
340 |
+
<?php
|
341 |
+
// Bouncer :: Allow authentication && Linking accounts is enabled
|
342 |
+
if( get_option( 'wsl_settings_bouncer_authentication_enabled' ) == 1 && get_option( 'wsl_settings_bouncer_linking_accounts_enabled' ) == 1 ){
|
343 |
+
$list_connected_providers = wsl_get_list_connected_providers();
|
344 |
+
?>
|
345 |
+
<tr>
|
346 |
+
<td valign="top">
|
347 |
+
<b><?php _wsl_e("Add more identities", 'wordpress-social-login') ?></b>
|
348 |
+
<br />
|
349 |
+
<?php
|
350 |
+
foreach( $WORDPRESS_SOCIAL_LOGIN_PROVIDERS_CONFIG AS $item ){
|
351 |
+
$provider_id = @ $item["provider_id"];
|
352 |
+
$provider_name = @ $item["provider_name"];
|
353 |
+
$dispaly = true;
|
354 |
+
|
355 |
+
// only one linked account per provider is permitted!!
|
356 |
+
foreach( $linked_accounts AS $link ){
|
357 |
+
if( $link->provider == $provider_id ){
|
358 |
+
$dispaly = false;
|
359 |
+
}
|
360 |
+
}
|
361 |
+
|
362 |
+
if( $dispaly ){
|
363 |
+
$social_icon_set = get_option( 'wsl_settings_social_icon_set' );
|
364 |
+
|
365 |
+
$current_page_url = admin_url("profile.php");
|
366 |
+
|
367 |
+
if( get_option( 'wsl_settings_' . $provider_id . '_enabled' ) ){
|
368 |
+
?>
|
369 |
+
<a href="<?php echo WORDPRESS_SOCIAL_LOGIN_PLUGIN_URL; ?>/services/authenticate.php?provider=<?php echo $provider_id ?>&link=1&redirect_to=<?php echo urlencode($current_page_url) ?>" title="Connect with <?php echo $provider_name ?>" style="text-decoration:none;" target="_blank">
|
370 |
+
<img alt="<?php echo $provider_name ?>" title="<?php echo $provider_name ?>" src="<?php echo $assets_base_url . strtolower( $provider_id ) . '.png' ?>" />
|
371 |
+
</a>
|
372 |
+
<?php
|
373 |
+
}
|
374 |
+
}
|
375 |
+
}
|
376 |
+
?>
|
377 |
+
</td>
|
378 |
+
</tr>
|
379 |
+
<?php
|
380 |
+
}
|
381 |
+
|
382 |
+
if( $list_connected_providers ){
|
383 |
+
?>
|
384 |
+
<tr>
|
385 |
+
<td>
|
386 |
+
<b><?php _wsl_e("Currently connected to:", 'wordpress-social-login') ?></b>
|
387 |
+
<?php echo implode( ', ', $list_connected_providers ); ?>
|
388 |
+
</td>
|
389 |
+
</tr>
|
390 |
+
<?php
|
391 |
+
}
|
392 |
+
?>
|
393 |
+
|
394 |
+
</table>
|
395 |
+
<?php
|
396 |
+
$html = ob_get_contents();
|
397 |
+
|
398 |
+
ob_end_clean();
|
399 |
+
|
400 |
+
return addslashes( preg_replace('/\s+/',' ', $html ) );
|
401 |
+
}
|
402 |
+
|
403 |
+
function wsl_render_login_form_admin_head_user_profile()
|
404 |
+
{
|
405 |
+
// HOOKABLE:
|
406 |
+
if( apply_filters( 'wsl_hook_alter_render_login_form_admin_head_user_profile', null ) ){
|
407 |
+
return;
|
408 |
+
}
|
409 |
+
?>
|
410 |
+
<style>
|
411 |
+
#wsl-user-profile-injected-table-b
|
412 |
+
{
|
413 |
+
font-family: "Lucida Sans Unicode", "Lucida Grande", Sans-Serif;
|
414 |
+
font-size: 12px;
|
415 |
+
background: #fff;
|
416 |
+
border-collapse: collapse;
|
417 |
+
text-align: left;
|
418 |
+
}
|
419 |
+
#wsl-user-profile-injected-table-b th
|
420 |
+
{
|
421 |
+
font-size: 14px;
|
422 |
+
font-weight: normal;
|
423 |
+
padding: 10px 8px;
|
424 |
+
border-bottom: 2px solid #ccc;
|
425 |
+
width: auto;
|
426 |
+
}
|
427 |
+
#wsl-user-profile-injected-table-b td
|
428 |
+
{
|
429 |
+
border-bottom: 1px solid #ccc;
|
430 |
+
padding: 6px 8px;
|
431 |
+
width: auto;
|
432 |
+
}
|
433 |
+
#wsl-user-profile-injected-table-b tbody tr:hover td
|
434 |
+
{
|
435 |
+
color: #009;
|
436 |
+
}
|
437 |
+
</style>
|
438 |
+
<script>
|
439 |
+
jQuery(document).ready(function($)
|
440 |
+
{
|
441 |
+
jQuery( '#user_login' )
|
442 |
+
.parent()
|
443 |
+
.parent()
|
444 |
+
.parent()
|
445 |
+
.parent()
|
446 |
+
.after( '<?php echo wsl_render_login_form_admin_head_user_profile_generate_html() ?>' );
|
447 |
+
});
|
448 |
+
</script>
|
449 |
+
<?php
|
450 |
+
}
|
451 |
+
|
452 |
+
add_action( 'admin_head-profile.php', 'wsl_render_login_form_admin_head_user_profile' );
|
453 |
+
|
454 |
+
# }}} linking new accounts
|
455 |
+
|
456 |
+
// --------------------------------------------------------------------
|
includes/widgets/wsl.complete.registration.php
ADDED
@@ -0,0 +1,161 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/*!
|
3 |
+
* WordPress Social Login
|
4 |
+
*
|
5 |
+
* http://hybridauth.sourceforge.net/wsl/index.html | http://github.com/hybridauth/WordPress-Social-Login
|
6 |
+
* (c) 2011-2013 Mohamed Mrassi and contributors | http://wordpress.org/extend/plugins/wordpress-social-login/
|
7 |
+
*/
|
8 |
+
|
9 |
+
/**
|
10 |
+
* Page for users completing their registration (currently used only by Bouncer::Email Validation
|
11 |
+
*/
|
12 |
+
|
13 |
+
// Exit if accessed directly
|
14 |
+
if ( !defined( 'ABSPATH' ) ) exit;
|
15 |
+
|
16 |
+
// --------------------------------------------------------------------
|
17 |
+
|
18 |
+
function wsl_process_login_complete_registration( $provider, $redirect_to, $hybridauth_user_email, $hybridauth_user_login )
|
19 |
+
{
|
20 |
+
// print_r( "$provider, $redirect_to, $hybridauth_user_email, $hybridauth_user_login" );
|
21 |
+
|
22 |
+
$assets_base_url = WORDPRESS_SOCIAL_LOGIN_PLUGIN_URL . '/assets/img/16x16/';
|
23 |
+
|
24 |
+
// check posted user email & login
|
25 |
+
$request_user_login = @ $_REQUEST["user_login"];
|
26 |
+
$request_user_email = @ $_REQUEST["user_email"];
|
27 |
+
|
28 |
+
$request_user_login = sanitize_user( $request_user_login );
|
29 |
+
$request_user_email = sanitize_email( $request_user_email );
|
30 |
+
|
31 |
+
$request_user_login_exists = username_exists ( $request_user_login );
|
32 |
+
$request_user_email_exists = email_exists ( $request_user_email );
|
33 |
+
|
34 |
+
$request_user_login_validate = validate_username ( $request_user_login );
|
35 |
+
$request_user_email_validate = filter_var( $request_user_email, FILTER_VALIDATE_EMAIL ) ;
|
36 |
+
|
37 |
+
if( empty( $request_user_login ) ) $request_user_login_validate = false;
|
38 |
+
if( empty( $request_user_email ) ) $request_user_email_validate = false;
|
39 |
+
|
40 |
+
if( empty( $request_user_login ) ) $request_user_login = $hybridauth_user_login;
|
41 |
+
if( empty( $request_user_email ) ) $request_user_email = $hybridauth_user_email;
|
42 |
+
|
43 |
+
$shall_pass = true;
|
44 |
+
$shall_pass_errors = array();
|
45 |
+
|
46 |
+
// well until brain become able to compute again..
|
47 |
+
if( get_option( 'wsl_settings_bouncer_profile_completion_require_email' ) == 1 ){
|
48 |
+
if( ! $request_user_email ){
|
49 |
+
$shall_pass = false;
|
50 |
+
|
51 |
+
$shall_pass_errors[ get_option( 'wsl_settings_bouncer_profile_completion_text_email_invalid' ) ] = true;
|
52 |
+
}
|
53 |
+
|
54 |
+
if( ! $request_user_email_validate ){
|
55 |
+
$shall_pass = false;
|
56 |
+
|
57 |
+
$shall_pass_errors[ get_option( 'wsl_settings_bouncer_profile_completion_text_email_invalid' ) ] = true;
|
58 |
+
}
|
59 |
+
|
60 |
+
if( $request_user_email_exists ){
|
61 |
+
$shall_pass = false;
|
62 |
+
|
63 |
+
$shall_pass_errors[ get_option( 'wsl_settings_bouncer_profile_completion_text_email_exists' ) ] = true;
|
64 |
+
}
|
65 |
+
}
|
66 |
+
|
67 |
+
if( get_option( 'wsl_settings_bouncer_profile_completion_change_username' ) == 1 ){
|
68 |
+
if( ! $request_user_login ){
|
69 |
+
$shall_pass = false;
|
70 |
+
|
71 |
+
$shall_pass_errors[ get_option( 'wsl_settings_bouncer_profile_completion_text_username_invalid' ) ] = true;
|
72 |
+
}
|
73 |
+
|
74 |
+
if( ! $request_user_login_validate ){
|
75 |
+
$shall_pass = false;
|
76 |
+
|
77 |
+
$shall_pass_errors[ get_option( 'wsl_settings_bouncer_profile_completion_text_username_invalid' ) ] = true;
|
78 |
+
}
|
79 |
+
|
80 |
+
if( $request_user_login_exists ){
|
81 |
+
$shall_pass = false;
|
82 |
+
|
83 |
+
$shall_pass_errors[ get_option( 'wsl_settings_bouncer_profile_completion_text_username_exists' ) ] = true;
|
84 |
+
}
|
85 |
+
}
|
86 |
+
|
87 |
+
if( ! $shall_pass ){
|
88 |
+
?>
|
89 |
+
<!DOCTYPE html>
|
90 |
+
<head>
|
91 |
+
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
|
92 |
+
<title><?php echo get_bloginfo('name'); ?></title>
|
93 |
+
<head>
|
94 |
+
<style>
|
95 |
+
body.login{background:0 repeat scroll 0 0 #fbfbfb;min-width:0}body,#wpbody,.form-table .pre,.ui-autocomplete li a{color:#333}body{font-family:sans-serif;font-size:12px;line-height:1.4em;min-width:600px}html,body{height:100%;margin:0;padding:0}#login{margin:auto;padding:114px 0 0;width:320px}div.updated,.login .message{background-color:#ffffe0;border-color:#e6db55}.message{margin:0 0 16px 8px;padding:12px;border-radius:3px 3px 3px 3px;border-style:solid;border-width:1px}.info{font-family:sans-serif;font-size:12px;line-height:1.4em}.login form{background:0 repeat scroll 0 0 #fff;border:1px solid #e5e5e5;box-shadow:0 4px 10px -1px rgba(200,200,200,.7);font-weight:400;margin-left:8px;padding:26px 24px 46px;border-radius:3px 3px 3px 3px}.login label{color:#777;font-size:14px;cursor:pointer;vertical-align:middle}input[type="text"]{background:0 repeat scroll 0 0 #fbfbfb;border:1px solid #e5e5e5;box-shadow:1px 1px 2px rgba(200,200,200,.2) inset;color:#555;font-size:24px;font-weight:200;line-height:1;margin-bottom:16px;margin-right:6px;margin-top:2px;outline:0 none;padding:3px;width:100%}.button-primary{display:inline-block;text-decoration:none;font-size:12px;line-height:23px;height:24px;margin:0;padding:0 10px 1px;cursor:pointer;border-width:1px;border-style:solid;-webkit-border-radius:3px;-webkit-appearance:none;border-radius:3px;white-space:nowrap;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;background-color:#21759b;background-image:-webkit-gradient(linear,left top,left bottom,from(#2a95c5),to(#21759b));background-image:-webkit-linear-gradient(top,#2a95c5,#21759b);background-image:-moz-linear-gradient(top,#2a95c5,#21759b);background-image:-ms-linear-gradient(top,#2a95c5,#21759b);background-image:-o-linear-gradient(top,#2a95c5,#21759b);background-image:linear-gradient(to bottom,#2a95c5,#21759b);border-color:#21759b;border-bottom-color:#1e6a8d;-webkit-box-shadow:inset 0 1px 0 rgba(120,200,230,.5);box-shadow:inset 0 1px 0 rgba(120,200,230,.5);color:#fff;text-decoration:none;text-shadow:0 1px 0 rgba(0,0,0,.1);float:right;height:36px;}#login{width:580px}.error{margin:0 0 16px 8px;padding:12px;border-radius:3px 3px 3px 3px;border-style:solid;border-width:1px;background-color: #FFEBE8;border:1px solid #CC0000;}
|
96 |
+
</style>
|
97 |
+
<script>
|
98 |
+
function init() {
|
99 |
+
if( document.getElementById('user_login') ) document.getElementById('user_login').focus()
|
100 |
+
if( document.getElementById('user_email') ) document.getElementById('user_email').focus()
|
101 |
+
}
|
102 |
+
</script>
|
103 |
+
<body class="login" onload="init();">
|
104 |
+
<!--
|
105 |
+
wsl_process_login_complete_registration
|
106 |
+
WordPress Social Login Plugin ( <?php echo $_SESSION["wsl::plugin"] ?> )
|
107 |
+
http://wordpress.org/extend/plugins/wordpress-social-login/
|
108 |
+
-->
|
109 |
+
<div id="login">
|
110 |
+
<?php
|
111 |
+
if( ! isset( $_REQUEST["bouncer_profile_completion"] ) ){
|
112 |
+
?><p class="message"><?php echo get_option( 'wsl_settings_bouncer_profile_completion_text_notice' ); ?></p><?php
|
113 |
+
}
|
114 |
+
elseif( $shall_pass_errors ){
|
115 |
+
foreach( $shall_pass_errors as $k => $v ){
|
116 |
+
?><p class="error"><?php echo $k; ?></p><?php
|
117 |
+
}
|
118 |
+
}
|
119 |
+
?>
|
120 |
+
<form method="post" action="<?php echo site_url( 'wp-login.php', 'login_post' ); ?>" id="loginform" name="loginform">
|
121 |
+
<?php if( get_option( 'wsl_settings_bouncer_profile_completion_change_username' ) == 1 ){ ?>
|
122 |
+
<p>
|
123 |
+
<label for="user_login"><?php echo get_option( 'wsl_settings_bouncer_profile_completion_text_username' ); ?><br><input type="text" name="user_login" id="user_login" class="input" value="<?php echo $hybridauth_user_login ?>" size="25" /></label>
|
124 |
+
</p>
|
125 |
+
<?php } ?>
|
126 |
+
|
127 |
+
<?php if( get_option( 'wsl_settings_bouncer_profile_completion_require_email' ) == 1 ){ ?>
|
128 |
+
<p>
|
129 |
+
<label for="user_email"><?php echo get_option( 'wsl_settings_bouncer_profile_completion_text_email' ); ?><br><input type="text" name="user_email" id="user_email" class="input" value="<?php echo $request_user_email ?>" size="25" /></label>
|
130 |
+
</p>
|
131 |
+
<?php } ?>
|
132 |
+
|
133 |
+
<table width="100%" border="0">
|
134 |
+
<tr>
|
135 |
+
<td valign="bottom">
|
136 |
+
<span class="info">
|
137 |
+
<img src="<?php echo $assets_base_url . strtolower( $provider ) . '.png' ?>" style="vertical-align: top;width:16px;height:16px;" />
|
138 |
+
<?php echo get_option( 'wsl_settings_bouncer_profile_completion_text_connected_with' ); ?> <b><?php echo ucfirst($provider) ?></b>.
|
139 |
+
</span>
|
140 |
+
</td>
|
141 |
+
<td>
|
142 |
+
<input type="submit" value="<?php echo get_option( 'wsl_settings_bouncer_profile_completion_text_submit_button' ); ?>" class="button button-primary button-large" id="wp-submit" name="wp-submit">
|
143 |
+
</td>
|
144 |
+
</tr>
|
145 |
+
</table>
|
146 |
+
<input type="hidden" id="redirect_to" name="redirect_to" value="<?php echo $redirect_to ?>">
|
147 |
+
<input type="hidden" id="provider" name="provider" value="<?php echo $provider ?>">
|
148 |
+
<input type="hidden" id="action" name="action" value="wordpress_social_login">
|
149 |
+
<input type="hidden" id="bouncer_profile_completion" name="bouncer_profile_completion" value="1">
|
150 |
+
</form>
|
151 |
+
</div>
|
152 |
+
</body>
|
153 |
+
</html>
|
154 |
+
<?php
|
155 |
+
die();
|
156 |
+
}
|
157 |
+
|
158 |
+
return array( $shall_pass, $request_user_login, $request_user_email );
|
159 |
+
}
|
160 |
+
|
161 |
+
// --------------------------------------------------------------------
|
includes/widgets/wsl.notices.php
ADDED
@@ -0,0 +1,67 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/*!
|
3 |
+
* WordPress Social Login
|
4 |
+
*
|
5 |
+
* http://hybridauth.sourceforge.net/wsl/index.html | http://github.com/hybridauth/WordPress-Social-Login
|
6 |
+
* (c) 2011-2013 Mohamed Mrassi and contributors | http://wordpress.org/extend/plugins/wordpress-social-login/
|
7 |
+
*/
|
8 |
+
|
9 |
+
/**
|
10 |
+
* Kill WordPress execution and display HTML message with error message.
|
11 |
+
* similar to wp_die, but with (will have) more features or wp_die not defined
|
12 |
+
*/
|
13 |
+
|
14 |
+
// Exit if accessed directly
|
15 |
+
if ( !defined( 'ABSPATH' ) ) exit;
|
16 |
+
|
17 |
+
// --------------------------------------------------------------------
|
18 |
+
|
19 |
+
function wsl_render_notices_pages( $message )
|
20 |
+
{
|
21 |
+
// HOOKABLE:
|
22 |
+
do_action( 'wsl_hook_alter_render_notices_pages', $message );
|
23 |
+
?>
|
24 |
+
<!DOCTYPE html>
|
25 |
+
<head>
|
26 |
+
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
|
27 |
+
<title><?php echo get_bloginfo('name'); ?></title>
|
28 |
+
<head>
|
29 |
+
<style>
|
30 |
+
html {
|
31 |
+
background: #f9f9f9;
|
32 |
+
}
|
33 |
+
#wsl {
|
34 |
+
background: #fff;
|
35 |
+
color: #333;
|
36 |
+
font-family: sans-serif;
|
37 |
+
margin: 2em auto;
|
38 |
+
padding: 1em 2em;
|
39 |
+
-webkit-border-radius: 3px;
|
40 |
+
border-radius: 3px;
|
41 |
+
border: 1px solid #dfdfdf;
|
42 |
+
max-width: 800px;
|
43 |
+
font-size: 14px;
|
44 |
+
}
|
45 |
+
</style>
|
46 |
+
</head>
|
47 |
+
<body>
|
48 |
+
<!--
|
49 |
+
wsl_render_notices_pages
|
50 |
+
WordPress Social Login Plugin ( <?php echo $_SESSION["wsl::plugin"] ?> )
|
51 |
+
http://wordpress.org/extend/plugins/wordpress-social-login/
|
52 |
+
-->
|
53 |
+
<div id="wsl">
|
54 |
+
<table width="100%" border="0">
|
55 |
+
<tr>
|
56 |
+
<td><?php echo $message ; ?></td>
|
57 |
+
</tr>
|
58 |
+
</table>
|
59 |
+
</div>
|
60 |
+
</body>
|
61 |
+
</html>
|
62 |
+
<?php
|
63 |
+
|
64 |
+
die();
|
65 |
+
}
|
66 |
+
|
67 |
+
// --------------------------------------------------------------------
|
languages/wordpress-social-login-ar.mo
ADDED
Binary file
|
languages/wordpress-social-login-ar.po
ADDED
@@ -0,0 +1,1446 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
msgid ""
|
2 |
+
msgstr ""
|
3 |
+
"Project-Id-Version: WordPress Social Login\n"
|
4 |
+
"POT-Creation-Date: 2013-02-16 06:40+0100\n"
|
5 |
+
"PO-Revision-Date: 2013-02-16 06:41+0100\n"
|
6 |
+
"Last-Translator: Miled <hybridauth@gmail.com>\n"
|
7 |
+
"Language-Team: WordPress Social Login <hybridauth@gmail.com>\n"
|
8 |
+
"Language: Arabic – عربي (ar)\n"
|
9 |
+
"MIME-Version: 1.0\n"
|
10 |
+
"Content-Type: text/plain; charset=UTF-8\n"
|
11 |
+
"Content-Transfer-Encoding: 8bit\n"
|
12 |
+
"X-Generator: Poedit 1.5.5\n"
|
13 |
+
|
14 |
+
#: includes/admin/wsl.admin.ui.php:332
|
15 |
+
msgid "Development mode is enabled!"
|
16 |
+
msgstr ""
|
17 |
+
|
18 |
+
#: includes/admin/wsl.admin.ui.php:407
|
19 |
+
#: includes/services/wsl.authentication.php:637
|
20 |
+
msgid "Something wrong!"
|
21 |
+
msgstr ""
|
22 |
+
|
23 |
+
#: includes/admin/wsl.admin.ui.php:412
|
24 |
+
msgid ""
|
25 |
+
"Unknown or Disabled <b>Component</b>! Check the list of enabled components "
|
26 |
+
"or the typed URL"
|
27 |
+
msgstr ""
|
28 |
+
|
29 |
+
#: includes/admin/wsl.admin.ui.php:416
|
30 |
+
msgid ""
|
31 |
+
"If you believe you've found a problem with <b>WordPress Social Login</b>, be "
|
32 |
+
"sure to let us know so we can fix it"
|
33 |
+
msgstr ""
|
34 |
+
|
35 |
+
#: includes/admin/wsl.admin.ui.php:422
|
36 |
+
msgid "Report as bug"
|
37 |
+
msgstr ""
|
38 |
+
|
39 |
+
#: includes/admin/wsl.admin.ui.php:423
|
40 |
+
msgid "Check enabled components"
|
41 |
+
msgstr ""
|
42 |
+
|
43 |
+
#: includes/admin/wsl.admin.ui.php:567
|
44 |
+
msgid "Welcome!"
|
45 |
+
msgstr " مرحباً بك في WordPress Social Login"
|
46 |
+
|
47 |
+
#: includes/admin/wsl.admin.ui.php:569
|
48 |
+
msgid ""
|
49 |
+
"If you are still new to WordPress Social Login, we have provided a few "
|
50 |
+
"walkthroughs to get you started"
|
51 |
+
msgstr "جمعنا لك بعض الروابط لمساعدتك على البدء"
|
52 |
+
|
53 |
+
#: includes/admin/wsl.admin.ui.php:576
|
54 |
+
msgid "Get Started"
|
55 |
+
msgstr "الخطوات التالية"
|
56 |
+
|
57 |
+
#: includes/admin/wsl.admin.ui.php:579
|
58 |
+
msgid ""
|
59 |
+
"<a href=\"http://hybridauth.sourceforge.net/wsl/configure.html\" target="
|
60 |
+
"\"_blank\">Setup and Configuration</a>"
|
61 |
+
msgstr ""
|
62 |
+
|
63 |
+
#: includes/admin/wsl.admin.ui.php:580
|
64 |
+
msgid ""
|
65 |
+
"<a href=\"http://hybridauth.sourceforge.net/wsl/customize.html\" target="
|
66 |
+
"\"_blank\">Customize WSL Widgets</a>"
|
67 |
+
msgstr ""
|
68 |
+
|
69 |
+
#: includes/admin/wsl.admin.ui.php:581
|
70 |
+
msgid ""
|
71 |
+
"<a href=\"http://hybridauth.sourceforge.net/wsl/userdata.html\" target="
|
72 |
+
"\"_blank\">Manage users and contacts</a>"
|
73 |
+
msgstr ""
|
74 |
+
|
75 |
+
#: includes/admin/wsl.admin.ui.php:582
|
76 |
+
msgid ""
|
77 |
+
"<a href=\"http://hybridauth.sourceforge.net/wsl/index.html\" target=\"_blank"
|
78 |
+
"\">WSL User Guide</a> and <a href=\"http://hybridauth.sourceforge.net/wsl/"
|
79 |
+
"faq.html\" target=\"_blank\">FAQ</a>"
|
80 |
+
msgstr ""
|
81 |
+
|
82 |
+
#: includes/admin/wsl.admin.ui.php:588
|
83 |
+
#, php-format
|
84 |
+
msgid "What's new on WSL %s"
|
85 |
+
msgstr ""
|
86 |
+
|
87 |
+
#: includes/admin/wsl.admin.ui.php:591
|
88 |
+
msgid ""
|
89 |
+
"In a similar way to WordPress plugins, WSL uses <a href=\"options-general."
|
90 |
+
"php?page=wordpress-social-login&wslp=components\">Components</a>"
|
91 |
+
msgstr ""
|
92 |
+
|
93 |
+
#: includes/admin/wsl.admin.ui.php:592
|
94 |
+
msgid "<b>Email Validation</b> is replaced with <b>Profile Completion</b>"
|
95 |
+
msgstr ""
|
96 |
+
|
97 |
+
#: includes/admin/wsl.admin.ui.php:593
|
98 |
+
msgid ""
|
99 |
+
"<b>User Moderation</b> made compatible with <a href=\"http://wordpress.org/"
|
100 |
+
"extend/plugins/theme-my-login/\" target=\"_blank\">Theme My Login</a> plugin"
|
101 |
+
msgstr ""
|
102 |
+
|
103 |
+
#: includes/admin/wsl.admin.ui.php:594
|
104 |
+
msgid "A number of enhancements and new options now available"
|
105 |
+
msgstr ""
|
106 |
+
|
107 |
+
#: includes/admin/wsl.admin.ui.php:644
|
108 |
+
msgid "Contributor License Agreement"
|
109 |
+
msgstr ""
|
110 |
+
|
111 |
+
#: includes/admin/wsl.admin.ui.php:649
|
112 |
+
msgid ""
|
113 |
+
"You are about to submit your contributions to the WordPress Social Login "
|
114 |
+
"Website to be reviewed for inclusion in future versions"
|
115 |
+
msgstr ""
|
116 |
+
|
117 |
+
#: includes/admin/wsl.admin.ui.php:651
|
118 |
+
msgid ""
|
119 |
+
"You hereby grant the permission to publish your contribution, in whole or in "
|
120 |
+
"part, and to made it available under the <b>MIT License</b>, for the "
|
121 |
+
"<b>Wordpress community</b> to, freely use or misuse"
|
122 |
+
msgstr ""
|
123 |
+
|
124 |
+
#: includes/admin/wsl.admin.ui.php:657
|
125 |
+
msgid "Hell No"
|
126 |
+
msgstr ""
|
127 |
+
|
128 |
+
#: includes/admin/wsl.admin.ui.php:658
|
129 |
+
msgid "Yes, I agree to contribute my translation"
|
130 |
+
msgstr ""
|
131 |
+
|
132 |
+
#: includes/admin/wsl.admin.ui.php:662
|
133 |
+
msgid "Help us localize WordPress Social Login"
|
134 |
+
msgstr "ساعدنا على ترجمة هذه الصفحة"
|
135 |
+
|
136 |
+
#: includes/admin/wsl.admin.ui.php:666
|
137 |
+
msgid ""
|
138 |
+
"You can <b>translate as much you pleases</b> as much <b>as you want</b>. You "
|
139 |
+
"don't have to translate everything in this page, but every word counts. "
|
140 |
+
"Ignore any string you want or aleardy translated. You could also use this "
|
141 |
+
"tool to fix any typo you may find or to improve the current language "
|
142 |
+
"expressions"
|
143 |
+
msgstr ""
|
144 |
+
|
145 |
+
#: includes/admin/wsl.admin.ui.php:668
|
146 |
+
msgid ""
|
147 |
+
"Your name allows us to recognize your contributions and bypass manual "
|
148 |
+
"review, especially when you've been contributing in the past. So do supply "
|
149 |
+
"some unique string, even if it's not your real name"
|
150 |
+
msgstr ""
|
151 |
+
|
152 |
+
#: includes/admin/wsl.admin.ui.php:670
|
153 |
+
msgid ""
|
154 |
+
"All the texts on this page are automatically extracted and generated on the "
|
155 |
+
"form beside. If the translation tool has scapped something you may consider "
|
156 |
+
"as irrelevant, please leave that particular field empty"
|
157 |
+
msgstr ""
|
158 |
+
|
159 |
+
#: includes/admin/wsl.admin.ui.php:672
|
160 |
+
msgid ""
|
161 |
+
"Your contributions will be sent to the WordPress Social Login website for "
|
162 |
+
"inclusion in future versions"
|
163 |
+
msgstr ""
|
164 |
+
|
165 |
+
#: includes/admin/wsl.admin.ui.php:674
|
166 |
+
msgid "Thanks!"
|
167 |
+
msgstr ""
|
168 |
+
|
169 |
+
#: includes/admin/wsl.admin.ui.php:682
|
170 |
+
msgid "Your Name"
|
171 |
+
msgstr ""
|
172 |
+
|
173 |
+
#: includes/admin/wsl.admin.ui.php:682 includes/admin/wsl.admin.ui.php:688
|
174 |
+
msgid "optional"
|
175 |
+
msgstr ""
|
176 |
+
|
177 |
+
#: includes/admin/wsl.admin.ui.php:688
|
178 |
+
msgid "Comment"
|
179 |
+
msgstr ""
|
180 |
+
|
181 |
+
#: includes/admin/wsl.admin.ui.php:694
|
182 |
+
msgid "Target Language"
|
183 |
+
msgstr ""
|
184 |
+
|
185 |
+
#: includes/admin/wsl.admin.ui.php:703
|
186 |
+
msgid "Submit changes"
|
187 |
+
msgstr ""
|
188 |
+
|
189 |
+
#: includes/admin/wsl.admin.ui.php:769
|
190 |
+
msgid "Help us translate this page into your language"
|
191 |
+
msgstr "ساعدنا على ترجمة هذه الصفحة"
|
192 |
+
|
193 |
+
#: includes/admin/components/advanced/index.php:47
|
194 |
+
#: includes/admin/components/login-widget/wsl.components.loginwidget.setup.php:62
|
195 |
+
msgid "Advanced Settings"
|
196 |
+
msgstr ""
|
197 |
+
|
198 |
+
#: includes/admin/components/advanced/index.php:52
|
199 |
+
msgid ""
|
200 |
+
"<b>Please</b> for the love of <b>God</b>, stay out of Advanced.. unless you "
|
201 |
+
"are Advanced and you know what you are doing"
|
202 |
+
msgstr ""
|
203 |
+
|
204 |
+
#: includes/admin/components/advanced/index.php:61
|
205 |
+
msgid "WSL Base URL"
|
206 |
+
msgstr ""
|
207 |
+
|
208 |
+
#: includes/admin/components/advanced/index.php:68
|
209 |
+
msgid "WSL Base PATH"
|
210 |
+
msgstr ""
|
211 |
+
|
212 |
+
#: includes/admin/components/advanced/index.php:75
|
213 |
+
msgid "Hybridauth endpoint URL"
|
214 |
+
msgstr ""
|
215 |
+
|
216 |
+
#: includes/admin/components/advanced/index.php:82
|
217 |
+
msgid "WSL top bar menu"
|
218 |
+
msgstr ""
|
219 |
+
|
220 |
+
#: includes/admin/components/advanced/index.php:85
|
221 |
+
#: includes/admin/components/bouncer/wsl.components.bouncer.setup.php:38
|
222 |
+
#: includes/admin/components/bouncer/wsl.components.bouncer.setup.php:47
|
223 |
+
#: includes/admin/components/bouncer/wsl.components.bouncer.setup.php:72
|
224 |
+
#: includes/admin/components/bouncer/wsl.components.bouncer.setup.php:81
|
225 |
+
#: includes/admin/components/bouncer/wsl.components.bouncer.setup.php:174
|
226 |
+
#: includes/admin/components/bouncer/wsl.components.bouncer.setup.php:211
|
227 |
+
#: includes/admin/components/bouncer/wsl.components.bouncer.setup.php:249
|
228 |
+
msgid "Yes"
|
229 |
+
msgstr ""
|
230 |
+
|
231 |
+
#: includes/admin/components/advanced/index.php:86
|
232 |
+
#: includes/admin/components/bouncer/wsl.components.bouncer.setup.php:39
|
233 |
+
#: includes/admin/components/bouncer/wsl.components.bouncer.setup.php:48
|
234 |
+
#: includes/admin/components/bouncer/wsl.components.bouncer.setup.php:73
|
235 |
+
#: includes/admin/components/bouncer/wsl.components.bouncer.setup.php:82
|
236 |
+
#: includes/admin/components/bouncer/wsl.components.bouncer.setup.php:175
|
237 |
+
#: includes/admin/components/bouncer/wsl.components.bouncer.setup.php:212
|
238 |
+
#: includes/admin/components/bouncer/wsl.components.bouncer.setup.php:250
|
239 |
+
msgid "No"
|
240 |
+
msgstr ""
|
241 |
+
|
242 |
+
#: includes/admin/components/advanced/index.php:98
|
243 |
+
#: includes/admin/components/bouncer/wsl.components.bouncer.setup.php:275
|
244 |
+
#: includes/admin/components/contacts/index.php:98
|
245 |
+
#: includes/admin/components/diagnostics/index.php:64
|
246 |
+
#: includes/admin/components/login-widget/wsl.components.loginwidget.setup.php:144
|
247 |
+
#: includes/admin/components/networks/wsl.components.networks.setup.php:271
|
248 |
+
#: includes/admin/components/networks/wsl.components.networks.whyhello.php:40
|
249 |
+
msgid "Save Settings"
|
250 |
+
msgstr ""
|
251 |
+
|
252 |
+
#: includes/admin/components/bouncer/wsl.components.bouncer.setup.php:27
|
253 |
+
msgid "WSL Widget"
|
254 |
+
msgstr ""
|
255 |
+
|
256 |
+
#: includes/admin/components/bouncer/wsl.components.bouncer.setup.php:31
|
257 |
+
msgid ""
|
258 |
+
"Here you can tell Bouncer if you are accepting new users registration and "
|
259 |
+
"authentication into your website or not any more. Note that Bouncer only "
|
260 |
+
"works for WSL and will not interfere with users authenticating through the "
|
261 |
+
"regulars wordpress Login and Register pages with their usernames and "
|
262 |
+
"passwords (to to achieve that kind of restrictions, you may need to use "
|
263 |
+
"another plugin(s) in combination with WSL)."
|
264 |
+
msgstr ""
|
265 |
+
|
266 |
+
#: includes/admin/components/bouncer/wsl.components.bouncer.setup.php:35
|
267 |
+
msgid "Accept new registration"
|
268 |
+
msgstr ""
|
269 |
+
|
270 |
+
#: includes/admin/components/bouncer/wsl.components.bouncer.setup.php:44
|
271 |
+
msgid "Allow authentication"
|
272 |
+
msgstr ""
|
273 |
+
|
274 |
+
#: includes/admin/components/bouncer/wsl.components.bouncer.setup.php:58
|
275 |
+
#: includes/admin/components/bouncer/wsl.components.bouncer.sidebar.php:45
|
276 |
+
msgid "Profile Completion"
|
277 |
+
msgstr ""
|
278 |
+
|
279 |
+
#: includes/admin/components/bouncer/wsl.components.bouncer.setup.php:62
|
280 |
+
msgid ""
|
281 |
+
"Select required fields. If a social network doesn't return them, Bouncer "
|
282 |
+
"will then ask your visitors to fill additional form to provide them when "
|
283 |
+
"registering."
|
284 |
+
msgstr ""
|
285 |
+
|
286 |
+
#: includes/admin/components/bouncer/wsl.components.bouncer.setup.php:65
|
287 |
+
msgid ""
|
288 |
+
"You may activate <b>Profile Completion</b> for both <b>E-mail</b> and "
|
289 |
+
"<b>Username</b>, but keep in mind, the idea behind <b>social login</b> is to "
|
290 |
+
"avoid forms and remove all the hassle of registration"
|
291 |
+
msgstr ""
|
292 |
+
|
293 |
+
#: includes/admin/components/bouncer/wsl.components.bouncer.setup.php:69
|
294 |
+
msgid "Require E-mail"
|
295 |
+
msgstr ""
|
296 |
+
|
297 |
+
#: includes/admin/components/bouncer/wsl.components.bouncer.setup.php:78
|
298 |
+
msgid "Allow Username change"
|
299 |
+
msgstr ""
|
300 |
+
|
301 |
+
#: includes/admin/components/bouncer/wsl.components.bouncer.setup.php:92
|
302 |
+
#: includes/admin/components/bouncer/wsl.components.bouncer.setup.php:111
|
303 |
+
msgid "User Moderation"
|
304 |
+
msgstr ""
|
305 |
+
|
306 |
+
#: includes/admin/components/bouncer/wsl.components.bouncer.setup.php:96
|
307 |
+
msgid ""
|
308 |
+
"<b>User Moderation</b> will define how <b>Bouncer</b> should behave with new "
|
309 |
+
"regsitred users:"
|
310 |
+
msgstr ""
|
311 |
+
|
312 |
+
#: includes/admin/components/bouncer/wsl.components.bouncer.setup.php:99
|
313 |
+
msgid "<b>None</b>: No moderation required."
|
314 |
+
msgstr ""
|
315 |
+
|
316 |
+
#: includes/admin/components/bouncer/wsl.components.bouncer.setup.php:100
|
317 |
+
msgid ""
|
318 |
+
"<b>E-mail Confirmation</b>: New users will need to be confirm their e-mail "
|
319 |
+
"address before they may log in"
|
320 |
+
msgstr ""
|
321 |
+
|
322 |
+
#: includes/admin/components/bouncer/wsl.components.bouncer.setup.php:101
|
323 |
+
msgid ""
|
324 |
+
"<b>Admin Approval</b>: New users will need to be approved by an "
|
325 |
+
"administrator before they may log in"
|
326 |
+
msgstr ""
|
327 |
+
|
328 |
+
#: includes/admin/components/bouncer/wsl.components.bouncer.setup.php:104
|
329 |
+
msgid ""
|
330 |
+
"Both <b>Admin Approval</b> and <b>E-mail Confirmation</b> requires <a href="
|
331 |
+
"\"http://wordpress.org/extend/plugins/theme-my-login/\" target=\"_blank"
|
332 |
+
"\">Theme My Login</a> plugin to be installed. As there is no point for "
|
333 |
+
"<b>WordPress Social Login</b> to reinvent the wheel"
|
334 |
+
msgstr ""
|
335 |
+
|
336 |
+
#: includes/admin/components/bouncer/wsl.components.bouncer.setup.php:107
|
337 |
+
msgid ""
|
338 |
+
"<b>User Moderation</b> was purposely made compatible with the <a href="
|
339 |
+
"\"http://wordpress.org/extend/plugins/theme-my-login/\" target=\"_blank"
|
340 |
+
"\">Theme My Login</a> for a number reasons: That plugin is good at what he "
|
341 |
+
"does, a hell of a lot of people are using it and many have asked for it"
|
342 |
+
msgstr ""
|
343 |
+
|
344 |
+
#: includes/admin/components/bouncer/wsl.components.bouncer.setup.php:114
|
345 |
+
msgid "None"
|
346 |
+
msgstr ""
|
347 |
+
|
348 |
+
#: includes/admin/components/bouncer/wsl.components.bouncer.setup.php:115
|
349 |
+
msgid "E-mail Confirmation — Yield to Theme My Login plugin"
|
350 |
+
msgstr ""
|
351 |
+
|
352 |
+
#: includes/admin/components/bouncer/wsl.components.bouncer.setup.php:116
|
353 |
+
msgid "Admin Approval — Yield to Theme My Login plugin"
|
354 |
+
msgstr ""
|
355 |
+
|
356 |
+
#: includes/admin/components/bouncer/wsl.components.bouncer.setup.php:126
|
357 |
+
msgid "Membership level"
|
358 |
+
msgstr ""
|
359 |
+
|
360 |
+
#: includes/admin/components/bouncer/wsl.components.bouncer.setup.php:130
|
361 |
+
msgid ""
|
362 |
+
"Here you can define the default role for new users authenticating through "
|
363 |
+
"WSL. The <code>Administrator</code> and <code>Editor</code> roles are not "
|
364 |
+
"available for safety reasons"
|
365 |
+
msgstr ""
|
366 |
+
|
367 |
+
#: includes/admin/components/bouncer/wsl.components.bouncer.setup.php:133
|
368 |
+
msgid ""
|
369 |
+
"For more information about wordpress users roles and capabilities refer to "
|
370 |
+
"<a href=\"http://codex.wordpress.org/Roles_and_Capabilities#Capability_vs."
|
371 |
+
"_Role_Table\" target=\"_blank\">http://codex.wordpress.org/"
|
372 |
+
"Roles_and_Capabilities</a>"
|
373 |
+
msgstr ""
|
374 |
+
|
375 |
+
#: includes/admin/components/bouncer/wsl.components.bouncer.setup.php:136
|
376 |
+
msgid ""
|
377 |
+
"If <b>User Moderation</b> is set to <code>Admin Approval</code> then "
|
378 |
+
"<b>Membership level</b> will be ignored"
|
379 |
+
msgstr ""
|
380 |
+
|
381 |
+
#: includes/admin/components/bouncer/wsl.components.bouncer.setup.php:140
|
382 |
+
msgid "New User Default Role"
|
383 |
+
msgstr ""
|
384 |
+
|
385 |
+
#: includes/admin/components/bouncer/wsl.components.bouncer.setup.php:143
|
386 |
+
msgid "Safe"
|
387 |
+
msgstr ""
|
388 |
+
|
389 |
+
#: includes/admin/components/bouncer/wsl.components.bouncer.setup.php:144
|
390 |
+
msgid "— Wordpress User Default Role —"
|
391 |
+
msgstr ""
|
392 |
+
|
393 |
+
#: includes/admin/components/bouncer/wsl.components.bouncer.setup.php:145
|
394 |
+
msgid "— No role for this site —"
|
395 |
+
msgstr ""
|
396 |
+
|
397 |
+
#: includes/admin/components/bouncer/wsl.components.bouncer.setup.php:146
|
398 |
+
msgid "Subscriber"
|
399 |
+
msgstr ""
|
400 |
+
|
401 |
+
#: includes/admin/components/bouncer/wsl.components.bouncer.setup.php:149
|
402 |
+
msgid "Be careful with these"
|
403 |
+
msgstr ""
|
404 |
+
|
405 |
+
#: includes/admin/components/bouncer/wsl.components.bouncer.setup.php:150
|
406 |
+
msgid "Author"
|
407 |
+
msgstr ""
|
408 |
+
|
409 |
+
#: includes/admin/components/bouncer/wsl.components.bouncer.setup.php:151
|
410 |
+
msgid "Contributor"
|
411 |
+
msgstr ""
|
412 |
+
|
413 |
+
#: includes/admin/components/bouncer/wsl.components.bouncer.setup.php:162
|
414 |
+
msgid "Filters by emails domains name"
|
415 |
+
msgstr ""
|
416 |
+
|
417 |
+
#: includes/admin/components/bouncer/wsl.components.bouncer.setup.php:166
|
418 |
+
msgid "Restrict registration to a limited number of domains name."
|
419 |
+
msgstr ""
|
420 |
+
|
421 |
+
#: includes/admin/components/bouncer/wsl.components.bouncer.setup.php:167
|
422 |
+
msgid ""
|
423 |
+
"Insert one email address per line and try to keep this list short. On "
|
424 |
+
"<code>Bounce text</code> insert the text you want to display for rejected "
|
425 |
+
"users. ex: <code>gmail.com</code>, without '@'."
|
426 |
+
msgstr ""
|
427 |
+
|
428 |
+
#: includes/admin/components/bouncer/wsl.components.bouncer.setup.php:171
|
429 |
+
#: includes/admin/components/bouncer/wsl.components.bouncer.setup.php:208
|
430 |
+
#: includes/admin/components/bouncer/wsl.components.bouncer.setup.php:246
|
431 |
+
#: includes/admin/components/contacts/index.php:51
|
432 |
+
#: includes/admin/components/contacts/index.php:58
|
433 |
+
#: includes/admin/components/contacts/index.php:65
|
434 |
+
#: includes/admin/components/contacts/index.php:72
|
435 |
+
#: includes/admin/components/contacts/index.php:79
|
436 |
+
#: includes/admin/components/diagnostics/index.php:61
|
437 |
+
#: includes/admin/components/networks/wsl.components.networks.setup.php:109
|
438 |
+
msgid "Enabled"
|
439 |
+
msgstr ""
|
440 |
+
|
441 |
+
#: includes/admin/components/bouncer/wsl.components.bouncer.setup.php:180
|
442 |
+
msgid "Domains list"
|
443 |
+
msgstr ""
|
444 |
+
|
445 |
+
#: includes/admin/components/bouncer/wsl.components.bouncer.setup.php:186
|
446 |
+
#: includes/admin/components/bouncer/wsl.components.bouncer.setup.php:223
|
447 |
+
#: includes/admin/components/bouncer/wsl.components.bouncer.setup.php:261
|
448 |
+
msgid "Bounce text"
|
449 |
+
msgstr ""
|
450 |
+
|
451 |
+
#: includes/admin/components/bouncer/wsl.components.bouncer.setup.php:199
|
452 |
+
msgid "Filters by e-mails addresses"
|
453 |
+
msgstr ""
|
454 |
+
|
455 |
+
#: includes/admin/components/bouncer/wsl.components.bouncer.setup.php:203
|
456 |
+
msgid "Restrict registration to a limited number of emails addresses."
|
457 |
+
msgstr ""
|
458 |
+
|
459 |
+
#: includes/admin/components/bouncer/wsl.components.bouncer.setup.php:204
|
460 |
+
msgid ""
|
461 |
+
"Insert one email address per line and try to keep this list short. On "
|
462 |
+
"<code>Bounce text</code> insert the text you want to display for rejected "
|
463 |
+
"users. ex: <code>hybridauth@gmail.com</code>"
|
464 |
+
msgstr ""
|
465 |
+
|
466 |
+
#: includes/admin/components/bouncer/wsl.components.bouncer.setup.php:217
|
467 |
+
msgid "E-mails list"
|
468 |
+
msgstr ""
|
469 |
+
|
470 |
+
#: includes/admin/components/bouncer/wsl.components.bouncer.setup.php:236
|
471 |
+
msgid "Filters by profile urls"
|
472 |
+
msgstr ""
|
473 |
+
|
474 |
+
#: includes/admin/components/bouncer/wsl.components.bouncer.setup.php:240
|
475 |
+
msgid "Restrict registration to a limited number of profile urls."
|
476 |
+
msgstr ""
|
477 |
+
|
478 |
+
#: includes/admin/components/bouncer/wsl.components.bouncer.setup.php:241
|
479 |
+
msgid ""
|
480 |
+
"<b>Note</b>: If a social network provide the user email, then use 'Filters "
|
481 |
+
"by e-mails addresses' instead. Providers like Facebook provide multiples "
|
482 |
+
"profiles URLs per user and WSL won't be able to reconize them."
|
483 |
+
msgstr ""
|
484 |
+
|
485 |
+
#: includes/admin/components/bouncer/wsl.components.bouncer.setup.php:242
|
486 |
+
msgid ""
|
487 |
+
"Insert one email address per line and try to keep this list short. On "
|
488 |
+
"<code>Bounce text</code> insert the text you want to display for rejected "
|
489 |
+
"users. ex: <code>http://twitter.com/HybridAuth</code>, <code>https://plus."
|
490 |
+
"google.com/u/0/108839241301472312344</code>"
|
491 |
+
msgstr ""
|
492 |
+
|
493 |
+
#: includes/admin/components/bouncer/wsl.components.bouncer.setup.php:255
|
494 |
+
msgid "Profile urls"
|
495 |
+
msgstr ""
|
496 |
+
|
497 |
+
#: includes/admin/components/bouncer/wsl.components.bouncer.sidebar.php:26
|
498 |
+
#: includes/admin/components/login-widget/wsl.components.loginwidget.sidebar.php:26
|
499 |
+
msgid "What's This?"
|
500 |
+
msgstr ""
|
501 |
+
|
502 |
+
#: includes/admin/components/bouncer/wsl.components.bouncer.sidebar.php:30
|
503 |
+
msgid "Hey, meet our friend, the Bouncer"
|
504 |
+
msgstr ""
|
505 |
+
|
506 |
+
#: includes/admin/components/bouncer/wsl.components.bouncer.sidebar.php:33
|
507 |
+
msgid ""
|
508 |
+
"Ever been in trouble with one of <a href=\"http://www.flickr.com/search/?"
|
509 |
+
"q=bouncer+doorman&z=e\" target=\"_blank\">these guys</a>? Well, this module "
|
510 |
+
"have more or less the same role, and he will try his best to piss your users "
|
511 |
+
"off until they meet your requirements."
|
512 |
+
msgstr ""
|
513 |
+
|
514 |
+
#: includes/admin/components/bouncer/wsl.components.bouncer.sidebar.php:37
|
515 |
+
msgid ""
|
516 |
+
"This feature is most suited for small businesses and folks running a closed-"
|
517 |
+
"door blog between friends or coworkers."
|
518 |
+
msgstr ""
|
519 |
+
|
520 |
+
#: includes/admin/components/bouncer/wsl.components.bouncer.sidebar.php:40
|
521 |
+
msgid "Available settings"
|
522 |
+
msgstr ""
|
523 |
+
|
524 |
+
#: includes/admin/components/bouncer/wsl.components.bouncer.sidebar.php:43
|
525 |
+
msgid "Enable/Disable Registration"
|
526 |
+
msgstr ""
|
527 |
+
|
528 |
+
#: includes/admin/components/bouncer/wsl.components.bouncer.sidebar.php:44
|
529 |
+
msgid "Enable/Disable Authentication"
|
530 |
+
msgstr ""
|
531 |
+
|
532 |
+
#: includes/admin/components/bouncer/wsl.components.bouncer.sidebar.php:46
|
533 |
+
msgid "Users moderation"
|
534 |
+
msgstr ""
|
535 |
+
|
536 |
+
#: includes/admin/components/bouncer/wsl.components.bouncer.sidebar.php:47
|
537 |
+
msgid "Users roles"
|
538 |
+
msgstr ""
|
539 |
+
|
540 |
+
#: includes/admin/components/bouncer/wsl.components.bouncer.sidebar.php:48
|
541 |
+
msgid "Restrictions (by emails, domains, profiles urls)"
|
542 |
+
msgstr ""
|
543 |
+
|
544 |
+
#: includes/admin/components/bouncer/wsl.components.bouncer.sidebar.php:51
|
545 |
+
msgid "IMPORTANT!"
|
546 |
+
msgstr ""
|
547 |
+
|
548 |
+
#: includes/admin/components/bouncer/wsl.components.bouncer.sidebar.php:54
|
549 |
+
msgid ""
|
550 |
+
"All the settings on this page without exception are only valid for users "
|
551 |
+
"authenticating through <b>WordPress Social Login Widget"
|
552 |
+
msgstr ""
|
553 |
+
|
554 |
+
#: includes/admin/components/bouncer/wsl.components.bouncer.sidebar.php:57
|
555 |
+
msgid ""
|
556 |
+
"Users authenticating through the regulars Wordpress Login and Register pages "
|
557 |
+
"with their usernames and passwords WILL NOT be affected."
|
558 |
+
msgstr ""
|
559 |
+
|
560 |
+
#: includes/admin/components/components/wsl.components.help.gallery.php:30
|
561 |
+
msgid "Other Components available"
|
562 |
+
msgstr ""
|
563 |
+
|
564 |
+
#: includes/admin/components/components/wsl.components.help.gallery.php:58
|
565 |
+
msgid "WordPress Social Login for BuddyPress"
|
566 |
+
msgstr ""
|
567 |
+
|
568 |
+
#: includes/admin/components/components/wsl.components.help.gallery.php:60
|
569 |
+
msgid "Make WordPress Social Login compatible with BuddyPress"
|
570 |
+
msgstr ""
|
571 |
+
|
572 |
+
#: includes/admin/components/components/wsl.components.help.gallery.php:61
|
573 |
+
msgid "Widget integration, xProfiles mapping and more"
|
574 |
+
msgstr ""
|
575 |
+
|
576 |
+
#: includes/admin/components/components/wsl.components.help.gallery.php:63
|
577 |
+
msgid "Install Now"
|
578 |
+
msgstr ""
|
579 |
+
|
580 |
+
#: includes/admin/components/components/wsl.components.help.gallery.php:64
|
581 |
+
msgid "Visit plugin site"
|
582 |
+
msgstr ""
|
583 |
+
|
584 |
+
#: includes/admin/components/components/wsl.components.help.gallery.php:69
|
585 |
+
msgid "Build yours"
|
586 |
+
msgstr ""
|
587 |
+
|
588 |
+
#: includes/admin/components/components/wsl.components.help.gallery.php:71
|
589 |
+
msgid ""
|
590 |
+
"Looking to build your own custom <b>WordPress Social Login</b> extenstion or "
|
591 |
+
"component? Well, it's pretty easy. Just RTFM :)"
|
592 |
+
msgstr ""
|
593 |
+
|
594 |
+
#: includes/admin/components/components/wsl.components.help.gallery.php:74
|
595 |
+
msgid "WSL Developer API"
|
596 |
+
msgstr ""
|
597 |
+
|
598 |
+
#: includes/admin/components/components/wsl.components.help.gallery.php:75
|
599 |
+
msgid "WSL on Github"
|
600 |
+
msgstr ""
|
601 |
+
|
602 |
+
#: includes/admin/components/components/wsl.components.help.setup.php:29
|
603 |
+
#: includes/admin/components/components/wsl.components.help.setup.php:37
|
604 |
+
msgid "Component"
|
605 |
+
msgstr ""
|
606 |
+
|
607 |
+
#: includes/admin/components/components/wsl.components.help.setup.php:30
|
608 |
+
#: includes/admin/components/components/wsl.components.help.setup.php:38
|
609 |
+
msgid "Description"
|
610 |
+
msgstr ""
|
611 |
+
|
612 |
+
#: includes/admin/components/components/wsl.components.help.setup.php:67
|
613 |
+
msgid "View"
|
614 |
+
msgstr ""
|
615 |
+
|
616 |
+
#: includes/admin/components/components/wsl.components.help.setup.php:72
|
617 |
+
msgid "Disable"
|
618 |
+
msgstr ""
|
619 |
+
|
620 |
+
#: includes/admin/components/components/wsl.components.help.setup.php:74
|
621 |
+
msgid "Enable"
|
622 |
+
msgstr ""
|
623 |
+
|
624 |
+
#: includes/admin/components/contacts/index.php:39
|
625 |
+
msgid "Settings"
|
626 |
+
msgstr ""
|
627 |
+
|
628 |
+
#: includes/admin/components/contacts/index.php:43
|
629 |
+
msgid ""
|
630 |
+
"<b>WordPress Social Login</b> is now introducing <b>Contacts Import</b> as a "
|
631 |
+
"new feature. When enabled, users authenticating through WordPress Social "
|
632 |
+
"Login will be asked for the authorisation to import their contact list. Note "
|
633 |
+
"that some social networks do not provide certains of their users information "
|
634 |
+
"like contacts emails, photos and or profile urls"
|
635 |
+
msgstr ""
|
636 |
+
|
637 |
+
#: includes/admin/components/contacts/index.php:45
|
638 |
+
msgid "Enable contacts import for"
|
639 |
+
msgstr ""
|
640 |
+
|
641 |
+
#: includes/admin/components/contacts/index.php:52
|
642 |
+
#: includes/admin/components/contacts/index.php:59
|
643 |
+
#: includes/admin/components/contacts/index.php:66
|
644 |
+
#: includes/admin/components/contacts/index.php:73
|
645 |
+
#: includes/admin/components/contacts/index.php:80
|
646 |
+
#: includes/admin/components/diagnostics/index.php:62
|
647 |
+
msgid "Disabled"
|
648 |
+
msgstr ""
|
649 |
+
|
650 |
+
#: includes/admin/components/contacts/index.php:86
|
651 |
+
msgid "Notes"
|
652 |
+
msgstr ""
|
653 |
+
|
654 |
+
#: includes/admin/components/contacts/index.php:88
|
655 |
+
msgid ""
|
656 |
+
"To enable contacts import from these social network, you need first to "
|
657 |
+
"enabled them on the <a href=\"options-general.php?page=wordpress-social-"
|
658 |
+
"login&wslp=networks\"><b>Networks</b></a> tab and register the required "
|
659 |
+
"application"
|
660 |
+
msgstr ""
|
661 |
+
|
662 |
+
#: includes/admin/components/contacts/index.php:89
|
663 |
+
msgid ""
|
664 |
+
"<b>WSL</b> will try to import as much information about a user contacts as "
|
665 |
+
"he was able to pull from the social networks APIs."
|
666 |
+
msgstr ""
|
667 |
+
|
668 |
+
#: includes/admin/components/contacts/index.php:90
|
669 |
+
msgid ""
|
670 |
+
"All contacts data are sotred into your database on the table: "
|
671 |
+
"<code>`wsluserscontacts`</code>"
|
672 |
+
msgstr ""
|
673 |
+
|
674 |
+
#: includes/admin/components/contacts/index.php:107
|
675 |
+
msgid "Users contacts list preview"
|
676 |
+
msgstr ""
|
677 |
+
|
678 |
+
#: includes/admin/components/contacts/index.php:114
|
679 |
+
#, php-format
|
680 |
+
msgid "%s contact's list"
|
681 |
+
msgstr ""
|
682 |
+
|
683 |
+
#: includes/admin/components/contacts/index.php:121
|
684 |
+
#: includes/admin/components/contacts/index.php:130
|
685 |
+
#: includes/widgets/wsl.auth.widget.php:299
|
686 |
+
msgid "Provider"
|
687 |
+
msgstr ""
|
688 |
+
|
689 |
+
#: includes/admin/components/contacts/index.php:122
|
690 |
+
#: includes/admin/components/contacts/index.php:131
|
691 |
+
msgid "User"
|
692 |
+
msgstr ""
|
693 |
+
|
694 |
+
#: includes/admin/components/contacts/index.php:123
|
695 |
+
#: includes/admin/components/contacts/index.php:132
|
696 |
+
msgid "Contact Name"
|
697 |
+
msgstr ""
|
698 |
+
|
699 |
+
#: includes/admin/components/contacts/index.php:124
|
700 |
+
#: includes/admin/components/contacts/index.php:133
|
701 |
+
msgid "Contact Email"
|
702 |
+
msgstr ""
|
703 |
+
|
704 |
+
#: includes/admin/components/contacts/index.php:125
|
705 |
+
#: includes/admin/components/contacts/index.php:134
|
706 |
+
msgid "Contact Profile Url"
|
707 |
+
msgstr ""
|
708 |
+
|
709 |
+
#: includes/admin/components/contacts/index.php:150
|
710 |
+
msgid "No contacts found"
|
711 |
+
msgstr ""
|
712 |
+
|
713 |
+
#: includes/admin/components/diagnostics/index.php:24
|
714 |
+
msgid "Requirements test"
|
715 |
+
msgstr ""
|
716 |
+
|
717 |
+
#: includes/admin/components/diagnostics/index.php:27
|
718 |
+
msgid ""
|
719 |
+
"In order for <b>WordPress Social Login</b> to work properly, your server "
|
720 |
+
"should meet certain requirements. These \"requirements\" <br />and \"services"
|
721 |
+
"\" are usually offered by default by most \"modern\" web hosting providers, "
|
722 |
+
"however some complications may <br />occur with <b>shared hosting</b> and, "
|
723 |
+
"or <b>custom wordpress installations</b>"
|
724 |
+
msgstr ""
|
725 |
+
|
726 |
+
#: includes/admin/components/diagnostics/index.php:30
|
727 |
+
msgid "The minimum server requirements are"
|
728 |
+
msgstr ""
|
729 |
+
|
730 |
+
#: includes/admin/components/diagnostics/index.php:33
|
731 |
+
msgid "PHP >= 5.2.0 installed"
|
732 |
+
msgstr ""
|
733 |
+
|
734 |
+
#: includes/admin/components/diagnostics/index.php:34
|
735 |
+
msgid "WSL Endpoint URLs reachable"
|
736 |
+
msgstr ""
|
737 |
+
|
738 |
+
#: includes/admin/components/diagnostics/index.php:35
|
739 |
+
msgid "PHP's default SESSION handling"
|
740 |
+
msgstr ""
|
741 |
+
|
742 |
+
#: includes/admin/components/diagnostics/index.php:36
|
743 |
+
msgid "PHP/CURL/SSL Extension enabled"
|
744 |
+
msgstr ""
|
745 |
+
|
746 |
+
#: includes/admin/components/diagnostics/index.php:37
|
747 |
+
msgid "PHP/JSON Extension enabled"
|
748 |
+
msgstr ""
|
749 |
+
|
750 |
+
#: includes/admin/components/diagnostics/index.php:38
|
751 |
+
msgid "PHP/REGISTER_GLOBALS Off"
|
752 |
+
msgstr ""
|
753 |
+
|
754 |
+
#: includes/admin/components/diagnostics/index.php:39
|
755 |
+
msgid "jQuery installed on WordPress backoffice"
|
756 |
+
msgstr ""
|
757 |
+
|
758 |
+
#: includes/admin/components/diagnostics/index.php:42
|
759 |
+
msgid ""
|
760 |
+
"You can run the <b>WordPress Social Login Requirements Test</b> by clicking "
|
761 |
+
"the button bellow"
|
762 |
+
msgstr ""
|
763 |
+
|
764 |
+
#: includes/admin/components/diagnostics/index.php:46
|
765 |
+
msgid "Run the plugin requirements test"
|
766 |
+
msgstr ""
|
767 |
+
|
768 |
+
#: includes/admin/components/diagnostics/index.php:47
|
769 |
+
msgid "Website Information"
|
770 |
+
msgstr ""
|
771 |
+
|
772 |
+
#: includes/admin/components/diagnostics/index.php:53
|
773 |
+
msgid "Development mode"
|
774 |
+
msgstr ""
|
775 |
+
|
776 |
+
#: includes/admin/components/diagnostics/index.php:56
|
777 |
+
msgid ""
|
778 |
+
"By enabling the development mode, this plugin will try generate and display "
|
779 |
+
"a technical reports when something goes wrong. <br />This report can help "
|
780 |
+
"your figure out the root of any issues you may runs into, or you can also "
|
781 |
+
"send it to the plugin developer. <br />Its recommend to set the Development "
|
782 |
+
"mode to <b style=\"color:red\">Disabled</b> on production."
|
783 |
+
msgstr ""
|
784 |
+
|
785 |
+
#: includes/admin/components/help/index.php:25
|
786 |
+
msgid "Troubleshooting"
|
787 |
+
msgstr ""
|
788 |
+
|
789 |
+
#: includes/admin/components/help/index.php:27
|
790 |
+
msgid "WSL Diagnostics"
|
791 |
+
msgstr ""
|
792 |
+
|
793 |
+
#: includes/admin/components/help/index.php:29
|
794 |
+
msgid "System information"
|
795 |
+
msgstr ""
|
796 |
+
|
797 |
+
#: includes/admin/components/help/index.php:32
|
798 |
+
msgid ""
|
799 |
+
"If you run into any issue, you can access the <b>WordPress Social Login "
|
800 |
+
"Diagnostics</b> to check the <b>Plugin Requirements</b> or to enable the "
|
801 |
+
"<b>Development mode</b>"
|
802 |
+
msgstr ""
|
803 |
+
|
804 |
+
#: includes/admin/components/help/index.php:35
|
805 |
+
msgid ""
|
806 |
+
"Remember to include your System information when posting support requests"
|
807 |
+
msgstr ""
|
808 |
+
|
809 |
+
#: includes/admin/components/help/index.php:39
|
810 |
+
msgid "Documentation"
|
811 |
+
msgstr ""
|
812 |
+
|
813 |
+
#: includes/admin/components/help/index.php:41
|
814 |
+
msgid ""
|
815 |
+
"The complete <b>User Guide</b> can be found at\n"
|
816 |
+
"\t\t<a href=\"http://hybridauth.sourceforge.net/wsl/index.html\" target="
|
817 |
+
"\"_blank\">hybridauth.sourceforge.net/wsl/index.html</a>"
|
818 |
+
msgstr ""
|
819 |
+
|
820 |
+
#: includes/admin/components/help/index.php:47
|
821 |
+
msgid "FAQs"
|
822 |
+
msgstr ""
|
823 |
+
|
824 |
+
#: includes/admin/components/help/index.php:49
|
825 |
+
msgid ""
|
826 |
+
"A list of <b>Frequently asked questions</b> can be found at\n"
|
827 |
+
"\t\t<a href=\"http://hybridauth.sourceforge.net/wsl/faq.html\" target="
|
828 |
+
"\"_blank\">hybridauth.sourceforge.net/wsl/faq.html</a>"
|
829 |
+
msgstr ""
|
830 |
+
|
831 |
+
#: includes/admin/components/help/index.php:55
|
832 |
+
msgid "Support"
|
833 |
+
msgstr ""
|
834 |
+
|
835 |
+
#: includes/admin/components/help/index.php:57
|
836 |
+
msgid ""
|
837 |
+
"To get help and support refer to <a href=\"http://hybridauth.sourceforge.net/"
|
838 |
+
"wsl/support.html\" target=\"_blank\">http://hybridauth.sourceforge.net/wsl/"
|
839 |
+
"support.html</a>"
|
840 |
+
msgstr ""
|
841 |
+
|
842 |
+
#: includes/admin/components/help/index.php:62
|
843 |
+
msgid "Credits"
|
844 |
+
msgstr ""
|
845 |
+
|
846 |
+
#: includes/admin/components/help/index.php:64
|
847 |
+
msgid ""
|
848 |
+
"WordPress Social Login was created by <a href=\"http://profiles.wordpress."
|
849 |
+
"org/miled/\" target=\"_blank\">Mohamed Mrassi</a> (a.k.a Miled) and <a href="
|
850 |
+
"\"https://github.com/hybridauth/WordPress-Social-Login/graphs/contributors\" "
|
851 |
+
"target=\"_blank\">contributors</a>"
|
852 |
+
msgstr ""
|
853 |
+
|
854 |
+
#: includes/admin/components/help/index.php:65
|
855 |
+
msgid ""
|
856 |
+
"Many other people have also contributed with <br />constructive discussions, "
|
857 |
+
"support and by submitting patches"
|
858 |
+
msgstr ""
|
859 |
+
|
860 |
+
#: includes/admin/components/help/index.php:70
|
861 |
+
msgid "License"
|
862 |
+
msgstr ""
|
863 |
+
|
864 |
+
#: includes/admin/components/help/index.php:72
|
865 |
+
msgid ""
|
866 |
+
"<b>WordPress Social Login</b> is an open source software licenced under The "
|
867 |
+
"MIT License (MIT)"
|
868 |
+
msgstr ""
|
869 |
+
|
870 |
+
#: includes/admin/components/login-widget/wsl.components.loginwidget.setup.php:27
|
871 |
+
msgid "Basic Settings"
|
872 |
+
msgstr ""
|
873 |
+
|
874 |
+
#: includes/admin/components/login-widget/wsl.components.loginwidget.setup.php:32
|
875 |
+
msgid "Connect with caption"
|
876 |
+
msgstr ""
|
877 |
+
|
878 |
+
#: includes/admin/components/login-widget/wsl.components.loginwidget.setup.php:38
|
879 |
+
msgid "Social icon set"
|
880 |
+
msgstr ""
|
881 |
+
|
882 |
+
#: includes/admin/components/login-widget/wsl.components.loginwidget.setup.php:41
|
883 |
+
msgid "WPZOOM social networking icon set"
|
884 |
+
msgstr ""
|
885 |
+
|
886 |
+
#: includes/admin/components/login-widget/wsl.components.loginwidget.setup.php:42
|
887 |
+
msgid "Icondock vector social media icons"
|
888 |
+
msgstr ""
|
889 |
+
|
890 |
+
#: includes/admin/components/login-widget/wsl.components.loginwidget.setup.php:47
|
891 |
+
msgid "Users avatars"
|
892 |
+
msgstr ""
|
893 |
+
|
894 |
+
#: includes/admin/components/login-widget/wsl.components.loginwidget.setup.php:50
|
895 |
+
msgid "Display the default users avatars"
|
896 |
+
msgstr ""
|
897 |
+
|
898 |
+
#: includes/admin/components/login-widget/wsl.components.loginwidget.setup.php:51
|
899 |
+
msgid "Display users avatars from social networks when available"
|
900 |
+
msgstr ""
|
901 |
+
|
902 |
+
#: includes/admin/components/login-widget/wsl.components.loginwidget.setup.php:67
|
903 |
+
msgid "Redirect URL"
|
904 |
+
msgstr ""
|
905 |
+
|
906 |
+
#: includes/admin/components/login-widget/wsl.components.loginwidget.setup.php:73
|
907 |
+
msgid "Authentication flow"
|
908 |
+
msgstr ""
|
909 |
+
|
910 |
+
#: includes/admin/components/login-widget/wsl.components.loginwidget.setup.php:76
|
911 |
+
msgid "Using popup window"
|
912 |
+
msgstr ""
|
913 |
+
|
914 |
+
#: includes/admin/components/login-widget/wsl.components.loginwidget.setup.php:77
|
915 |
+
msgid "No popup window"
|
916 |
+
msgstr ""
|
917 |
+
|
918 |
+
#: includes/admin/components/login-widget/wsl.components.loginwidget.setup.php:82
|
919 |
+
msgid "Widget display"
|
920 |
+
msgstr ""
|
921 |
+
|
922 |
+
#: includes/admin/components/login-widget/wsl.components.loginwidget.setup.php:85
|
923 |
+
msgid "Display the widget in the comments area, login and register forms"
|
924 |
+
msgstr ""
|
925 |
+
|
926 |
+
#: includes/admin/components/login-widget/wsl.components.loginwidget.setup.php:86
|
927 |
+
msgid "Display the widget ONLY in the comments area"
|
928 |
+
msgstr ""
|
929 |
+
|
930 |
+
#: includes/admin/components/login-widget/wsl.components.loginwidget.setup.php:87
|
931 |
+
msgid "Display the widget ONLY in the login form"
|
932 |
+
msgstr ""
|
933 |
+
|
934 |
+
#: includes/admin/components/login-widget/wsl.components.loginwidget.setup.php:92
|
935 |
+
msgid "Notification"
|
936 |
+
msgstr ""
|
937 |
+
|
938 |
+
#: includes/admin/components/login-widget/wsl.components.loginwidget.setup.php:95
|
939 |
+
msgid "No notification"
|
940 |
+
msgstr ""
|
941 |
+
|
942 |
+
#: includes/admin/components/login-widget/wsl.components.loginwidget.setup.php:96
|
943 |
+
msgid "Notify ONLY the blog admin of a new user"
|
944 |
+
msgstr ""
|
945 |
+
|
946 |
+
#: includes/admin/components/login-widget/wsl.components.loginwidget.setup.php:107
|
947 |
+
msgid "Custom CSS"
|
948 |
+
msgstr ""
|
949 |
+
|
950 |
+
#: includes/admin/components/login-widget/wsl.components.loginwidget.setup.php:112
|
951 |
+
msgid "Widget CSS"
|
952 |
+
msgstr ""
|
953 |
+
|
954 |
+
#: includes/admin/components/login-widget/wsl.components.loginwidget.setup.php:114
|
955 |
+
msgid ""
|
956 |
+
"To customize the default widget styles you can either: edit the css file "
|
957 |
+
"<strong>/wordpress-social-login/assets/css/style.css</strong>, or change it "
|
958 |
+
"from this text area"
|
959 |
+
msgstr ""
|
960 |
+
|
961 |
+
#: includes/admin/components/login-widget/wsl.components.loginwidget.setup.php:118
|
962 |
+
msgid "The basic widget markup is the following"
|
963 |
+
msgstr ""
|
964 |
+
|
965 |
+
#: includes/admin/components/login-widget/wsl.components.loginwidget.sidebar.php:30
|
966 |
+
msgid "Widget Customization"
|
967 |
+
msgstr ""
|
968 |
+
|
969 |
+
#: includes/admin/components/login-widget/wsl.components.loginwidget.sidebar.php:33
|
970 |
+
msgid ""
|
971 |
+
"On this section you can fully customize <b>WordPress Social Login Widget</b> "
|
972 |
+
"and define the way you want it to look and behave"
|
973 |
+
msgstr ""
|
974 |
+
|
975 |
+
#: includes/admin/components/login-widget/wsl.components.loginwidget.sidebar.php:37
|
976 |
+
msgid ""
|
977 |
+
"<b>WordPress Social Login Widget</b> will be generated into the comments, "
|
978 |
+
"login and register forms enabling your website vistors and customers to "
|
979 |
+
"login via social networks"
|
980 |
+
msgstr ""
|
981 |
+
|
982 |
+
#: includes/admin/components/login-widget/wsl.components.loginwidget.sidebar.php:41
|
983 |
+
msgid ""
|
984 |
+
"If this widget does not show up on your custom theme or you want to add it "
|
985 |
+
"somewhere else then refer to the next section"
|
986 |
+
msgstr ""
|
987 |
+
|
988 |
+
#: includes/admin/components/login-widget/wsl.components.loginwidget.sidebar.php:44
|
989 |
+
msgid "Custom integration"
|
990 |
+
msgstr ""
|
991 |
+
|
992 |
+
#: includes/admin/components/login-widget/wsl.components.loginwidget.sidebar.php:47
|
993 |
+
msgid ""
|
994 |
+
"If you want to add the social login widget to another location in your "
|
995 |
+
"theme, you can insert the following code in that location"
|
996 |
+
msgstr ""
|
997 |
+
|
998 |
+
#: includes/admin/components/login-widget/wsl.components.loginwidget.sidebar.php:49
|
999 |
+
msgid "Or, for posts and pages"
|
1000 |
+
msgstr ""
|
1001 |
+
|
1002 |
+
#: includes/admin/components/login-widget/wsl.components.loginwidget.sidebar.php:54
|
1003 |
+
msgid ""
|
1004 |
+
"<b>[wordpress_social_login]</b> shortcode can be used in combination with <a "
|
1005 |
+
"href=\"http://wordpress.org/extend/plugins/html-javascript-adder/\" target="
|
1006 |
+
"\"_blank\">HTML Javascript Adder</a> plugin to be add WSL Widget to your "
|
1007 |
+
"website sidebar"
|
1008 |
+
msgstr ""
|
1009 |
+
|
1010 |
+
#: includes/admin/components/login-widget/wsl.components.loginwidget.sidebar.php:58
|
1011 |
+
msgid ""
|
1012 |
+
"Also, if you are a developer or designer then you can customize it to your "
|
1013 |
+
"heart's content. For more inofmation refer to <b><a href=\"http://hybridauth."
|
1014 |
+
"sourceforge.net/wsl/customize.html\" target=\"_blank\">User Guide</a></b>"
|
1015 |
+
msgstr ""
|
1016 |
+
|
1017 |
+
#: includes/admin/components/login-widget/wsl.components.loginwidget.sidebar.php:61
|
1018 |
+
msgid "Widget preview"
|
1019 |
+
msgstr ""
|
1020 |
+
|
1021 |
+
#: includes/admin/components/login-widget/wsl.components.loginwidget.sidebar.php:64
|
1022 |
+
msgid "This is a preview of what should be on the comments area"
|
1023 |
+
msgstr ""
|
1024 |
+
|
1025 |
+
#: includes/admin/components/login-widget/wsl.components.loginwidget.sidebar.php:65
|
1026 |
+
msgid "Do not test it here"
|
1027 |
+
msgstr ""
|
1028 |
+
|
1029 |
+
#: includes/admin/components/networks/wsl.components.networks.addmore.php:24
|
1030 |
+
msgid ""
|
1031 |
+
"And you could add even more of them, <b>Just Click</b> and we will guide you "
|
1032 |
+
"through"
|
1033 |
+
msgstr ""
|
1034 |
+
|
1035 |
+
#: includes/admin/components/networks/wsl.components.networks.addmore.php:48
|
1036 |
+
msgid "Well! none left."
|
1037 |
+
msgstr ""
|
1038 |
+
|
1039 |
+
#: includes/admin/components/networks/wsl.components.networks.basicinsights.php:36
|
1040 |
+
msgid "Insights"
|
1041 |
+
msgstr ""
|
1042 |
+
|
1043 |
+
#: includes/admin/components/networks/wsl.components.networks.basicinsights.php:40
|
1044 |
+
#: includes/admin/components/networks/wsl.components.networks.basicinsights.php:49
|
1045 |
+
msgid "Conversions"
|
1046 |
+
msgstr ""
|
1047 |
+
|
1048 |
+
#: includes/admin/components/networks/wsl.components.networks.basicinsights.php:43
|
1049 |
+
msgid "WP users"
|
1050 |
+
msgstr ""
|
1051 |
+
|
1052 |
+
#: includes/admin/components/networks/wsl.components.networks.basicinsights.php:46
|
1053 |
+
#: includes/admin/components/networks/wsl.components.networks.basicinsights.php:77
|
1054 |
+
msgid "WSL users"
|
1055 |
+
msgstr ""
|
1056 |
+
|
1057 |
+
#: includes/admin/components/networks/wsl.components.networks.basicinsights.php:59
|
1058 |
+
msgid "By provider"
|
1059 |
+
msgstr ""
|
1060 |
+
|
1061 |
+
#: includes/admin/components/networks/wsl.components.networks.basicinsights.php:85
|
1062 |
+
msgid "By gender"
|
1063 |
+
msgstr ""
|
1064 |
+
|
1065 |
+
#: includes/admin/components/networks/wsl.components.networks.basicinsights.php:108
|
1066 |
+
msgid "By age"
|
1067 |
+
msgstr ""
|
1068 |
+
|
1069 |
+
#: includes/admin/components/networks/wsl.components.networks.basicinsights.php:139
|
1070 |
+
msgid "yrs in average"
|
1071 |
+
msgstr ""
|
1072 |
+
|
1073 |
+
#: includes/admin/components/networks/wsl.components.networks.setup.php:126
|
1074 |
+
msgid "Application ID"
|
1075 |
+
msgstr ""
|
1076 |
+
|
1077 |
+
#: includes/admin/components/networks/wsl.components.networks.setup.php:128
|
1078 |
+
#: includes/admin/components/networks/wsl.components.networks.setup.php:134
|
1079 |
+
#: includes/admin/components/networks/wsl.components.networks.setup.php:140
|
1080 |
+
msgid "Where do I get this info?"
|
1081 |
+
msgstr ""
|
1082 |
+
|
1083 |
+
#: includes/admin/components/networks/wsl.components.networks.setup.php:132
|
1084 |
+
msgid "Application Key"
|
1085 |
+
msgstr ""
|
1086 |
+
|
1087 |
+
#: includes/admin/components/networks/wsl.components.networks.setup.php:138
|
1088 |
+
msgid "Application Secret"
|
1089 |
+
msgstr ""
|
1090 |
+
|
1091 |
+
#: includes/admin/components/networks/wsl.components.networks.setup.php:149
|
1092 |
+
msgid "Note"
|
1093 |
+
msgstr ""
|
1094 |
+
|
1095 |
+
#: includes/admin/components/networks/wsl.components.networks.setup.php:151
|
1096 |
+
#, php-format
|
1097 |
+
msgid ""
|
1098 |
+
"<b>%s</b> do not provide their user's email address and by default a random "
|
1099 |
+
"email will then be generated for them instead"
|
1100 |
+
msgstr ""
|
1101 |
+
|
1102 |
+
#: includes/admin/components/networks/wsl.components.networks.setup.php:153
|
1103 |
+
msgid ""
|
1104 |
+
"To change this behaviour and to force new registered users to provide their "
|
1105 |
+
"emails before they get in, goto <b><a href=\"options-general.php?"
|
1106 |
+
"page=wordpress-social-login&wslp=bouncer\">Bouncer</a></b> and enable "
|
1107 |
+
"<b>Profile Completion</b>"
|
1108 |
+
msgstr ""
|
1109 |
+
|
1110 |
+
#: includes/admin/components/networks/wsl.components.networks.setup.php:163
|
1111 |
+
msgid ""
|
1112 |
+
"<span style=\"color:#CB4B16;\">Application</span> id and secret (also "
|
1113 |
+
"sometimes referred as <span style=\"color:#CB4B16;\">Customer</span> key and "
|
1114 |
+
"secret or <span style=\"color:#CB4B16;\">Client</span> id and secret) are "
|
1115 |
+
"what we call an application credentials"
|
1116 |
+
msgstr ""
|
1117 |
+
|
1118 |
+
#: includes/admin/components/networks/wsl.components.networks.setup.php:165
|
1119 |
+
#, php-format
|
1120 |
+
msgid ""
|
1121 |
+
"This application will link your website <code>%s</code> to <code>%s API</"
|
1122 |
+
"code> and these credentials are needed in order for <b>%s</b> users to "
|
1123 |
+
"access your website"
|
1124 |
+
msgstr ""
|
1125 |
+
|
1126 |
+
#: includes/admin/components/networks/wsl.components.networks.setup.php:168
|
1127 |
+
msgid ""
|
1128 |
+
"These credentials may also differ in format, name and content depending on "
|
1129 |
+
"the social network."
|
1130 |
+
msgstr ""
|
1131 |
+
|
1132 |
+
#: includes/admin/components/networks/wsl.components.networks.setup.php:172
|
1133 |
+
#, php-format
|
1134 |
+
msgid ""
|
1135 |
+
"To enable authentication with this provider and to register a new <b>%s API "
|
1136 |
+
"Application</b>, carefully follow the steps"
|
1137 |
+
msgstr ""
|
1138 |
+
|
1139 |
+
#: includes/admin/components/networks/wsl.components.networks.setup.php:175
|
1140 |
+
#, php-format
|
1141 |
+
msgid "<b>Done.</b> Nothing more required for <b>%s</b>"
|
1142 |
+
msgstr ""
|
1143 |
+
|
1144 |
+
#: includes/admin/components/networks/wsl.components.networks.setup.php:259
|
1145 |
+
msgid "And that's it!"
|
1146 |
+
msgstr ""
|
1147 |
+
|
1148 |
+
#: includes/admin/components/networks/wsl.components.networks.setup.php:261
|
1149 |
+
#, php-format
|
1150 |
+
msgid ""
|
1151 |
+
"If for some reason you still can't figure it out, first try to a) <a class="
|
1152 |
+
"\"button-primary\" href=\"https://www.google.com/search?q=%s API create "
|
1153 |
+
"application\" target=\"_blank\">Google it</a>, then check it on b) <a class="
|
1154 |
+
"\"button-primary\" href=\"http://www.youtube.com/results?search_query=%s API "
|
1155 |
+
"create application \" target=\"_blank\">Youtube</a> and if nothing works c) "
|
1156 |
+
"<a class=\"button-primary\" href=\"options-general.php?page=wordpress-social-"
|
1157 |
+
"login&wslp=help\">ask for support</a>"
|
1158 |
+
msgstr ""
|
1159 |
+
|
1160 |
+
#: includes/admin/components/networks/wsl.components.networks.whyhello.php:21
|
1161 |
+
msgid "Why, hello there"
|
1162 |
+
msgstr ""
|
1163 |
+
|
1164 |
+
#: includes/admin/components/networks/wsl.components.networks.whyhello.php:29
|
1165 |
+
msgid ""
|
1166 |
+
"If you are still new to things, we recommend that you read the <b><a href="
|
1167 |
+
"\"http://hybridauth.sourceforge.net/wsl/index.html\" target=\"_blank"
|
1168 |
+
"\">Plugin User Guide</a></b> and to make sure your server settings meet this "
|
1169 |
+
"<b><a href=\"options-general.php?page=wordpress-social-login&"
|
1170 |
+
"wslp=diagnostics\">Plugin Requirements</a></b>"
|
1171 |
+
msgstr ""
|
1172 |
+
|
1173 |
+
#: includes/admin/components/networks/wsl.components.networks.whyhello.php:32
|
1174 |
+
msgid ""
|
1175 |
+
"If you run into any issue then refer to <b><a href=\"options-general.php?"
|
1176 |
+
"page=wordpress-social-login&wslp=help\">Help & Support</a></b> to konw how "
|
1177 |
+
"to reach me"
|
1178 |
+
msgstr ""
|
1179 |
+
|
1180 |
+
#: includes/admin/components/users/wsl.components.users.list.php:30
|
1181 |
+
#: includes/admin/components/users/wsl.components.users.list.php:41
|
1182 |
+
msgid "Providers"
|
1183 |
+
msgstr ""
|
1184 |
+
|
1185 |
+
#: includes/admin/components/users/wsl.components.users.list.php:31
|
1186 |
+
#: includes/admin/components/users/wsl.components.users.list.php:42
|
1187 |
+
#: includes/settings/wsl.compatibilities.php:104
|
1188 |
+
msgid "Username"
|
1189 |
+
msgstr ""
|
1190 |
+
|
1191 |
+
#: includes/admin/components/users/wsl.components.users.list.php:32
|
1192 |
+
#: includes/admin/components/users/wsl.components.users.list.php:43
|
1193 |
+
msgid "Full Name"
|
1194 |
+
msgstr ""
|
1195 |
+
|
1196 |
+
#: includes/admin/components/users/wsl.components.users.list.php:33
|
1197 |
+
#: includes/admin/components/users/wsl.components.users.list.php:44
|
1198 |
+
#: includes/settings/wsl.compatibilities.php:100
|
1199 |
+
msgid "E-mail"
|
1200 |
+
msgstr ""
|
1201 |
+
|
1202 |
+
#: includes/admin/components/users/wsl.components.users.list.php:34
|
1203 |
+
#: includes/admin/components/users/wsl.components.users.list.php:45
|
1204 |
+
msgid "Profile URL"
|
1205 |
+
msgstr ""
|
1206 |
+
|
1207 |
+
#: includes/admin/components/users/wsl.components.users.list.php:35
|
1208 |
+
#: includes/admin/components/users/wsl.components.users.list.php:46
|
1209 |
+
#: includes/settings/wsl.initialization.php:400
|
1210 |
+
msgid "Contacts"
|
1211 |
+
msgstr ""
|
1212 |
+
|
1213 |
+
#: includes/admin/components/users/wsl.components.users.list.php:36
|
1214 |
+
#: includes/admin/components/users/wsl.components.users.list.php:47
|
1215 |
+
msgid "Actions"
|
1216 |
+
msgstr ""
|
1217 |
+
|
1218 |
+
#: includes/admin/components/users/wsl.components.users.list.php:55
|
1219 |
+
msgid "No users found"
|
1220 |
+
msgstr ""
|
1221 |
+
|
1222 |
+
#: includes/admin/components/users/wsl.components.users.profile.php:22
|
1223 |
+
msgid "USER DOES NOT EXIST!"
|
1224 |
+
msgstr ""
|
1225 |
+
|
1226 |
+
#: includes/admin/components/users/wsl.components.users.profile.php:43
|
1227 |
+
msgid "User Profile"
|
1228 |
+
msgstr ""
|
1229 |
+
|
1230 |
+
#: includes/admin/components/users/wsl.components.users.profile.php:43
|
1231 |
+
#, php-format
|
1232 |
+
msgid "as provided by %s"
|
1233 |
+
msgstr ""
|
1234 |
+
|
1235 |
+
#: includes/services/wsl.authentication.php:64
|
1236 |
+
msgid "Bouncer say don't be silly!"
|
1237 |
+
msgstr ""
|
1238 |
+
|
1239 |
+
#: includes/services/wsl.authentication.php:70
|
1240 |
+
msgid "Bouncer say this makes no sense."
|
1241 |
+
msgstr ""
|
1242 |
+
|
1243 |
+
#: includes/services/wsl.authentication.php:77
|
1244 |
+
msgid "WSL is disabled!"
|
1245 |
+
msgstr ""
|
1246 |
+
|
1247 |
+
#: includes/services/wsl.authentication.php:99
|
1248 |
+
msgid "Bouncer says this makes no sense."
|
1249 |
+
msgstr ""
|
1250 |
+
|
1251 |
+
#: includes/services/wsl.authentication.php:107
|
1252 |
+
msgid "Bouncer say you are doin it wrong."
|
1253 |
+
msgstr ""
|
1254 |
+
|
1255 |
+
#: includes/services/wsl.authentication.php:114
|
1256 |
+
msgid "You are already logged in as <b>%</b>."
|
1257 |
+
msgstr ""
|
1258 |
+
|
1259 |
+
#: includes/services/wsl.authentication.php:119
|
1260 |
+
#: includes/services/wsl.authentication.php:559
|
1261 |
+
msgid ""
|
1262 |
+
"Error: Another plugin seems to be using HybridAuth Library and made "
|
1263 |
+
"WordPress Social Login unusable. We recommand to find this plugin and to "
|
1264 |
+
"kill it with fire!"
|
1265 |
+
msgstr ""
|
1266 |
+
|
1267 |
+
#: includes/services/wsl.authentication.php:130
|
1268 |
+
msgid "Unknown or disabled provider"
|
1269 |
+
msgstr ""
|
1270 |
+
|
1271 |
+
#: includes/services/wsl.authentication.php:262
|
1272 |
+
msgid "Unspecified error!"
|
1273 |
+
msgstr ""
|
1274 |
+
|
1275 |
+
#: includes/services/wsl.authentication.php:266
|
1276 |
+
msgid "Unspecified error."
|
1277 |
+
msgstr ""
|
1278 |
+
|
1279 |
+
#: includes/services/wsl.authentication.php:267
|
1280 |
+
msgid "Hybriauth configuration error."
|
1281 |
+
msgstr ""
|
1282 |
+
|
1283 |
+
#: includes/services/wsl.authentication.php:268
|
1284 |
+
msgid "Provider not properly configured."
|
1285 |
+
msgstr ""
|
1286 |
+
|
1287 |
+
#: includes/services/wsl.authentication.php:269
|
1288 |
+
msgid "Unknown or disabled provider."
|
1289 |
+
msgstr ""
|
1290 |
+
|
1291 |
+
#: includes/services/wsl.authentication.php:270
|
1292 |
+
msgid "Missing provider application credentials."
|
1293 |
+
msgstr ""
|
1294 |
+
|
1295 |
+
#: includes/services/wsl.authentication.php:271
|
1296 |
+
#, php-format
|
1297 |
+
msgid ""
|
1298 |
+
"<b>What does this error mean ?</b><br />Most likely, you didn't setup the "
|
1299 |
+
"correct application credentials for this provider. These credentials are "
|
1300 |
+
"required in order for <b>%s</b> users to access your website and for "
|
1301 |
+
"WordPress Social Login to work."
|
1302 |
+
msgstr ""
|
1303 |
+
|
1304 |
+
#: includes/services/wsl.authentication.php:271
|
1305 |
+
msgid ""
|
1306 |
+
"<br />Instructions for use can be found in the <a href=\"http://hybridauth."
|
1307 |
+
"sourceforge.net/wsl/configure.html\" target=\"_blank\">User Manual</a>."
|
1308 |
+
msgstr ""
|
1309 |
+
|
1310 |
+
#: includes/services/wsl.authentication.php:273
|
1311 |
+
msgid ""
|
1312 |
+
"Authentification failed. The user has canceled the authentication or the "
|
1313 |
+
"provider refused the connection."
|
1314 |
+
msgstr ""
|
1315 |
+
|
1316 |
+
#: includes/services/wsl.authentication.php:274
|
1317 |
+
msgid ""
|
1318 |
+
"User profile request failed. Most likely the user is not connected to the "
|
1319 |
+
"provider and he should to authenticate again."
|
1320 |
+
msgstr ""
|
1321 |
+
|
1322 |
+
#: includes/services/wsl.authentication.php:277
|
1323 |
+
msgid "User not connected to the provider."
|
1324 |
+
msgstr ""
|
1325 |
+
|
1326 |
+
#: includes/services/wsl.authentication.php:280
|
1327 |
+
msgid "Provider does not support this feature."
|
1328 |
+
msgstr ""
|
1329 |
+
|
1330 |
+
#: includes/services/wsl.authentication.php:323
|
1331 |
+
msgid "Something bad happen!"
|
1332 |
+
msgstr ""
|
1333 |
+
|
1334 |
+
#: includes/services/wsl.authentication.php:389
|
1335 |
+
msgid ""
|
1336 |
+
"Note: This message can be disabled from the plugin settings by setting "
|
1337 |
+
"<b>Development mode</b> to <b>Disabled</b>"
|
1338 |
+
msgstr ""
|
1339 |
+
|
1340 |
+
#: includes/services/wsl.authentication.php:418
|
1341 |
+
msgid "Redirecting..."
|
1342 |
+
msgstr ""
|
1343 |
+
|
1344 |
+
#: includes/services/wsl.authentication.php:447
|
1345 |
+
#, php-format
|
1346 |
+
msgid "Contacting <b>%s</b>, please wait..."
|
1347 |
+
msgstr ""
|
1348 |
+
|
1349 |
+
#: includes/services/wsl.authentication.php:711
|
1350 |
+
msgid "registration is now closed!"
|
1351 |
+
msgstr ""
|
1352 |
+
|
1353 |
+
#: includes/services/wsl.authentication.php:733
|
1354 |
+
#, php-format
|
1355 |
+
msgid "Unspecified error. #%d"
|
1356 |
+
msgstr ""
|
1357 |
+
|
1358 |
+
#: includes/services/wsl.authentication.php:882
|
1359 |
+
msgid "An error occurred while creating a new user!"
|
1360 |
+
msgstr ""
|
1361 |
+
|
1362 |
+
#: includes/settings/wsl.compatibilities.php:92
|
1363 |
+
msgid "Almost there, we just need to check a couple of things"
|
1364 |
+
msgstr ""
|
1365 |
+
|
1366 |
+
#: includes/settings/wsl.compatibilities.php:96
|
1367 |
+
msgid "Continue"
|
1368 |
+
msgstr ""
|
1369 |
+
|
1370 |
+
#: includes/settings/wsl.compatibilities.php:108
|
1371 |
+
msgid "E-mail is not valid!"
|
1372 |
+
msgstr ""
|
1373 |
+
|
1374 |
+
#: includes/settings/wsl.compatibilities.php:112
|
1375 |
+
msgid "Username is not valid!"
|
1376 |
+
msgstr ""
|
1377 |
+
|
1378 |
+
#: includes/settings/wsl.compatibilities.php:116
|
1379 |
+
msgid "That E-mail is already registered!"
|
1380 |
+
msgstr ""
|
1381 |
+
|
1382 |
+
#: includes/settings/wsl.compatibilities.php:120
|
1383 |
+
msgid "That Username is already registered!"
|
1384 |
+
msgstr ""
|
1385 |
+
|
1386 |
+
#: includes/settings/wsl.compatibilities.php:124
|
1387 |
+
msgid "You are now connected via"
|
1388 |
+
msgstr ""
|
1389 |
+
|
1390 |
+
#: includes/settings/wsl.compatibilities.php:140
|
1391 |
+
msgid "Bouncer says no."
|
1392 |
+
msgstr ""
|
1393 |
+
|
1394 |
+
#: includes/settings/wsl.compatibilities.php:148
|
1395 |
+
msgid "Bouncer say he refuses."
|
1396 |
+
msgstr ""
|
1397 |
+
|
1398 |
+
#: includes/settings/wsl.compatibilities.php:156
|
1399 |
+
msgid "Bouncer say only Mundo can go where he pleases!"
|
1400 |
+
msgstr ""
|
1401 |
+
|
1402 |
+
#: includes/settings/wsl.initialization.php:59
|
1403 |
+
#: includes/settings/wsl.initialization.php:87
|
1404 |
+
msgid ""
|
1405 |
+
"An installed plugin is trying to o-ver-write WordPress Social Login config "
|
1406 |
+
"in a bad way."
|
1407 |
+
msgstr ""
|
1408 |
+
|
1409 |
+
#: includes/settings/wsl.initialization.php:373
|
1410 |
+
msgid "WSL user profile"
|
1411 |
+
msgstr ""
|
1412 |
+
|
1413 |
+
#: includes/settings/wsl.initialization.php:374
|
1414 |
+
msgid "WSL user contacts"
|
1415 |
+
msgstr ""
|
1416 |
+
|
1417 |
+
#: includes/settings/wsl.initialization.php:400
|
1418 |
+
msgid "Profile"
|
1419 |
+
msgstr ""
|
1420 |
+
|
1421 |
+
#: includes/widgets/wsl.auth.widget.php:124
|
1422 |
+
msgid ""
|
1423 |
+
"<strong style=\"color:red;\">WordPress Social Login is not configured yet!</"
|
1424 |
+
"strong><br />Please visit the <strong>Settings\\ WP Social Login</strong> "
|
1425 |
+
"administration page to configure this plugin.<br />For more information "
|
1426 |
+
"please refer to the plugin <a href=\"http://hybridauth.sourceforge.net/"
|
1427 |
+
"userguide/Plugin_WordPress_Social_Login.html\">online user guide</a> or "
|
1428 |
+
"contact us at <a href=\"http://hybridauth.sourceforge.net/\">hybridauth."
|
1429 |
+
"sourceforge.net</a>"
|
1430 |
+
msgstr ""
|
1431 |
+
|
1432 |
+
#: includes/widgets/wsl.auth.widget.php:293
|
1433 |
+
msgid "Social networks"
|
1434 |
+
msgstr ""
|
1435 |
+
|
1436 |
+
#: includes/widgets/wsl.auth.widget.php:300
|
1437 |
+
msgid "Identity"
|
1438 |
+
msgstr ""
|
1439 |
+
|
1440 |
+
#: includes/widgets/wsl.auth.widget.php:336
|
1441 |
+
msgid "Add more identities"
|
1442 |
+
msgstr ""
|
1443 |
+
|
1444 |
+
#: includes/widgets/wsl.auth.widget.php:375
|
1445 |
+
msgid "Currently connected to:"
|
1446 |
+
msgstr ""
|
languages/wordpress-social-login-de_DE.mo
ADDED
Binary file
|
languages/wordpress-social-login-de_DE.po
ADDED
@@ -0,0 +1,1449 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
msgid ""
|
2 |
+
msgstr ""
|
3 |
+
"Project-Id-Version: WordPress Social Login\n"
|
4 |
+
"POT-Creation-Date: 2013-02-16 06:40+0100\n"
|
5 |
+
"PO-Revision-Date: 2013-02-16 06:41+0100\n"
|
6 |
+
"Last-Translator: Miled <hybridauth@gmail.com>\n"
|
7 |
+
"Language-Team: WordPress Social Login <hybridauth@gmail.com>\n"
|
8 |
+
"Language: German - Deutsch (de_DE)\n"
|
9 |
+
"MIME-Version: 1.0\n"
|
10 |
+
"Content-Type: text/plain; charset=UTF-8\n"
|
11 |
+
"Content-Transfer-Encoding: 8bit\n"
|
12 |
+
"X-Generator: Poedit 1.5.5\n"
|
13 |
+
|
14 |
+
#: includes/admin/wsl.admin.ui.php:332
|
15 |
+
msgid "Development mode is enabled!"
|
16 |
+
msgstr ""
|
17 |
+
|
18 |
+
#: includes/admin/wsl.admin.ui.php:407
|
19 |
+
#: includes/services/wsl.authentication.php:637
|
20 |
+
msgid "Something wrong!"
|
21 |
+
msgstr ""
|
22 |
+
|
23 |
+
#: includes/admin/wsl.admin.ui.php:412
|
24 |
+
msgid ""
|
25 |
+
"Unknown or Disabled <b>Component</b>! Check the list of enabled components "
|
26 |
+
"or the typed URL"
|
27 |
+
msgstr ""
|
28 |
+
|
29 |
+
#: includes/admin/wsl.admin.ui.php:416
|
30 |
+
msgid ""
|
31 |
+
"If you believe you've found a problem with <b>WordPress Social Login</b>, be "
|
32 |
+
"sure to let us know so we can fix it"
|
33 |
+
msgstr ""
|
34 |
+
|
35 |
+
#: includes/admin/wsl.admin.ui.php:422
|
36 |
+
msgid "Report as bug"
|
37 |
+
msgstr ""
|
38 |
+
|
39 |
+
#: includes/admin/wsl.admin.ui.php:423
|
40 |
+
msgid "Check enabled components"
|
41 |
+
msgstr ""
|
42 |
+
|
43 |
+
#: includes/admin/wsl.admin.ui.php:567
|
44 |
+
msgid "Welcome!"
|
45 |
+
msgstr "Willkommen!"
|
46 |
+
|
47 |
+
#: includes/admin/wsl.admin.ui.php:569
|
48 |
+
msgid ""
|
49 |
+
"If you are still new to WordPress Social Login, we have provided a few "
|
50 |
+
"walkthroughs to get you started"
|
51 |
+
msgstr ""
|
52 |
+
"Wir haben einige Links zusammengestellt, um dir den Start zu erleichtern"
|
53 |
+
|
54 |
+
#: includes/admin/wsl.admin.ui.php:576
|
55 |
+
msgid "Get Started"
|
56 |
+
msgstr "Nächster Schritt"
|
57 |
+
|
58 |
+
#: includes/admin/wsl.admin.ui.php:579
|
59 |
+
msgid ""
|
60 |
+
"<a href=\"http://hybridauth.sourceforge.net/wsl/configure.html\" target="
|
61 |
+
"\"_blank\">Setup and Configuration</a>"
|
62 |
+
msgstr ""
|
63 |
+
|
64 |
+
#: includes/admin/wsl.admin.ui.php:580
|
65 |
+
msgid ""
|
66 |
+
"<a href=\"http://hybridauth.sourceforge.net/wsl/customize.html\" target="
|
67 |
+
"\"_blank\">Customize WSL Widgets</a>"
|
68 |
+
msgstr ""
|
69 |
+
|
70 |
+
#: includes/admin/wsl.admin.ui.php:581
|
71 |
+
msgid ""
|
72 |
+
"<a href=\"http://hybridauth.sourceforge.net/wsl/userdata.html\" target="
|
73 |
+
"\"_blank\">Manage users and contacts</a>"
|
74 |
+
msgstr ""
|
75 |
+
|
76 |
+
#: includes/admin/wsl.admin.ui.php:582
|
77 |
+
msgid ""
|
78 |
+
"<a href=\"http://hybridauth.sourceforge.net/wsl/index.html\" target=\"_blank"
|
79 |
+
"\">WSL User Guide</a> and <a href=\"http://hybridauth.sourceforge.net/wsl/"
|
80 |
+
"faq.html\" target=\"_blank\">FAQ</a>"
|
81 |
+
msgstr ""
|
82 |
+
|
83 |
+
#: includes/admin/wsl.admin.ui.php:588
|
84 |
+
#, php-format
|
85 |
+
msgid "What's new on WSL %s"
|
86 |
+
msgstr ""
|
87 |
+
|
88 |
+
#: includes/admin/wsl.admin.ui.php:591
|
89 |
+
msgid ""
|
90 |
+
"In a similar way to WordPress plugins, WSL uses <a href=\"options-general."
|
91 |
+
"php?page=wordpress-social-login&wslp=components\">Components</a>"
|
92 |
+
msgstr ""
|
93 |
+
|
94 |
+
#: includes/admin/wsl.admin.ui.php:592
|
95 |
+
msgid "<b>Email Validation</b> is replaced with <b>Profile Completion</b>"
|
96 |
+
msgstr ""
|
97 |
+
|
98 |
+
#: includes/admin/wsl.admin.ui.php:593
|
99 |
+
msgid ""
|
100 |
+
"<b>User Moderation</b> made compatible with <a href=\"http://wordpress.org/"
|
101 |
+
"extend/plugins/theme-my-login/\" target=\"_blank\">Theme My Login</a> plugin"
|
102 |
+
msgstr ""
|
103 |
+
|
104 |
+
#: includes/admin/wsl.admin.ui.php:594
|
105 |
+
msgid "A number of enhancements and new options now available"
|
106 |
+
msgstr ""
|
107 |
+
|
108 |
+
#: includes/admin/wsl.admin.ui.php:644
|
109 |
+
msgid "Contributor License Agreement"
|
110 |
+
msgstr ""
|
111 |
+
|
112 |
+
#: includes/admin/wsl.admin.ui.php:649
|
113 |
+
msgid ""
|
114 |
+
"You are about to submit your contributions to the WordPress Social Login "
|
115 |
+
"Website to be reviewed for inclusion in future versions"
|
116 |
+
msgstr ""
|
117 |
+
|
118 |
+
#: includes/admin/wsl.admin.ui.php:651
|
119 |
+
msgid ""
|
120 |
+
"You hereby grant the permission to publish your contribution, in whole or in "
|
121 |
+
"part, and to made it available under the <b>MIT License</b>, for the "
|
122 |
+
"<b>Wordpress community</b> to, freely use or misuse"
|
123 |
+
msgstr ""
|
124 |
+
|
125 |
+
#: includes/admin/wsl.admin.ui.php:657
|
126 |
+
msgid "Hell No"
|
127 |
+
msgstr ""
|
128 |
+
|
129 |
+
#: includes/admin/wsl.admin.ui.php:658
|
130 |
+
msgid "Yes, I agree to contribute my translation"
|
131 |
+
msgstr ""
|
132 |
+
|
133 |
+
#: includes/admin/wsl.admin.ui.php:662
|
134 |
+
msgid "Help us localize WordPress Social Login"
|
135 |
+
msgstr "Help ons om deze pagina te vertalen"
|
136 |
+
|
137 |
+
#: includes/admin/wsl.admin.ui.php:666
|
138 |
+
msgid ""
|
139 |
+
"You can <b>translate as much you pleases</b> as much <b>as you want</b>. You "
|
140 |
+
"don't have to translate everything in this page, but every word counts. "
|
141 |
+
"Ignore any string you want or aleardy translated. You could also use this "
|
142 |
+
"tool to fix any typo you may find or to improve the current language "
|
143 |
+
"expressions"
|
144 |
+
msgstr ""
|
145 |
+
|
146 |
+
#: includes/admin/wsl.admin.ui.php:668
|
147 |
+
msgid ""
|
148 |
+
"Your name allows us to recognize your contributions and bypass manual "
|
149 |
+
"review, especially when you've been contributing in the past. So do supply "
|
150 |
+
"some unique string, even if it's not your real name"
|
151 |
+
msgstr ""
|
152 |
+
|
153 |
+
#: includes/admin/wsl.admin.ui.php:670
|
154 |
+
msgid ""
|
155 |
+
"All the texts on this page are automatically extracted and generated on the "
|
156 |
+
"form beside. If the translation tool has scapped something you may consider "
|
157 |
+
"as irrelevant, please leave that particular field empty"
|
158 |
+
msgstr ""
|
159 |
+
|
160 |
+
#: includes/admin/wsl.admin.ui.php:672
|
161 |
+
msgid ""
|
162 |
+
"Your contributions will be sent to the WordPress Social Login website for "
|
163 |
+
"inclusion in future versions"
|
164 |
+
msgstr ""
|
165 |
+
|
166 |
+
#: includes/admin/wsl.admin.ui.php:674
|
167 |
+
msgid "Thanks!"
|
168 |
+
msgstr ""
|
169 |
+
|
170 |
+
#: includes/admin/wsl.admin.ui.php:682
|
171 |
+
msgid "Your Name"
|
172 |
+
msgstr ""
|
173 |
+
|
174 |
+
#: includes/admin/wsl.admin.ui.php:682 includes/admin/wsl.admin.ui.php:688
|
175 |
+
msgid "optional"
|
176 |
+
msgstr ""
|
177 |
+
|
178 |
+
#: includes/admin/wsl.admin.ui.php:688
|
179 |
+
msgid "Comment"
|
180 |
+
msgstr ""
|
181 |
+
|
182 |
+
#: includes/admin/wsl.admin.ui.php:694
|
183 |
+
msgid "Target Language"
|
184 |
+
msgstr ""
|
185 |
+
|
186 |
+
#: includes/admin/wsl.admin.ui.php:703
|
187 |
+
msgid "Submit changes"
|
188 |
+
msgstr ""
|
189 |
+
|
190 |
+
#: includes/admin/wsl.admin.ui.php:769
|
191 |
+
msgid "Help us translate this page into your language"
|
192 |
+
msgstr "Help ons om deze pagina te vertalen"
|
193 |
+
|
194 |
+
#: includes/admin/components/advanced/index.php:47
|
195 |
+
#: includes/admin/components/login-widget/wsl.components.loginwidget.setup.php:62
|
196 |
+
msgid "Advanced Settings"
|
197 |
+
msgstr ""
|
198 |
+
|
199 |
+
#: includes/admin/components/advanced/index.php:52
|
200 |
+
msgid ""
|
201 |
+
"<b>Please</b> for the love of <b>God</b>, stay out of Advanced.. unless you "
|
202 |
+
"are Advanced and you know what you are doing"
|
203 |
+
msgstr ""
|
204 |
+
|
205 |
+
#: includes/admin/components/advanced/index.php:61
|
206 |
+
msgid "WSL Base URL"
|
207 |
+
msgstr ""
|
208 |
+
|
209 |
+
#: includes/admin/components/advanced/index.php:68
|
210 |
+
msgid "WSL Base PATH"
|
211 |
+
msgstr ""
|
212 |
+
|
213 |
+
#: includes/admin/components/advanced/index.php:75
|
214 |
+
msgid "Hybridauth endpoint URL"
|
215 |
+
msgstr ""
|
216 |
+
|
217 |
+
#: includes/admin/components/advanced/index.php:82
|
218 |
+
msgid "WSL top bar menu"
|
219 |
+
msgstr ""
|
220 |
+
|
221 |
+
#: includes/admin/components/advanced/index.php:85
|
222 |
+
#: includes/admin/components/bouncer/wsl.components.bouncer.setup.php:38
|
223 |
+
#: includes/admin/components/bouncer/wsl.components.bouncer.setup.php:47
|
224 |
+
#: includes/admin/components/bouncer/wsl.components.bouncer.setup.php:72
|
225 |
+
#: includes/admin/components/bouncer/wsl.components.bouncer.setup.php:81
|
226 |
+
#: includes/admin/components/bouncer/wsl.components.bouncer.setup.php:174
|
227 |
+
#: includes/admin/components/bouncer/wsl.components.bouncer.setup.php:211
|
228 |
+
#: includes/admin/components/bouncer/wsl.components.bouncer.setup.php:249
|
229 |
+
msgid "Yes"
|
230 |
+
msgstr ""
|
231 |
+
|
232 |
+
#: includes/admin/components/advanced/index.php:86
|
233 |
+
#: includes/admin/components/bouncer/wsl.components.bouncer.setup.php:39
|
234 |
+
#: includes/admin/components/bouncer/wsl.components.bouncer.setup.php:48
|
235 |
+
#: includes/admin/components/bouncer/wsl.components.bouncer.setup.php:73
|
236 |
+
#: includes/admin/components/bouncer/wsl.components.bouncer.setup.php:82
|
237 |
+
#: includes/admin/components/bouncer/wsl.components.bouncer.setup.php:175
|
238 |
+
#: includes/admin/components/bouncer/wsl.components.bouncer.setup.php:212
|
239 |
+
#: includes/admin/components/bouncer/wsl.components.bouncer.setup.php:250
|
240 |
+
msgid "No"
|
241 |
+
msgstr ""
|
242 |
+
|
243 |
+
#: includes/admin/components/advanced/index.php:98
|
244 |
+
#: includes/admin/components/bouncer/wsl.components.bouncer.setup.php:275
|
245 |
+
#: includes/admin/components/contacts/index.php:98
|
246 |
+
#: includes/admin/components/diagnostics/index.php:64
|
247 |
+
#: includes/admin/components/login-widget/wsl.components.loginwidget.setup.php:144
|
248 |
+
#: includes/admin/components/networks/wsl.components.networks.setup.php:271
|
249 |
+
#: includes/admin/components/networks/wsl.components.networks.whyhello.php:40
|
250 |
+
msgid "Save Settings"
|
251 |
+
msgstr "Speichere Einstellungen"
|
252 |
+
|
253 |
+
#: includes/admin/components/bouncer/wsl.components.bouncer.setup.php:27
|
254 |
+
msgid "WSL Widget"
|
255 |
+
msgstr ""
|
256 |
+
|
257 |
+
#: includes/admin/components/bouncer/wsl.components.bouncer.setup.php:31
|
258 |
+
msgid ""
|
259 |
+
"Here you can tell Bouncer if you are accepting new users registration and "
|
260 |
+
"authentication into your website or not any more. Note that Bouncer only "
|
261 |
+
"works for WSL and will not interfere with users authenticating through the "
|
262 |
+
"regulars wordpress Login and Register pages with their usernames and "
|
263 |
+
"passwords (to to achieve that kind of restrictions, you may need to use "
|
264 |
+
"another plugin(s) in combination with WSL)."
|
265 |
+
msgstr ""
|
266 |
+
|
267 |
+
#: includes/admin/components/bouncer/wsl.components.bouncer.setup.php:35
|
268 |
+
msgid "Accept new registration"
|
269 |
+
msgstr ""
|
270 |
+
|
271 |
+
#: includes/admin/components/bouncer/wsl.components.bouncer.setup.php:44
|
272 |
+
msgid "Allow authentication"
|
273 |
+
msgstr ""
|
274 |
+
|
275 |
+
#: includes/admin/components/bouncer/wsl.components.bouncer.setup.php:58
|
276 |
+
#: includes/admin/components/bouncer/wsl.components.bouncer.sidebar.php:45
|
277 |
+
msgid "Profile Completion"
|
278 |
+
msgstr ""
|
279 |
+
|
280 |
+
#: includes/admin/components/bouncer/wsl.components.bouncer.setup.php:62
|
281 |
+
msgid ""
|
282 |
+
"Select required fields. If a social network doesn't return them, Bouncer "
|
283 |
+
"will then ask your visitors to fill additional form to provide them when "
|
284 |
+
"registering."
|
285 |
+
msgstr ""
|
286 |
+
|
287 |
+
#: includes/admin/components/bouncer/wsl.components.bouncer.setup.php:65
|
288 |
+
msgid ""
|
289 |
+
"You may activate <b>Profile Completion</b> for both <b>E-mail</b> and "
|
290 |
+
"<b>Username</b>, but keep in mind, the idea behind <b>social login</b> is to "
|
291 |
+
"avoid forms and remove all the hassle of registration"
|
292 |
+
msgstr ""
|
293 |
+
|
294 |
+
#: includes/admin/components/bouncer/wsl.components.bouncer.setup.php:69
|
295 |
+
msgid "Require E-mail"
|
296 |
+
msgstr ""
|
297 |
+
|
298 |
+
#: includes/admin/components/bouncer/wsl.components.bouncer.setup.php:78
|
299 |
+
msgid "Allow Username change"
|
300 |
+
msgstr ""
|
301 |
+
|
302 |
+
#: includes/admin/components/bouncer/wsl.components.bouncer.setup.php:92
|
303 |
+
#: includes/admin/components/bouncer/wsl.components.bouncer.setup.php:111
|
304 |
+
msgid "User Moderation"
|
305 |
+
msgstr ""
|
306 |
+
|
307 |
+
#: includes/admin/components/bouncer/wsl.components.bouncer.setup.php:96
|
308 |
+
msgid ""
|
309 |
+
"<b>User Moderation</b> will define how <b>Bouncer</b> should behave with new "
|
310 |
+
"regsitred users:"
|
311 |
+
msgstr ""
|
312 |
+
|
313 |
+
#: includes/admin/components/bouncer/wsl.components.bouncer.setup.php:99
|
314 |
+
msgid "<b>None</b>: No moderation required."
|
315 |
+
msgstr ""
|
316 |
+
|
317 |
+
#: includes/admin/components/bouncer/wsl.components.bouncer.setup.php:100
|
318 |
+
msgid ""
|
319 |
+
"<b>E-mail Confirmation</b>: New users will need to be confirm their e-mail "
|
320 |
+
"address before they may log in"
|
321 |
+
msgstr ""
|
322 |
+
|
323 |
+
#: includes/admin/components/bouncer/wsl.components.bouncer.setup.php:101
|
324 |
+
msgid ""
|
325 |
+
"<b>Admin Approval</b>: New users will need to be approved by an "
|
326 |
+
"administrator before they may log in"
|
327 |
+
msgstr ""
|
328 |
+
|
329 |
+
#: includes/admin/components/bouncer/wsl.components.bouncer.setup.php:104
|
330 |
+
msgid ""
|
331 |
+
"Both <b>Admin Approval</b> and <b>E-mail Confirmation</b> requires <a href="
|
332 |
+
"\"http://wordpress.org/extend/plugins/theme-my-login/\" target=\"_blank"
|
333 |
+
"\">Theme My Login</a> plugin to be installed. As there is no point for "
|
334 |
+
"<b>WordPress Social Login</b> to reinvent the wheel"
|
335 |
+
msgstr ""
|
336 |
+
|
337 |
+
#: includes/admin/components/bouncer/wsl.components.bouncer.setup.php:107
|
338 |
+
msgid ""
|
339 |
+
"<b>User Moderation</b> was purposely made compatible with the <a href="
|
340 |
+
"\"http://wordpress.org/extend/plugins/theme-my-login/\" target=\"_blank"
|
341 |
+
"\">Theme My Login</a> for a number reasons: That plugin is good at what he "
|
342 |
+
"does, a hell of a lot of people are using it and many have asked for it"
|
343 |
+
msgstr ""
|
344 |
+
|
345 |
+
#: includes/admin/components/bouncer/wsl.components.bouncer.setup.php:114
|
346 |
+
msgid "None"
|
347 |
+
msgstr ""
|
348 |
+
|
349 |
+
#: includes/admin/components/bouncer/wsl.components.bouncer.setup.php:115
|
350 |
+
msgid "E-mail Confirmation — Yield to Theme My Login plugin"
|
351 |
+
msgstr ""
|
352 |
+
|
353 |
+
#: includes/admin/components/bouncer/wsl.components.bouncer.setup.php:116
|
354 |
+
msgid "Admin Approval — Yield to Theme My Login plugin"
|
355 |
+
msgstr ""
|
356 |
+
|
357 |
+
#: includes/admin/components/bouncer/wsl.components.bouncer.setup.php:126
|
358 |
+
msgid "Membership level"
|
359 |
+
msgstr ""
|
360 |
+
|
361 |
+
#: includes/admin/components/bouncer/wsl.components.bouncer.setup.php:130
|
362 |
+
msgid ""
|
363 |
+
"Here you can define the default role for new users authenticating through "
|
364 |
+
"WSL. The <code>Administrator</code> and <code>Editor</code> roles are not "
|
365 |
+
"available for safety reasons"
|
366 |
+
msgstr ""
|
367 |
+
|
368 |
+
#: includes/admin/components/bouncer/wsl.components.bouncer.setup.php:133
|
369 |
+
msgid ""
|
370 |
+
"For more information about wordpress users roles and capabilities refer to "
|
371 |
+
"<a href=\"http://codex.wordpress.org/Roles_and_Capabilities#Capability_vs."
|
372 |
+
"_Role_Table\" target=\"_blank\">http://codex.wordpress.org/"
|
373 |
+
"Roles_and_Capabilities</a>"
|
374 |
+
msgstr ""
|
375 |
+
|
376 |
+
#: includes/admin/components/bouncer/wsl.components.bouncer.setup.php:136
|
377 |
+
msgid ""
|
378 |
+
"If <b>User Moderation</b> is set to <code>Admin Approval</code> then "
|
379 |
+
"<b>Membership level</b> will be ignored"
|
380 |
+
msgstr ""
|
381 |
+
|
382 |
+
#: includes/admin/components/bouncer/wsl.components.bouncer.setup.php:140
|
383 |
+
msgid "New User Default Role"
|
384 |
+
msgstr ""
|
385 |
+
|
386 |
+
#: includes/admin/components/bouncer/wsl.components.bouncer.setup.php:143
|
387 |
+
msgid "Safe"
|
388 |
+
msgstr ""
|
389 |
+
|
390 |
+
#: includes/admin/components/bouncer/wsl.components.bouncer.setup.php:144
|
391 |
+
msgid "— Wordpress User Default Role —"
|
392 |
+
msgstr ""
|
393 |
+
|
394 |
+
#: includes/admin/components/bouncer/wsl.components.bouncer.setup.php:145
|
395 |
+
msgid "— No role for this site —"
|
396 |
+
msgstr ""
|
397 |
+
|
398 |
+
#: includes/admin/components/bouncer/wsl.components.bouncer.setup.php:146
|
399 |
+
msgid "Subscriber"
|
400 |
+
msgstr ""
|
401 |
+
|
402 |
+
#: includes/admin/components/bouncer/wsl.components.bouncer.setup.php:149
|
403 |
+
msgid "Be careful with these"
|
404 |
+
msgstr ""
|
405 |
+
|
406 |
+
#: includes/admin/components/bouncer/wsl.components.bouncer.setup.php:150
|
407 |
+
msgid "Author"
|
408 |
+
msgstr ""
|
409 |
+
|
410 |
+
#: includes/admin/components/bouncer/wsl.components.bouncer.setup.php:151
|
411 |
+
msgid "Contributor"
|
412 |
+
msgstr ""
|
413 |
+
|
414 |
+
#: includes/admin/components/bouncer/wsl.components.bouncer.setup.php:162
|
415 |
+
msgid "Filters by emails domains name"
|
416 |
+
msgstr ""
|
417 |
+
|
418 |
+
#: includes/admin/components/bouncer/wsl.components.bouncer.setup.php:166
|
419 |
+
msgid "Restrict registration to a limited number of domains name."
|
420 |
+
msgstr ""
|
421 |
+
|
422 |
+
#: includes/admin/components/bouncer/wsl.components.bouncer.setup.php:167
|
423 |
+
msgid ""
|
424 |
+
"Insert one email address per line and try to keep this list short. On "
|
425 |
+
"<code>Bounce text</code> insert the text you want to display for rejected "
|
426 |
+
"users. ex: <code>gmail.com</code>, without '@'."
|
427 |
+
msgstr ""
|
428 |
+
|
429 |
+
#: includes/admin/components/bouncer/wsl.components.bouncer.setup.php:171
|
430 |
+
#: includes/admin/components/bouncer/wsl.components.bouncer.setup.php:208
|
431 |
+
#: includes/admin/components/bouncer/wsl.components.bouncer.setup.php:246
|
432 |
+
#: includes/admin/components/contacts/index.php:51
|
433 |
+
#: includes/admin/components/contacts/index.php:58
|
434 |
+
#: includes/admin/components/contacts/index.php:65
|
435 |
+
#: includes/admin/components/contacts/index.php:72
|
436 |
+
#: includes/admin/components/contacts/index.php:79
|
437 |
+
#: includes/admin/components/diagnostics/index.php:61
|
438 |
+
#: includes/admin/components/networks/wsl.components.networks.setup.php:109
|
439 |
+
msgid "Enabled"
|
440 |
+
msgstr "Aktiviert"
|
441 |
+
|
442 |
+
#: includes/admin/components/bouncer/wsl.components.bouncer.setup.php:180
|
443 |
+
msgid "Domains list"
|
444 |
+
msgstr ""
|
445 |
+
|
446 |
+
#: includes/admin/components/bouncer/wsl.components.bouncer.setup.php:186
|
447 |
+
#: includes/admin/components/bouncer/wsl.components.bouncer.setup.php:223
|
448 |
+
#: includes/admin/components/bouncer/wsl.components.bouncer.setup.php:261
|
449 |
+
msgid "Bounce text"
|
450 |
+
msgstr ""
|
451 |
+
|
452 |
+
#: includes/admin/components/bouncer/wsl.components.bouncer.setup.php:199
|
453 |
+
msgid "Filters by e-mails addresses"
|
454 |
+
msgstr ""
|
455 |
+
|
456 |
+
#: includes/admin/components/bouncer/wsl.components.bouncer.setup.php:203
|
457 |
+
msgid "Restrict registration to a limited number of emails addresses."
|
458 |
+
msgstr ""
|
459 |
+
|
460 |
+
#: includes/admin/components/bouncer/wsl.components.bouncer.setup.php:204
|
461 |
+
msgid ""
|
462 |
+
"Insert one email address per line and try to keep this list short. On "
|
463 |
+
"<code>Bounce text</code> insert the text you want to display for rejected "
|
464 |
+
"users. ex: <code>hybridauth@gmail.com</code>"
|
465 |
+
msgstr ""
|
466 |
+
|
467 |
+
#: includes/admin/components/bouncer/wsl.components.bouncer.setup.php:217
|
468 |
+
msgid "E-mails list"
|
469 |
+
msgstr ""
|
470 |
+
|
471 |
+
#: includes/admin/components/bouncer/wsl.components.bouncer.setup.php:236
|
472 |
+
msgid "Filters by profile urls"
|
473 |
+
msgstr ""
|
474 |
+
|
475 |
+
#: includes/admin/components/bouncer/wsl.components.bouncer.setup.php:240
|
476 |
+
msgid "Restrict registration to a limited number of profile urls."
|
477 |
+
msgstr ""
|
478 |
+
|
479 |
+
#: includes/admin/components/bouncer/wsl.components.bouncer.setup.php:241
|
480 |
+
msgid ""
|
481 |
+
"<b>Note</b>: If a social network provide the user email, then use 'Filters "
|
482 |
+
"by e-mails addresses' instead. Providers like Facebook provide multiples "
|
483 |
+
"profiles URLs per user and WSL won't be able to reconize them."
|
484 |
+
msgstr ""
|
485 |
+
|
486 |
+
#: includes/admin/components/bouncer/wsl.components.bouncer.setup.php:242
|
487 |
+
msgid ""
|
488 |
+
"Insert one email address per line and try to keep this list short. On "
|
489 |
+
"<code>Bounce text</code> insert the text you want to display for rejected "
|
490 |
+
"users. ex: <code>http://twitter.com/HybridAuth</code>, <code>https://plus."
|
491 |
+
"google.com/u/0/108839241301472312344</code>"
|
492 |
+
msgstr ""
|
493 |
+
|
494 |
+
#: includes/admin/components/bouncer/wsl.components.bouncer.setup.php:255
|
495 |
+
msgid "Profile urls"
|
496 |
+
msgstr ""
|
497 |
+
|
498 |
+
#: includes/admin/components/bouncer/wsl.components.bouncer.sidebar.php:26
|
499 |
+
#: includes/admin/components/login-widget/wsl.components.loginwidget.sidebar.php:26
|
500 |
+
msgid "What's This?"
|
501 |
+
msgstr ""
|
502 |
+
|
503 |
+
#: includes/admin/components/bouncer/wsl.components.bouncer.sidebar.php:30
|
504 |
+
msgid "Hey, meet our friend, the Bouncer"
|
505 |
+
msgstr ""
|
506 |
+
|
507 |
+
#: includes/admin/components/bouncer/wsl.components.bouncer.sidebar.php:33
|
508 |
+
msgid ""
|
509 |
+
"Ever been in trouble with one of <a href=\"http://www.flickr.com/search/?"
|
510 |
+
"q=bouncer+doorman&z=e\" target=\"_blank\">these guys</a>? Well, this module "
|
511 |
+
"have more or less the same role, and he will try his best to piss your users "
|
512 |
+
"off until they meet your requirements."
|
513 |
+
msgstr ""
|
514 |
+
|
515 |
+
#: includes/admin/components/bouncer/wsl.components.bouncer.sidebar.php:37
|
516 |
+
msgid ""
|
517 |
+
"This feature is most suited for small businesses and folks running a closed-"
|
518 |
+
"door blog between friends or coworkers."
|
519 |
+
msgstr ""
|
520 |
+
|
521 |
+
#: includes/admin/components/bouncer/wsl.components.bouncer.sidebar.php:40
|
522 |
+
msgid "Available settings"
|
523 |
+
msgstr ""
|
524 |
+
|
525 |
+
#: includes/admin/components/bouncer/wsl.components.bouncer.sidebar.php:43
|
526 |
+
msgid "Enable/Disable Registration"
|
527 |
+
msgstr ""
|
528 |
+
|
529 |
+
#: includes/admin/components/bouncer/wsl.components.bouncer.sidebar.php:44
|
530 |
+
msgid "Enable/Disable Authentication"
|
531 |
+
msgstr ""
|
532 |
+
|
533 |
+
#: includes/admin/components/bouncer/wsl.components.bouncer.sidebar.php:46
|
534 |
+
msgid "Users moderation"
|
535 |
+
msgstr ""
|
536 |
+
|
537 |
+
#: includes/admin/components/bouncer/wsl.components.bouncer.sidebar.php:47
|
538 |
+
msgid "Users roles"
|
539 |
+
msgstr ""
|
540 |
+
|
541 |
+
#: includes/admin/components/bouncer/wsl.components.bouncer.sidebar.php:48
|
542 |
+
msgid "Restrictions (by emails, domains, profiles urls)"
|
543 |
+
msgstr ""
|
544 |
+
|
545 |
+
#: includes/admin/components/bouncer/wsl.components.bouncer.sidebar.php:51
|
546 |
+
msgid "IMPORTANT!"
|
547 |
+
msgstr ""
|
548 |
+
|
549 |
+
#: includes/admin/components/bouncer/wsl.components.bouncer.sidebar.php:54
|
550 |
+
msgid ""
|
551 |
+
"All the settings on this page without exception are only valid for users "
|
552 |
+
"authenticating through <b>WordPress Social Login Widget"
|
553 |
+
msgstr ""
|
554 |
+
|
555 |
+
#: includes/admin/components/bouncer/wsl.components.bouncer.sidebar.php:57
|
556 |
+
msgid ""
|
557 |
+
"Users authenticating through the regulars Wordpress Login and Register pages "
|
558 |
+
"with their usernames and passwords WILL NOT be affected."
|
559 |
+
msgstr ""
|
560 |
+
|
561 |
+
#: includes/admin/components/components/wsl.components.help.gallery.php:30
|
562 |
+
msgid "Other Components available"
|
563 |
+
msgstr ""
|
564 |
+
|
565 |
+
#: includes/admin/components/components/wsl.components.help.gallery.php:58
|
566 |
+
msgid "WordPress Social Login for BuddyPress"
|
567 |
+
msgstr ""
|
568 |
+
|
569 |
+
#: includes/admin/components/components/wsl.components.help.gallery.php:60
|
570 |
+
msgid "Make WordPress Social Login compatible with BuddyPress"
|
571 |
+
msgstr ""
|
572 |
+
|
573 |
+
#: includes/admin/components/components/wsl.components.help.gallery.php:61
|
574 |
+
msgid "Widget integration, xProfiles mapping and more"
|
575 |
+
msgstr ""
|
576 |
+
|
577 |
+
#: includes/admin/components/components/wsl.components.help.gallery.php:63
|
578 |
+
msgid "Install Now"
|
579 |
+
msgstr ""
|
580 |
+
|
581 |
+
#: includes/admin/components/components/wsl.components.help.gallery.php:64
|
582 |
+
msgid "Visit plugin site"
|
583 |
+
msgstr ""
|
584 |
+
|
585 |
+
#: includes/admin/components/components/wsl.components.help.gallery.php:69
|
586 |
+
msgid "Build yours"
|
587 |
+
msgstr ""
|
588 |
+
|
589 |
+
#: includes/admin/components/components/wsl.components.help.gallery.php:71
|
590 |
+
msgid ""
|
591 |
+
"Looking to build your own custom <b>WordPress Social Login</b> extenstion or "
|
592 |
+
"component? Well, it's pretty easy. Just RTFM :)"
|
593 |
+
msgstr ""
|
594 |
+
|
595 |
+
#: includes/admin/components/components/wsl.components.help.gallery.php:74
|
596 |
+
msgid "WSL Developer API"
|
597 |
+
msgstr ""
|
598 |
+
|
599 |
+
#: includes/admin/components/components/wsl.components.help.gallery.php:75
|
600 |
+
msgid "WSL on Github"
|
601 |
+
msgstr ""
|
602 |
+
|
603 |
+
#: includes/admin/components/components/wsl.components.help.setup.php:29
|
604 |
+
#: includes/admin/components/components/wsl.components.help.setup.php:37
|
605 |
+
msgid "Component"
|
606 |
+
msgstr ""
|
607 |
+
|
608 |
+
#: includes/admin/components/components/wsl.components.help.setup.php:30
|
609 |
+
#: includes/admin/components/components/wsl.components.help.setup.php:38
|
610 |
+
msgid "Description"
|
611 |
+
msgstr ""
|
612 |
+
|
613 |
+
#: includes/admin/components/components/wsl.components.help.setup.php:67
|
614 |
+
msgid "View"
|
615 |
+
msgstr ""
|
616 |
+
|
617 |
+
#: includes/admin/components/components/wsl.components.help.setup.php:72
|
618 |
+
msgid "Disable"
|
619 |
+
msgstr ""
|
620 |
+
|
621 |
+
#: includes/admin/components/components/wsl.components.help.setup.php:74
|
622 |
+
msgid "Enable"
|
623 |
+
msgstr ""
|
624 |
+
|
625 |
+
#: includes/admin/components/contacts/index.php:39
|
626 |
+
msgid "Settings"
|
627 |
+
msgstr ""
|
628 |
+
|
629 |
+
#: includes/admin/components/contacts/index.php:43
|
630 |
+
msgid ""
|
631 |
+
"<b>WordPress Social Login</b> is now introducing <b>Contacts Import</b> as a "
|
632 |
+
"new feature. When enabled, users authenticating through WordPress Social "
|
633 |
+
"Login will be asked for the authorisation to import their contact list. Note "
|
634 |
+
"that some social networks do not provide certains of their users information "
|
635 |
+
"like contacts emails, photos and or profile urls"
|
636 |
+
msgstr ""
|
637 |
+
|
638 |
+
#: includes/admin/components/contacts/index.php:45
|
639 |
+
msgid "Enable contacts import for"
|
640 |
+
msgstr ""
|
641 |
+
|
642 |
+
#: includes/admin/components/contacts/index.php:52
|
643 |
+
#: includes/admin/components/contacts/index.php:59
|
644 |
+
#: includes/admin/components/contacts/index.php:66
|
645 |
+
#: includes/admin/components/contacts/index.php:73
|
646 |
+
#: includes/admin/components/contacts/index.php:80
|
647 |
+
#: includes/admin/components/diagnostics/index.php:62
|
648 |
+
msgid "Disabled"
|
649 |
+
msgstr ""
|
650 |
+
|
651 |
+
#: includes/admin/components/contacts/index.php:86
|
652 |
+
msgid "Notes"
|
653 |
+
msgstr ""
|
654 |
+
|
655 |
+
#: includes/admin/components/contacts/index.php:88
|
656 |
+
msgid ""
|
657 |
+
"To enable contacts import from these social network, you need first to "
|
658 |
+
"enabled them on the <a href=\"options-general.php?page=wordpress-social-"
|
659 |
+
"login&wslp=networks\"><b>Networks</b></a> tab and register the required "
|
660 |
+
"application"
|
661 |
+
msgstr ""
|
662 |
+
|
663 |
+
#: includes/admin/components/contacts/index.php:89
|
664 |
+
msgid ""
|
665 |
+
"<b>WSL</b> will try to import as much information about a user contacts as "
|
666 |
+
"he was able to pull from the social networks APIs."
|
667 |
+
msgstr ""
|
668 |
+
|
669 |
+
#: includes/admin/components/contacts/index.php:90
|
670 |
+
msgid ""
|
671 |
+
"All contacts data are sotred into your database on the table: "
|
672 |
+
"<code>`wsluserscontacts`</code>"
|
673 |
+
msgstr ""
|
674 |
+
|
675 |
+
#: includes/admin/components/contacts/index.php:107
|
676 |
+
msgid "Users contacts list preview"
|
677 |
+
msgstr ""
|
678 |
+
|
679 |
+
#: includes/admin/components/contacts/index.php:114
|
680 |
+
#, php-format
|
681 |
+
msgid "%s contact's list"
|
682 |
+
msgstr ""
|
683 |
+
|
684 |
+
#: includes/admin/components/contacts/index.php:121
|
685 |
+
#: includes/admin/components/contacts/index.php:130
|
686 |
+
#: includes/widgets/wsl.auth.widget.php:299
|
687 |
+
msgid "Provider"
|
688 |
+
msgstr ""
|
689 |
+
|
690 |
+
#: includes/admin/components/contacts/index.php:122
|
691 |
+
#: includes/admin/components/contacts/index.php:131
|
692 |
+
msgid "User"
|
693 |
+
msgstr ""
|
694 |
+
|
695 |
+
#: includes/admin/components/contacts/index.php:123
|
696 |
+
#: includes/admin/components/contacts/index.php:132
|
697 |
+
msgid "Contact Name"
|
698 |
+
msgstr ""
|
699 |
+
|
700 |
+
#: includes/admin/components/contacts/index.php:124
|
701 |
+
#: includes/admin/components/contacts/index.php:133
|
702 |
+
msgid "Contact Email"
|
703 |
+
msgstr ""
|
704 |
+
|
705 |
+
#: includes/admin/components/contacts/index.php:125
|
706 |
+
#: includes/admin/components/contacts/index.php:134
|
707 |
+
msgid "Contact Profile Url"
|
708 |
+
msgstr ""
|
709 |
+
|
710 |
+
#: includes/admin/components/contacts/index.php:150
|
711 |
+
msgid "No contacts found"
|
712 |
+
msgstr ""
|
713 |
+
|
714 |
+
#: includes/admin/components/diagnostics/index.php:24
|
715 |
+
msgid "Requirements test"
|
716 |
+
msgstr ""
|
717 |
+
|
718 |
+
#: includes/admin/components/diagnostics/index.php:27
|
719 |
+
msgid ""
|
720 |
+
"In order for <b>WordPress Social Login</b> to work properly, your server "
|
721 |
+
"should meet certain requirements. These \"requirements\" <br />and \"services"
|
722 |
+
"\" are usually offered by default by most \"modern\" web hosting providers, "
|
723 |
+
"however some complications may <br />occur with <b>shared hosting</b> and, "
|
724 |
+
"or <b>custom wordpress installations</b>"
|
725 |
+
msgstr ""
|
726 |
+
|
727 |
+
#: includes/admin/components/diagnostics/index.php:30
|
728 |
+
msgid "The minimum server requirements are"
|
729 |
+
msgstr ""
|
730 |
+
|
731 |
+
#: includes/admin/components/diagnostics/index.php:33
|
732 |
+
msgid "PHP >= 5.2.0 installed"
|
733 |
+
msgstr ""
|
734 |
+
|
735 |
+
#: includes/admin/components/diagnostics/index.php:34
|
736 |
+
msgid "WSL Endpoint URLs reachable"
|
737 |
+
msgstr ""
|
738 |
+
|
739 |
+
#: includes/admin/components/diagnostics/index.php:35
|
740 |
+
msgid "PHP's default SESSION handling"
|
741 |
+
msgstr ""
|
742 |
+
|
743 |
+
#: includes/admin/components/diagnostics/index.php:36
|
744 |
+
msgid "PHP/CURL/SSL Extension enabled"
|
745 |
+
msgstr ""
|
746 |
+
|
747 |
+
#: includes/admin/components/diagnostics/index.php:37
|
748 |
+
msgid "PHP/JSON Extension enabled"
|
749 |
+
msgstr ""
|
750 |
+
|
751 |
+
#: includes/admin/components/diagnostics/index.php:38
|
752 |
+
msgid "PHP/REGISTER_GLOBALS Off"
|
753 |
+
msgstr ""
|
754 |
+
|
755 |
+
#: includes/admin/components/diagnostics/index.php:39
|
756 |
+
msgid "jQuery installed on WordPress backoffice"
|
757 |
+
msgstr ""
|
758 |
+
|
759 |
+
#: includes/admin/components/diagnostics/index.php:42
|
760 |
+
msgid ""
|
761 |
+
"You can run the <b>WordPress Social Login Requirements Test</b> by clicking "
|
762 |
+
"the button bellow"
|
763 |
+
msgstr ""
|
764 |
+
|
765 |
+
#: includes/admin/components/diagnostics/index.php:46
|
766 |
+
msgid "Run the plugin requirements test"
|
767 |
+
msgstr ""
|
768 |
+
|
769 |
+
#: includes/admin/components/diagnostics/index.php:47
|
770 |
+
msgid "Website Information"
|
771 |
+
msgstr ""
|
772 |
+
|
773 |
+
#: includes/admin/components/diagnostics/index.php:53
|
774 |
+
msgid "Development mode"
|
775 |
+
msgstr ""
|
776 |
+
|
777 |
+
#: includes/admin/components/diagnostics/index.php:56
|
778 |
+
msgid ""
|
779 |
+
"By enabling the development mode, this plugin will try generate and display "
|
780 |
+
"a technical reports when something goes wrong. <br />This report can help "
|
781 |
+
"your figure out the root of any issues you may runs into, or you can also "
|
782 |
+
"send it to the plugin developer. <br />Its recommend to set the Development "
|
783 |
+
"mode to <b style=\"color:red\">Disabled</b> on production."
|
784 |
+
msgstr ""
|
785 |
+
|
786 |
+
#: includes/admin/components/help/index.php:25
|
787 |
+
msgid "Troubleshooting"
|
788 |
+
msgstr ""
|
789 |
+
|
790 |
+
#: includes/admin/components/help/index.php:27
|
791 |
+
msgid "WSL Diagnostics"
|
792 |
+
msgstr ""
|
793 |
+
|
794 |
+
#: includes/admin/components/help/index.php:29
|
795 |
+
msgid "System information"
|
796 |
+
msgstr ""
|
797 |
+
|
798 |
+
#: includes/admin/components/help/index.php:32
|
799 |
+
msgid ""
|
800 |
+
"If you run into any issue, you can access the <b>WordPress Social Login "
|
801 |
+
"Diagnostics</b> to check the <b>Plugin Requirements</b> or to enable the "
|
802 |
+
"<b>Development mode</b>"
|
803 |
+
msgstr ""
|
804 |
+
|
805 |
+
#: includes/admin/components/help/index.php:35
|
806 |
+
msgid ""
|
807 |
+
"Remember to include your System information when posting support requests"
|
808 |
+
msgstr ""
|
809 |
+
|
810 |
+
#: includes/admin/components/help/index.php:39
|
811 |
+
msgid "Documentation"
|
812 |
+
msgstr ""
|
813 |
+
|
814 |
+
#: includes/admin/components/help/index.php:41
|
815 |
+
msgid ""
|
816 |
+
"The complete <b>User Guide</b> can be found at\n"
|
817 |
+
"\t\t<a href=\"http://hybridauth.sourceforge.net/wsl/index.html\" target="
|
818 |
+
"\"_blank\">hybridauth.sourceforge.net/wsl/index.html</a>"
|
819 |
+
msgstr ""
|
820 |
+
|
821 |
+
#: includes/admin/components/help/index.php:47
|
822 |
+
msgid "FAQs"
|
823 |
+
msgstr ""
|
824 |
+
|
825 |
+
#: includes/admin/components/help/index.php:49
|
826 |
+
msgid ""
|
827 |
+
"A list of <b>Frequently asked questions</b> can be found at\n"
|
828 |
+
"\t\t<a href=\"http://hybridauth.sourceforge.net/wsl/faq.html\" target="
|
829 |
+
"\"_blank\">hybridauth.sourceforge.net/wsl/faq.html</a>"
|
830 |
+
msgstr ""
|
831 |
+
|
832 |
+
#: includes/admin/components/help/index.php:55
|
833 |
+
msgid "Support"
|
834 |
+
msgstr ""
|
835 |
+
|
836 |
+
#: includes/admin/components/help/index.php:57
|
837 |
+
msgid ""
|
838 |
+
"To get help and support refer to <a href=\"http://hybridauth.sourceforge.net/"
|
839 |
+
"wsl/support.html\" target=\"_blank\">http://hybridauth.sourceforge.net/wsl/"
|
840 |
+
"support.html</a>"
|
841 |
+
msgstr ""
|
842 |
+
|
843 |
+
#: includes/admin/components/help/index.php:62
|
844 |
+
msgid "Credits"
|
845 |
+
msgstr ""
|
846 |
+
|
847 |
+
#: includes/admin/components/help/index.php:64
|
848 |
+
msgid ""
|
849 |
+
"WordPress Social Login was created by <a href=\"http://profiles.wordpress."
|
850 |
+
"org/miled/\" target=\"_blank\">Mohamed Mrassi</a> (a.k.a Miled) and <a href="
|
851 |
+
"\"https://github.com/hybridauth/WordPress-Social-Login/graphs/contributors\" "
|
852 |
+
"target=\"_blank\">contributors</a>"
|
853 |
+
msgstr ""
|
854 |
+
|
855 |
+
#: includes/admin/components/help/index.php:65
|
856 |
+
msgid ""
|
857 |
+
"Many other people have also contributed with <br />constructive discussions, "
|
858 |
+
"support and by submitting patches"
|
859 |
+
msgstr ""
|
860 |
+
|
861 |
+
#: includes/admin/components/help/index.php:70
|
862 |
+
msgid "License"
|
863 |
+
msgstr ""
|
864 |
+
|
865 |
+
#: includes/admin/components/help/index.php:72
|
866 |
+
msgid ""
|
867 |
+
"<b>WordPress Social Login</b> is an open source software licenced under The "
|
868 |
+
"MIT License (MIT)"
|
869 |
+
msgstr ""
|
870 |
+
|
871 |
+
#: includes/admin/components/login-widget/wsl.components.loginwidget.setup.php:27
|
872 |
+
msgid "Basic Settings"
|
873 |
+
msgstr ""
|
874 |
+
|
875 |
+
#: includes/admin/components/login-widget/wsl.components.loginwidget.setup.php:32
|
876 |
+
msgid "Connect with caption"
|
877 |
+
msgstr ""
|
878 |
+
|
879 |
+
#: includes/admin/components/login-widget/wsl.components.loginwidget.setup.php:38
|
880 |
+
msgid "Social icon set"
|
881 |
+
msgstr ""
|
882 |
+
|
883 |
+
#: includes/admin/components/login-widget/wsl.components.loginwidget.setup.php:41
|
884 |
+
msgid "WPZOOM social networking icon set"
|
885 |
+
msgstr ""
|
886 |
+
|
887 |
+
#: includes/admin/components/login-widget/wsl.components.loginwidget.setup.php:42
|
888 |
+
msgid "Icondock vector social media icons"
|
889 |
+
msgstr ""
|
890 |
+
|
891 |
+
#: includes/admin/components/login-widget/wsl.components.loginwidget.setup.php:47
|
892 |
+
msgid "Users avatars"
|
893 |
+
msgstr ""
|
894 |
+
|
895 |
+
#: includes/admin/components/login-widget/wsl.components.loginwidget.setup.php:50
|
896 |
+
msgid "Display the default users avatars"
|
897 |
+
msgstr ""
|
898 |
+
|
899 |
+
#: includes/admin/components/login-widget/wsl.components.loginwidget.setup.php:51
|
900 |
+
msgid "Display users avatars from social networks when available"
|
901 |
+
msgstr ""
|
902 |
+
|
903 |
+
#: includes/admin/components/login-widget/wsl.components.loginwidget.setup.php:67
|
904 |
+
msgid "Redirect URL"
|
905 |
+
msgstr ""
|
906 |
+
|
907 |
+
#: includes/admin/components/login-widget/wsl.components.loginwidget.setup.php:73
|
908 |
+
msgid "Authentication flow"
|
909 |
+
msgstr ""
|
910 |
+
|
911 |
+
#: includes/admin/components/login-widget/wsl.components.loginwidget.setup.php:76
|
912 |
+
msgid "Using popup window"
|
913 |
+
msgstr ""
|
914 |
+
|
915 |
+
#: includes/admin/components/login-widget/wsl.components.loginwidget.setup.php:77
|
916 |
+
msgid "No popup window"
|
917 |
+
msgstr ""
|
918 |
+
|
919 |
+
#: includes/admin/components/login-widget/wsl.components.loginwidget.setup.php:82
|
920 |
+
msgid "Widget display"
|
921 |
+
msgstr ""
|
922 |
+
|
923 |
+
#: includes/admin/components/login-widget/wsl.components.loginwidget.setup.php:85
|
924 |
+
msgid "Display the widget in the comments area, login and register forms"
|
925 |
+
msgstr ""
|
926 |
+
|
927 |
+
#: includes/admin/components/login-widget/wsl.components.loginwidget.setup.php:86
|
928 |
+
msgid "Display the widget ONLY in the comments area"
|
929 |
+
msgstr ""
|
930 |
+
|
931 |
+
#: includes/admin/components/login-widget/wsl.components.loginwidget.setup.php:87
|
932 |
+
msgid "Display the widget ONLY in the login form"
|
933 |
+
msgstr ""
|
934 |
+
|
935 |
+
#: includes/admin/components/login-widget/wsl.components.loginwidget.setup.php:92
|
936 |
+
msgid "Notification"
|
937 |
+
msgstr ""
|
938 |
+
|
939 |
+
#: includes/admin/components/login-widget/wsl.components.loginwidget.setup.php:95
|
940 |
+
msgid "No notification"
|
941 |
+
msgstr ""
|
942 |
+
|
943 |
+
#: includes/admin/components/login-widget/wsl.components.loginwidget.setup.php:96
|
944 |
+
msgid "Notify ONLY the blog admin of a new user"
|
945 |
+
msgstr ""
|
946 |
+
|
947 |
+
#: includes/admin/components/login-widget/wsl.components.loginwidget.setup.php:107
|
948 |
+
msgid "Custom CSS"
|
949 |
+
msgstr ""
|
950 |
+
|
951 |
+
#: includes/admin/components/login-widget/wsl.components.loginwidget.setup.php:112
|
952 |
+
msgid "Widget CSS"
|
953 |
+
msgstr ""
|
954 |
+
|
955 |
+
#: includes/admin/components/login-widget/wsl.components.loginwidget.setup.php:114
|
956 |
+
msgid ""
|
957 |
+
"To customize the default widget styles you can either: edit the css file "
|
958 |
+
"<strong>/wordpress-social-login/assets/css/style.css</strong>, or change it "
|
959 |
+
"from this text area"
|
960 |
+
msgstr ""
|
961 |
+
|
962 |
+
#: includes/admin/components/login-widget/wsl.components.loginwidget.setup.php:118
|
963 |
+
msgid "The basic widget markup is the following"
|
964 |
+
msgstr ""
|
965 |
+
|
966 |
+
#: includes/admin/components/login-widget/wsl.components.loginwidget.sidebar.php:30
|
967 |
+
msgid "Widget Customization"
|
968 |
+
msgstr ""
|
969 |
+
|
970 |
+
#: includes/admin/components/login-widget/wsl.components.loginwidget.sidebar.php:33
|
971 |
+
msgid ""
|
972 |
+
"On this section you can fully customize <b>WordPress Social Login Widget</b> "
|
973 |
+
"and define the way you want it to look and behave"
|
974 |
+
msgstr ""
|
975 |
+
|
976 |
+
#: includes/admin/components/login-widget/wsl.components.loginwidget.sidebar.php:37
|
977 |
+
msgid ""
|
978 |
+
"<b>WordPress Social Login Widget</b> will be generated into the comments, "
|
979 |
+
"login and register forms enabling your website vistors and customers to "
|
980 |
+
"login via social networks"
|
981 |
+
msgstr ""
|
982 |
+
|
983 |
+
#: includes/admin/components/login-widget/wsl.components.loginwidget.sidebar.php:41
|
984 |
+
msgid ""
|
985 |
+
"If this widget does not show up on your custom theme or you want to add it "
|
986 |
+
"somewhere else then refer to the next section"
|
987 |
+
msgstr ""
|
988 |
+
|
989 |
+
#: includes/admin/components/login-widget/wsl.components.loginwidget.sidebar.php:44
|
990 |
+
msgid "Custom integration"
|
991 |
+
msgstr ""
|
992 |
+
|
993 |
+
#: includes/admin/components/login-widget/wsl.components.loginwidget.sidebar.php:47
|
994 |
+
msgid ""
|
995 |
+
"If you want to add the social login widget to another location in your "
|
996 |
+
"theme, you can insert the following code in that location"
|
997 |
+
msgstr ""
|
998 |
+
|
999 |
+
#: includes/admin/components/login-widget/wsl.components.loginwidget.sidebar.php:49
|
1000 |
+
msgid "Or, for posts and pages"
|
1001 |
+
msgstr ""
|
1002 |
+
|
1003 |
+
#: includes/admin/components/login-widget/wsl.components.loginwidget.sidebar.php:54
|
1004 |
+
msgid ""
|
1005 |
+
"<b>[wordpress_social_login]</b> shortcode can be used in combination with <a "
|
1006 |
+
"href=\"http://wordpress.org/extend/plugins/html-javascript-adder/\" target="
|
1007 |
+
"\"_blank\">HTML Javascript Adder</a> plugin to be add WSL Widget to your "
|
1008 |
+
"website sidebar"
|
1009 |
+
msgstr ""
|
1010 |
+
|
1011 |
+
#: includes/admin/components/login-widget/wsl.components.loginwidget.sidebar.php:58
|
1012 |
+
msgid ""
|
1013 |
+
"Also, if you are a developer or designer then you can customize it to your "
|
1014 |
+
"heart's content. For more inofmation refer to <b><a href=\"http://hybridauth."
|
1015 |
+
"sourceforge.net/wsl/customize.html\" target=\"_blank\">User Guide</a></b>"
|
1016 |
+
msgstr ""
|
1017 |
+
|
1018 |
+
#: includes/admin/components/login-widget/wsl.components.loginwidget.sidebar.php:61
|
1019 |
+
msgid "Widget preview"
|
1020 |
+
msgstr ""
|
1021 |
+
|
1022 |
+
#: includes/admin/components/login-widget/wsl.components.loginwidget.sidebar.php:64
|
1023 |
+
msgid "This is a preview of what should be on the comments area"
|
1024 |
+
msgstr ""
|
1025 |
+
|
1026 |
+
#: includes/admin/components/login-widget/wsl.components.loginwidget.sidebar.php:65
|
1027 |
+
msgid "Do not test it here"
|
1028 |
+
msgstr ""
|
1029 |
+
|
1030 |
+
#: includes/admin/components/networks/wsl.components.networks.addmore.php:24
|
1031 |
+
msgid ""
|
1032 |
+
"And you could add even more of them, <b>Just Click</b> and we will guide you "
|
1033 |
+
"through"
|
1034 |
+
msgstr ""
|
1035 |
+
|
1036 |
+
#: includes/admin/components/networks/wsl.components.networks.addmore.php:48
|
1037 |
+
msgid "Well! none left."
|
1038 |
+
msgstr ""
|
1039 |
+
|
1040 |
+
#: includes/admin/components/networks/wsl.components.networks.basicinsights.php:36
|
1041 |
+
msgid "Insights"
|
1042 |
+
msgstr ""
|
1043 |
+
|
1044 |
+
#: includes/admin/components/networks/wsl.components.networks.basicinsights.php:40
|
1045 |
+
#: includes/admin/components/networks/wsl.components.networks.basicinsights.php:49
|
1046 |
+
msgid "Conversions"
|
1047 |
+
msgstr ""
|
1048 |
+
|
1049 |
+
#: includes/admin/components/networks/wsl.components.networks.basicinsights.php:43
|
1050 |
+
msgid "WP users"
|
1051 |
+
msgstr ""
|
1052 |
+
|
1053 |
+
#: includes/admin/components/networks/wsl.components.networks.basicinsights.php:46
|
1054 |
+
#: includes/admin/components/networks/wsl.components.networks.basicinsights.php:77
|
1055 |
+
msgid "WSL users"
|
1056 |
+
msgstr ""
|
1057 |
+
|
1058 |
+
#: includes/admin/components/networks/wsl.components.networks.basicinsights.php:59
|
1059 |
+
msgid "By provider"
|
1060 |
+
msgstr ""
|
1061 |
+
|
1062 |
+
#: includes/admin/components/networks/wsl.components.networks.basicinsights.php:85
|
1063 |
+
msgid "By gender"
|
1064 |
+
msgstr ""
|
1065 |
+
|
1066 |
+
#: includes/admin/components/networks/wsl.components.networks.basicinsights.php:108
|
1067 |
+
msgid "By age"
|
1068 |
+
msgstr ""
|
1069 |
+
|
1070 |
+
#: includes/admin/components/networks/wsl.components.networks.basicinsights.php:139
|
1071 |
+
msgid "yrs in average"
|
1072 |
+
msgstr ""
|
1073 |
+
|
1074 |
+
#: includes/admin/components/networks/wsl.components.networks.setup.php:126
|
1075 |
+
msgid "Application ID"
|
1076 |
+
msgstr ""
|
1077 |
+
|
1078 |
+
#: includes/admin/components/networks/wsl.components.networks.setup.php:128
|
1079 |
+
#: includes/admin/components/networks/wsl.components.networks.setup.php:134
|
1080 |
+
#: includes/admin/components/networks/wsl.components.networks.setup.php:140
|
1081 |
+
msgid "Where do I get this info?"
|
1082 |
+
msgstr "Woher bekomme ich diese Info?"
|
1083 |
+
|
1084 |
+
#: includes/admin/components/networks/wsl.components.networks.setup.php:132
|
1085 |
+
msgid "Application Key"
|
1086 |
+
msgstr ""
|
1087 |
+
|
1088 |
+
#: includes/admin/components/networks/wsl.components.networks.setup.php:138
|
1089 |
+
msgid "Application Secret"
|
1090 |
+
msgstr ""
|
1091 |
+
|
1092 |
+
#: includes/admin/components/networks/wsl.components.networks.setup.php:149
|
1093 |
+
msgid "Note"
|
1094 |
+
msgstr ""
|
1095 |
+
|
1096 |
+
#: includes/admin/components/networks/wsl.components.networks.setup.php:151
|
1097 |
+
#, php-format
|
1098 |
+
msgid ""
|
1099 |
+
"<b>%s</b> do not provide their user's email address and by default a random "
|
1100 |
+
"email will then be generated for them instead"
|
1101 |
+
msgstr ""
|
1102 |
+
|
1103 |
+
#: includes/admin/components/networks/wsl.components.networks.setup.php:153
|
1104 |
+
msgid ""
|
1105 |
+
"To change this behaviour and to force new registered users to provide their "
|
1106 |
+
"emails before they get in, goto <b><a href=\"options-general.php?"
|
1107 |
+
"page=wordpress-social-login&wslp=bouncer\">Bouncer</a></b> and enable "
|
1108 |
+
"<b>Profile Completion</b>"
|
1109 |
+
msgstr ""
|
1110 |
+
|
1111 |
+
#: includes/admin/components/networks/wsl.components.networks.setup.php:163
|
1112 |
+
msgid ""
|
1113 |
+
"<span style=\"color:#CB4B16;\">Application</span> id and secret (also "
|
1114 |
+
"sometimes referred as <span style=\"color:#CB4B16;\">Customer</span> key and "
|
1115 |
+
"secret or <span style=\"color:#CB4B16;\">Client</span> id and secret) are "
|
1116 |
+
"what we call an application credentials"
|
1117 |
+
msgstr ""
|
1118 |
+
|
1119 |
+
#: includes/admin/components/networks/wsl.components.networks.setup.php:165
|
1120 |
+
#, php-format
|
1121 |
+
msgid ""
|
1122 |
+
"This application will link your website <code>%s</code> to <code>%s API</"
|
1123 |
+
"code> and these credentials are needed in order for <b>%s</b> users to "
|
1124 |
+
"access your website"
|
1125 |
+
msgstr ""
|
1126 |
+
|
1127 |
+
#: includes/admin/components/networks/wsl.components.networks.setup.php:168
|
1128 |
+
msgid ""
|
1129 |
+
"These credentials may also differ in format, name and content depending on "
|
1130 |
+
"the social network."
|
1131 |
+
msgstr ""
|
1132 |
+
|
1133 |
+
#: includes/admin/components/networks/wsl.components.networks.setup.php:172
|
1134 |
+
#, php-format
|
1135 |
+
msgid ""
|
1136 |
+
"To enable authentication with this provider and to register a new <b>%s API "
|
1137 |
+
"Application</b>, carefully follow the steps"
|
1138 |
+
msgstr ""
|
1139 |
+
|
1140 |
+
#: includes/admin/components/networks/wsl.components.networks.setup.php:175
|
1141 |
+
#, php-format
|
1142 |
+
msgid "<b>Done.</b> Nothing more required for <b>%s</b>"
|
1143 |
+
msgstr ""
|
1144 |
+
"<b>Fertig.</b> Du musst keine weiteren Schritte für die Aktivierung bei <b>"
|
1145 |
+
"%s</b> machen"
|
1146 |
+
|
1147 |
+
#: includes/admin/components/networks/wsl.components.networks.setup.php:259
|
1148 |
+
msgid "And that's it!"
|
1149 |
+
msgstr "Und das war's!"
|
1150 |
+
|
1151 |
+
#: includes/admin/components/networks/wsl.components.networks.setup.php:261
|
1152 |
+
#, php-format
|
1153 |
+
msgid ""
|
1154 |
+
"If for some reason you still can't figure it out, first try to a) <a class="
|
1155 |
+
"\"button-primary\" href=\"https://www.google.com/search?q=%s API create "
|
1156 |
+
"application\" target=\"_blank\">Google it</a>, then check it on b) <a class="
|
1157 |
+
"\"button-primary\" href=\"http://www.youtube.com/results?search_query=%s API "
|
1158 |
+
"create application \" target=\"_blank\">Youtube</a> and if nothing works c) "
|
1159 |
+
"<a class=\"button-primary\" href=\"options-general.php?page=wordpress-social-"
|
1160 |
+
"login&wslp=help\">ask for support</a>"
|
1161 |
+
msgstr ""
|
1162 |
+
|
1163 |
+
#: includes/admin/components/networks/wsl.components.networks.whyhello.php:21
|
1164 |
+
msgid "Why, hello there"
|
1165 |
+
msgstr ""
|
1166 |
+
|
1167 |
+
#: includes/admin/components/networks/wsl.components.networks.whyhello.php:29
|
1168 |
+
msgid ""
|
1169 |
+
"If you are still new to things, we recommend that you read the <b><a href="
|
1170 |
+
"\"http://hybridauth.sourceforge.net/wsl/index.html\" target=\"_blank"
|
1171 |
+
"\">Plugin User Guide</a></b> and to make sure your server settings meet this "
|
1172 |
+
"<b><a href=\"options-general.php?page=wordpress-social-login&"
|
1173 |
+
"wslp=diagnostics\">Plugin Requirements</a></b>"
|
1174 |
+
msgstr ""
|
1175 |
+
|
1176 |
+
#: includes/admin/components/networks/wsl.components.networks.whyhello.php:32
|
1177 |
+
msgid ""
|
1178 |
+
"If you run into any issue then refer to <b><a href=\"options-general.php?"
|
1179 |
+
"page=wordpress-social-login&wslp=help\">Help & Support</a></b> to konw how "
|
1180 |
+
"to reach me"
|
1181 |
+
msgstr ""
|
1182 |
+
|
1183 |
+
#: includes/admin/components/users/wsl.components.users.list.php:30
|
1184 |
+
#: includes/admin/components/users/wsl.components.users.list.php:41
|
1185 |
+
msgid "Providers"
|
1186 |
+
msgstr ""
|
1187 |
+
|
1188 |
+
#: includes/admin/components/users/wsl.components.users.list.php:31
|
1189 |
+
#: includes/admin/components/users/wsl.components.users.list.php:42
|
1190 |
+
#: includes/settings/wsl.compatibilities.php:104
|
1191 |
+
msgid "Username"
|
1192 |
+
msgstr ""
|
1193 |
+
|
1194 |
+
#: includes/admin/components/users/wsl.components.users.list.php:32
|
1195 |
+
#: includes/admin/components/users/wsl.components.users.list.php:43
|
1196 |
+
msgid "Full Name"
|
1197 |
+
msgstr ""
|
1198 |
+
|
1199 |
+
#: includes/admin/components/users/wsl.components.users.list.php:33
|
1200 |
+
#: includes/admin/components/users/wsl.components.users.list.php:44
|
1201 |
+
#: includes/settings/wsl.compatibilities.php:100
|
1202 |
+
msgid "E-mail"
|
1203 |
+
msgstr ""
|
1204 |
+
|
1205 |
+
#: includes/admin/components/users/wsl.components.users.list.php:34
|
1206 |
+
#: includes/admin/components/users/wsl.components.users.list.php:45
|
1207 |
+
msgid "Profile URL"
|
1208 |
+
msgstr ""
|
1209 |
+
|
1210 |
+
#: includes/admin/components/users/wsl.components.users.list.php:35
|
1211 |
+
#: includes/admin/components/users/wsl.components.users.list.php:46
|
1212 |
+
#: includes/settings/wsl.initialization.php:400
|
1213 |
+
msgid "Contacts"
|
1214 |
+
msgstr ""
|
1215 |
+
|
1216 |
+
#: includes/admin/components/users/wsl.components.users.list.php:36
|
1217 |
+
#: includes/admin/components/users/wsl.components.users.list.php:47
|
1218 |
+
msgid "Actions"
|
1219 |
+
msgstr ""
|
1220 |
+
|
1221 |
+
#: includes/admin/components/users/wsl.components.users.list.php:55
|
1222 |
+
msgid "No users found"
|
1223 |
+
msgstr ""
|
1224 |
+
|
1225 |
+
#: includes/admin/components/users/wsl.components.users.profile.php:22
|
1226 |
+
msgid "USER DOES NOT EXIST!"
|
1227 |
+
msgstr ""
|
1228 |
+
|
1229 |
+
#: includes/admin/components/users/wsl.components.users.profile.php:43
|
1230 |
+
msgid "User Profile"
|
1231 |
+
msgstr ""
|
1232 |
+
|
1233 |
+
#: includes/admin/components/users/wsl.components.users.profile.php:43
|
1234 |
+
#, php-format
|
1235 |
+
msgid "as provided by %s"
|
1236 |
+
msgstr ""
|
1237 |
+
|
1238 |
+
#: includes/services/wsl.authentication.php:64
|
1239 |
+
msgid "Bouncer say don't be silly!"
|
1240 |
+
msgstr ""
|
1241 |
+
|
1242 |
+
#: includes/services/wsl.authentication.php:70
|
1243 |
+
msgid "Bouncer say this makes no sense."
|
1244 |
+
msgstr ""
|
1245 |
+
|
1246 |
+
#: includes/services/wsl.authentication.php:77
|
1247 |
+
msgid "WSL is disabled!"
|
1248 |
+
msgstr ""
|
1249 |
+
|
1250 |
+
#: includes/services/wsl.authentication.php:99
|
1251 |
+
msgid "Bouncer says this makes no sense."
|
1252 |
+
msgstr ""
|
1253 |
+
|
1254 |
+
#: includes/services/wsl.authentication.php:107
|
1255 |
+
msgid "Bouncer say you are doin it wrong."
|
1256 |
+
msgstr ""
|
1257 |
+
|
1258 |
+
#: includes/services/wsl.authentication.php:114
|
1259 |
+
msgid "You are already logged in as <b>%</b>."
|
1260 |
+
msgstr ""
|
1261 |
+
|
1262 |
+
#: includes/services/wsl.authentication.php:119
|
1263 |
+
#: includes/services/wsl.authentication.php:559
|
1264 |
+
msgid ""
|
1265 |
+
"Error: Another plugin seems to be using HybridAuth Library and made "
|
1266 |
+
"WordPress Social Login unusable. We recommand to find this plugin and to "
|
1267 |
+
"kill it with fire!"
|
1268 |
+
msgstr ""
|
1269 |
+
|
1270 |
+
#: includes/services/wsl.authentication.php:130
|
1271 |
+
msgid "Unknown or disabled provider"
|
1272 |
+
msgstr ""
|
1273 |
+
|
1274 |
+
#: includes/services/wsl.authentication.php:262
|
1275 |
+
msgid "Unspecified error!"
|
1276 |
+
msgstr ""
|
1277 |
+
|
1278 |
+
#: includes/services/wsl.authentication.php:266
|
1279 |
+
msgid "Unspecified error."
|
1280 |
+
msgstr ""
|
1281 |
+
|
1282 |
+
#: includes/services/wsl.authentication.php:267
|
1283 |
+
msgid "Hybriauth configuration error."
|
1284 |
+
msgstr ""
|
1285 |
+
|
1286 |
+
#: includes/services/wsl.authentication.php:268
|
1287 |
+
msgid "Provider not properly configured."
|
1288 |
+
msgstr ""
|
1289 |
+
|
1290 |
+
#: includes/services/wsl.authentication.php:269
|
1291 |
+
msgid "Unknown or disabled provider."
|
1292 |
+
msgstr ""
|
1293 |
+
|
1294 |
+
#: includes/services/wsl.authentication.php:270
|
1295 |
+
msgid "Missing provider application credentials."
|
1296 |
+
msgstr ""
|
1297 |
+
|
1298 |
+
#: includes/services/wsl.authentication.php:271
|
1299 |
+
#, php-format
|
1300 |
+
msgid ""
|
1301 |
+
"<b>What does this error mean ?</b><br />Most likely, you didn't setup the "
|
1302 |
+
"correct application credentials for this provider. These credentials are "
|
1303 |
+
"required in order for <b>%s</b> users to access your website and for "
|
1304 |
+
"WordPress Social Login to work."
|
1305 |
+
msgstr ""
|
1306 |
+
|
1307 |
+
#: includes/services/wsl.authentication.php:271
|
1308 |
+
msgid ""
|
1309 |
+
"<br />Instructions for use can be found in the <a href=\"http://hybridauth."
|
1310 |
+
"sourceforge.net/wsl/configure.html\" target=\"_blank\">User Manual</a>."
|
1311 |
+
msgstr ""
|
1312 |
+
|
1313 |
+
#: includes/services/wsl.authentication.php:273
|
1314 |
+
msgid ""
|
1315 |
+
"Authentification failed. The user has canceled the authentication or the "
|
1316 |
+
"provider refused the connection."
|
1317 |
+
msgstr ""
|
1318 |
+
|
1319 |
+
#: includes/services/wsl.authentication.php:274
|
1320 |
+
msgid ""
|
1321 |
+
"User profile request failed. Most likely the user is not connected to the "
|
1322 |
+
"provider and he should to authenticate again."
|
1323 |
+
msgstr ""
|
1324 |
+
|
1325 |
+
#: includes/services/wsl.authentication.php:277
|
1326 |
+
msgid "User not connected to the provider."
|
1327 |
+
msgstr ""
|
1328 |
+
|
1329 |
+
#: includes/services/wsl.authentication.php:280
|
1330 |
+
msgid "Provider does not support this feature."
|
1331 |
+
msgstr ""
|
1332 |
+
|
1333 |
+
#: includes/services/wsl.authentication.php:323
|
1334 |
+
msgid "Something bad happen!"
|
1335 |
+
msgstr ""
|
1336 |
+
|
1337 |
+
#: includes/services/wsl.authentication.php:389
|
1338 |
+
msgid ""
|
1339 |
+
"Note: This message can be disabled from the plugin settings by setting "
|
1340 |
+
"<b>Development mode</b> to <b>Disabled</b>"
|
1341 |
+
msgstr ""
|
1342 |
+
|
1343 |
+
#: includes/services/wsl.authentication.php:418
|
1344 |
+
msgid "Redirecting..."
|
1345 |
+
msgstr ""
|
1346 |
+
|
1347 |
+
#: includes/services/wsl.authentication.php:447
|
1348 |
+
#, php-format
|
1349 |
+
msgid "Contacting <b>%s</b>, please wait..."
|
1350 |
+
msgstr ""
|
1351 |
+
|
1352 |
+
#: includes/services/wsl.authentication.php:711
|
1353 |
+
msgid "registration is now closed!"
|
1354 |
+
msgstr ""
|
1355 |
+
|
1356 |
+
#: includes/services/wsl.authentication.php:733
|
1357 |
+
#, php-format
|
1358 |
+
msgid "Unspecified error. #%d"
|
1359 |
+
msgstr ""
|
1360 |
+
|
1361 |
+
#: includes/services/wsl.authentication.php:882
|
1362 |
+
msgid "An error occurred while creating a new user!"
|
1363 |
+
msgstr ""
|
1364 |
+
|
1365 |
+
#: includes/settings/wsl.compatibilities.php:92
|
1366 |
+
msgid "Almost there, we just need to check a couple of things"
|
1367 |
+
msgstr ""
|
1368 |
+
|
1369 |
+
#: includes/settings/wsl.compatibilities.php:96
|
1370 |
+
msgid "Continue"
|
1371 |
+
msgstr ""
|
1372 |
+
|
1373 |
+
#: includes/settings/wsl.compatibilities.php:108
|
1374 |
+
msgid "E-mail is not valid!"
|
1375 |
+
msgstr ""
|
1376 |
+
|
1377 |
+
#: includes/settings/wsl.compatibilities.php:112
|
1378 |
+
msgid "Username is not valid!"
|
1379 |
+
msgstr ""
|
1380 |
+
|
1381 |
+
#: includes/settings/wsl.compatibilities.php:116
|
1382 |
+
msgid "That E-mail is already registered!"
|
1383 |
+
msgstr ""
|
1384 |
+
|
1385 |
+
#: includes/settings/wsl.compatibilities.php:120
|
1386 |
+
msgid "That Username is already registered!"
|
1387 |
+
msgstr ""
|
1388 |
+
|
1389 |
+
#: includes/settings/wsl.compatibilities.php:124
|
1390 |
+
msgid "You are now connected via"
|
1391 |
+
msgstr ""
|
1392 |
+
|
1393 |
+
#: includes/settings/wsl.compatibilities.php:140
|
1394 |
+
msgid "Bouncer says no."
|
1395 |
+
msgstr ""
|
1396 |
+
|
1397 |
+
#: includes/settings/wsl.compatibilities.php:148
|
1398 |
+
msgid "Bouncer say he refuses."
|
1399 |
+
msgstr ""
|
1400 |
+
|
1401 |
+
#: includes/settings/wsl.compatibilities.php:156
|
1402 |
+
msgid "Bouncer say only Mundo can go where he pleases!"
|
1403 |
+
msgstr ""
|
1404 |
+
|
1405 |
+
#: includes/settings/wsl.initialization.php:59
|
1406 |
+
#: includes/settings/wsl.initialization.php:87
|
1407 |
+
msgid ""
|
1408 |
+
"An installed plugin is trying to o-ver-write WordPress Social Login config "
|
1409 |
+
"in a bad way."
|
1410 |
+
msgstr ""
|
1411 |
+
|
1412 |
+
#: includes/settings/wsl.initialization.php:373
|
1413 |
+
msgid "WSL user profile"
|
1414 |
+
msgstr ""
|
1415 |
+
|
1416 |
+
#: includes/settings/wsl.initialization.php:374
|
1417 |
+
msgid "WSL user contacts"
|
1418 |
+
msgstr ""
|
1419 |
+
|
1420 |
+
#: includes/settings/wsl.initialization.php:400
|
1421 |
+
msgid "Profile"
|
1422 |
+
msgstr ""
|
1423 |
+
|
1424 |
+
#: includes/widgets/wsl.auth.widget.php:124
|
1425 |
+
msgid ""
|
1426 |
+
"<strong style=\"color:red;\">WordPress Social Login is not configured yet!</"
|
1427 |
+
"strong><br />Please visit the <strong>Settings\\ WP Social Login</strong> "
|
1428 |
+
"administration page to configure this plugin.<br />For more information "
|
1429 |
+
"please refer to the plugin <a href=\"http://hybridauth.sourceforge.net/"
|
1430 |
+
"userguide/Plugin_WordPress_Social_Login.html\">online user guide</a> or "
|
1431 |
+
"contact us at <a href=\"http://hybridauth.sourceforge.net/\">hybridauth."
|
1432 |
+
"sourceforge.net</a>"
|
1433 |
+
msgstr ""
|
1434 |
+
|
1435 |
+
#: includes/widgets/wsl.auth.widget.php:293
|
1436 |
+
msgid "Social networks"
|
1437 |
+
msgstr ""
|
1438 |
+
|
1439 |
+
#: includes/widgets/wsl.auth.widget.php:300
|
1440 |
+
msgid "Identity"
|
1441 |
+
msgstr ""
|
1442 |
+
|
1443 |
+
#: includes/widgets/wsl.auth.widget.php:336
|
1444 |
+
msgid "Add more identities"
|
1445 |
+
msgstr ""
|
1446 |
+
|
1447 |
+
#: includes/widgets/wsl.auth.widget.php:375
|
1448 |
+
msgid "Currently connected to:"
|
1449 |
+
msgstr ""
|
languages/wordpress-social-login-es_ES.mo
ADDED
Binary file
|
languages/wordpress-social-login-es_ES.po
ADDED
@@ -0,0 +1,1446 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
msgid ""
|
2 |
+
msgstr ""
|
3 |
+
"Project-Id-Version: WordPress Social Login\n"
|
4 |
+
"POT-Creation-Date: 2013-02-16 06:40+0100\n"
|
5 |
+
"PO-Revision-Date: 2013-02-16 06:41+0100\n"
|
6 |
+
"Last-Translator: Miled <hybridauth@gmail.com>\n"
|
7 |
+
"Language-Team: WordPress Social Login <hybridauth@gmail.com>\n"
|
8 |
+
"Language: Español - España (es_ES)\n"
|
9 |
+
"MIME-Version: 1.0\n"
|
10 |
+
"Content-Type: text/plain; charset=UTF-8\n"
|
11 |
+
"Content-Transfer-Encoding: 8bit\n"
|
12 |
+
"X-Generator: Poedit 1.5.5\n"
|
13 |
+
|
14 |
+
#: includes/admin/wsl.admin.ui.php:332
|
15 |
+
msgid "Development mode is enabled!"
|
16 |
+
msgstr ""
|
17 |
+
|
18 |
+
#: includes/admin/wsl.admin.ui.php:407
|
19 |
+
#: includes/services/wsl.authentication.php:637
|
20 |
+
msgid "Something wrong!"
|
21 |
+
msgstr ""
|
22 |
+
|
23 |
+
#: includes/admin/wsl.admin.ui.php:412
|
24 |
+
msgid ""
|
25 |
+
"Unknown or Disabled <b>Component</b>! Check the list of enabled components "
|
26 |
+
"or the typed URL"
|
27 |
+
msgstr ""
|
28 |
+
|
29 |
+
#: includes/admin/wsl.admin.ui.php:416
|
30 |
+
msgid ""
|
31 |
+
"If you believe you've found a problem with <b>WordPress Social Login</b>, be "
|
32 |
+
"sure to let us know so we can fix it"
|
33 |
+
msgstr ""
|
34 |
+
|
35 |
+
#: includes/admin/wsl.admin.ui.php:422
|
36 |
+
msgid "Report as bug"
|
37 |
+
msgstr ""
|
38 |
+
|
39 |
+
#: includes/admin/wsl.admin.ui.php:423
|
40 |
+
msgid "Check enabled components"
|
41 |
+
msgstr ""
|
42 |
+
|
43 |
+
#: includes/admin/wsl.admin.ui.php:567
|
44 |
+
msgid "Welcome!"
|
45 |
+
msgstr ""
|
46 |
+
|
47 |
+
#: includes/admin/wsl.admin.ui.php:569
|
48 |
+
msgid ""
|
49 |
+
"If you are still new to WordPress Social Login, we have provided a few "
|
50 |
+
"walkthroughs to get you started"
|
51 |
+
msgstr ""
|
52 |
+
|
53 |
+
#: includes/admin/wsl.admin.ui.php:576
|
54 |
+
msgid "Get Started"
|
55 |
+
msgstr ""
|
56 |
+
|
57 |
+
#: includes/admin/wsl.admin.ui.php:579
|
58 |
+
msgid ""
|
59 |
+
"<a href=\"http://hybridauth.sourceforge.net/wsl/configure.html\" target="
|
60 |
+
"\"_blank\">Setup and Configuration</a>"
|
61 |
+
msgstr ""
|
62 |
+
|
63 |
+
#: includes/admin/wsl.admin.ui.php:580
|
64 |
+
msgid ""
|
65 |
+
"<a href=\"http://hybridauth.sourceforge.net/wsl/customize.html\" target="
|
66 |
+
"\"_blank\">Customize WSL Widgets</a>"
|
67 |
+
msgstr ""
|
68 |
+
|
69 |
+
#: includes/admin/wsl.admin.ui.php:581
|
70 |
+
msgid ""
|
71 |
+
"<a href=\"http://hybridauth.sourceforge.net/wsl/userdata.html\" target="
|
72 |
+
"\"_blank\">Manage users and contacts</a>"
|
73 |
+
msgstr ""
|
74 |
+
|
75 |
+
#: includes/admin/wsl.admin.ui.php:582
|
76 |
+
msgid ""
|
77 |
+
"<a href=\"http://hybridauth.sourceforge.net/wsl/index.html\" target=\"_blank"
|
78 |
+
"\">WSL User Guide</a> and <a href=\"http://hybridauth.sourceforge.net/wsl/"
|
79 |
+
"faq.html\" target=\"_blank\">FAQ</a>"
|
80 |
+
msgstr ""
|
81 |
+
|
82 |
+
#: includes/admin/wsl.admin.ui.php:588
|
83 |
+
#, php-format
|
84 |
+
msgid "What's new on WSL %s"
|
85 |
+
msgstr ""
|
86 |
+
|
87 |
+
#: includes/admin/wsl.admin.ui.php:591
|
88 |
+
msgid ""
|
89 |
+
"In a similar way to WordPress plugins, WSL uses <a href=\"options-general."
|
90 |
+
"php?page=wordpress-social-login&wslp=components\">Components</a>"
|
91 |
+
msgstr ""
|
92 |
+
|
93 |
+
#: includes/admin/wsl.admin.ui.php:592
|
94 |
+
msgid "<b>Email Validation</b> is replaced with <b>Profile Completion</b>"
|
95 |
+
msgstr ""
|
96 |
+
|
97 |
+
#: includes/admin/wsl.admin.ui.php:593
|
98 |
+
msgid ""
|
99 |
+
"<b>User Moderation</b> made compatible with <a href=\"http://wordpress.org/"
|
100 |
+
"extend/plugins/theme-my-login/\" target=\"_blank\">Theme My Login</a> plugin"
|
101 |
+
msgstr ""
|
102 |
+
|
103 |
+
#: includes/admin/wsl.admin.ui.php:594
|
104 |
+
msgid "A number of enhancements and new options now available"
|
105 |
+
msgstr ""
|
106 |
+
|
107 |
+
#: includes/admin/wsl.admin.ui.php:644
|
108 |
+
msgid "Contributor License Agreement"
|
109 |
+
msgstr ""
|
110 |
+
|
111 |
+
#: includes/admin/wsl.admin.ui.php:649
|
112 |
+
msgid ""
|
113 |
+
"You are about to submit your contributions to the WordPress Social Login "
|
114 |
+
"Website to be reviewed for inclusion in future versions"
|
115 |
+
msgstr ""
|
116 |
+
|
117 |
+
#: includes/admin/wsl.admin.ui.php:651
|
118 |
+
msgid ""
|
119 |
+
"You hereby grant the permission to publish your contribution, in whole or in "
|
120 |
+
"part, and to made it available under the <b>MIT License</b>, for the "
|
121 |
+
"<b>Wordpress community</b> to, freely use or misuse"
|
122 |
+
msgstr ""
|
123 |
+
|
124 |
+
#: includes/admin/wsl.admin.ui.php:657
|
125 |
+
msgid "Hell No"
|
126 |
+
msgstr ""
|
127 |
+
|
128 |
+
#: includes/admin/wsl.admin.ui.php:658
|
129 |
+
msgid "Yes, I agree to contribute my translation"
|
130 |
+
msgstr ""
|
131 |
+
|
132 |
+
#: includes/admin/wsl.admin.ui.php:662
|
133 |
+
msgid "Help us localize WordPress Social Login"
|
134 |
+
msgstr "Ayúdanos a traducir esta página"
|
135 |
+
|
136 |
+
#: includes/admin/wsl.admin.ui.php:666
|
137 |
+
msgid ""
|
138 |
+
"You can <b>translate as much you pleases</b> as much <b>as you want</b>. You "
|
139 |
+
"don't have to translate everything in this page, but every word counts. "
|
140 |
+
"Ignore any string you want or aleardy translated. You could also use this "
|
141 |
+
"tool to fix any typo you may find or to improve the current language "
|
142 |
+
"expressions"
|
143 |
+
msgstr ""
|
144 |
+
|
145 |
+
#: includes/admin/wsl.admin.ui.php:668
|
146 |
+
msgid ""
|
147 |
+
"Your name allows us to recognize your contributions and bypass manual "
|
148 |
+
"review, especially when you've been contributing in the past. So do supply "
|
149 |
+
"some unique string, even if it's not your real name"
|
150 |
+
msgstr ""
|
151 |
+
|
152 |
+
#: includes/admin/wsl.admin.ui.php:670
|
153 |
+
msgid ""
|
154 |
+
"All the texts on this page are automatically extracted and generated on the "
|
155 |
+
"form beside. If the translation tool has scapped something you may consider "
|
156 |
+
"as irrelevant, please leave that particular field empty"
|
157 |
+
msgstr ""
|
158 |
+
|
159 |
+
#: includes/admin/wsl.admin.ui.php:672
|
160 |
+
msgid ""
|
161 |
+
"Your contributions will be sent to the WordPress Social Login website for "
|
162 |
+
"inclusion in future versions"
|
163 |
+
msgstr ""
|
164 |
+
|
165 |
+
#: includes/admin/wsl.admin.ui.php:674
|
166 |
+
msgid "Thanks!"
|
167 |
+
msgstr ""
|
168 |
+
|
169 |
+
#: includes/admin/wsl.admin.ui.php:682
|
170 |
+
msgid "Your Name"
|
171 |
+
msgstr ""
|
172 |
+
|
173 |
+
#: includes/admin/wsl.admin.ui.php:682 includes/admin/wsl.admin.ui.php:688
|
174 |
+
msgid "optional"
|
175 |
+
msgstr ""
|
176 |
+
|
177 |
+
#: includes/admin/wsl.admin.ui.php:688
|
178 |
+
msgid "Comment"
|
179 |
+
msgstr ""
|
180 |
+
|
181 |
+
#: includes/admin/wsl.admin.ui.php:694
|
182 |
+
msgid "Target Language"
|
183 |
+
msgstr ""
|
184 |
+
|
185 |
+
#: includes/admin/wsl.admin.ui.php:703
|
186 |
+
msgid "Submit changes"
|
187 |
+
msgstr ""
|
188 |
+
|
189 |
+
#: includes/admin/wsl.admin.ui.php:769
|
190 |
+
msgid "Help us translate this page into your language"
|
191 |
+
msgstr "Ayúdanos a traducir esta página"
|
192 |
+
|
193 |
+
#: includes/admin/components/advanced/index.php:47
|
194 |
+
#: includes/admin/components/login-widget/wsl.components.loginwidget.setup.php:62
|
195 |
+
msgid "Advanced Settings"
|
196 |
+
msgstr ""
|
197 |
+
|
198 |
+
#: includes/admin/components/advanced/index.php:52
|
199 |
+
msgid ""
|
200 |
+
"<b>Please</b> for the love of <b>God</b>, stay out of Advanced.. unless you "
|
201 |
+
"are Advanced and you know what you are doing"
|
202 |
+
msgstr ""
|
203 |
+
|
204 |
+
#: includes/admin/components/advanced/index.php:61
|
205 |
+
msgid "WSL Base URL"
|
206 |
+
msgstr ""
|
207 |
+
|
208 |
+
#: includes/admin/components/advanced/index.php:68
|
209 |
+
msgid "WSL Base PATH"
|
210 |
+
msgstr ""
|
211 |
+
|
212 |
+
#: includes/admin/components/advanced/index.php:75
|
213 |
+
msgid "Hybridauth endpoint URL"
|
214 |
+
msgstr ""
|
215 |
+
|
216 |
+
#: includes/admin/components/advanced/index.php:82
|
217 |
+
msgid "WSL top bar menu"
|
218 |
+
msgstr ""
|
219 |
+
|
220 |
+
#: includes/admin/components/advanced/index.php:85
|
221 |
+
#: includes/admin/components/bouncer/wsl.components.bouncer.setup.php:38
|
222 |
+
#: includes/admin/components/bouncer/wsl.components.bouncer.setup.php:47
|
223 |
+
#: includes/admin/components/bouncer/wsl.components.bouncer.setup.php:72
|
224 |
+
#: includes/admin/components/bouncer/wsl.components.bouncer.setup.php:81
|
225 |
+
#: includes/admin/components/bouncer/wsl.components.bouncer.setup.php:174
|
226 |
+
#: includes/admin/components/bouncer/wsl.components.bouncer.setup.php:211
|
227 |
+
#: includes/admin/components/bouncer/wsl.components.bouncer.setup.php:249
|
228 |
+
msgid "Yes"
|
229 |
+
msgstr ""
|
230 |
+
|
231 |
+
#: includes/admin/components/advanced/index.php:86
|
232 |
+
#: includes/admin/components/bouncer/wsl.components.bouncer.setup.php:39
|
233 |
+
#: includes/admin/components/bouncer/wsl.components.bouncer.setup.php:48
|
234 |
+
#: includes/admin/components/bouncer/wsl.components.bouncer.setup.php:73
|
235 |
+
#: includes/admin/components/bouncer/wsl.components.bouncer.setup.php:82
|
236 |
+
#: includes/admin/components/bouncer/wsl.components.bouncer.setup.php:175
|
237 |
+
#: includes/admin/components/bouncer/wsl.components.bouncer.setup.php:212
|
238 |
+
#: includes/admin/components/bouncer/wsl.components.bouncer.setup.php:250
|
239 |
+
msgid "No"
|
240 |
+
msgstr ""
|
241 |
+
|
242 |
+
#: includes/admin/components/advanced/index.php:98
|
243 |
+
#: includes/admin/components/bouncer/wsl.components.bouncer.setup.php:275
|
244 |
+
#: includes/admin/components/contacts/index.php:98
|
245 |
+
#: includes/admin/components/diagnostics/index.php:64
|
246 |
+
#: includes/admin/components/login-widget/wsl.components.loginwidget.setup.php:144
|
247 |
+
#: includes/admin/components/networks/wsl.components.networks.setup.php:271
|
248 |
+
#: includes/admin/components/networks/wsl.components.networks.whyhello.php:40
|
249 |
+
msgid "Save Settings"
|
250 |
+
msgstr ""
|
251 |
+
|
252 |
+
#: includes/admin/components/bouncer/wsl.components.bouncer.setup.php:27
|
253 |
+
msgid "WSL Widget"
|
254 |
+
msgstr ""
|
255 |
+
|
256 |
+
#: includes/admin/components/bouncer/wsl.components.bouncer.setup.php:31
|
257 |
+
msgid ""
|
258 |
+
"Here you ca
|