From a32ef4a8151290300823059c75d70747aa877e98 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=81Z=C3=81R=20Imre=20AI=20Agent?= Date: Thu, 16 Jul 2026 11:29:07 +0200 Subject: [PATCH] feat(pkg): add OneAll Social Login 5.5.0 (pristine upstream) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Pristine OneAll 5.5.0 manifest-mapped from github.com/oneall/social-login-joomla @5.5.0 via lib/jmap.py to deployed layout. The next commit reconciles to the live bytes; the diff is the full delta vs upstream (line-endings + install files + Cadline CRM modification). Signed-off-by: LÁZÁR Imre Assisted-by: claude-code@claude-opus-4-8 --- .../com_oneallsociallogin/assets/cfg.php | 147 ++++++ .../assets/css/index.html | 1 + .../assets/css/oneallsociallogin.css | 343 ++++++++++++++ .../assets/img/index.html | 1 + .../assets/img/sprite_35_35.png | Bin 0 -> 66306 bytes .../assets/img/status_error.png | Bin 0 -> 655 bytes .../assets/img/status_loading.gif | Bin 0 -> 673 bytes .../assets/img/status_ok.png | Bin 0 -> 781 bytes .../com_oneallsociallogin/assets/index.html | 1 + .../assets/js/index.html | 1 + .../com_oneallsociallogin/assets/js/jquery.js | 4 + .../assets/js/oneallsociallogin.js | 147 ++++++ .../com_oneallsociallogin/controller.php | 399 +++++++++++++++++ .../com_oneallsociallogin/index.html | 1 + .../com_oneallsociallogin/install/index.html | 1 + .../install/install.mysql.utf8.sql | 33 ++ .../install/uninstall.mysql.utf8.sql | 2 + .../com_oneallsociallogin/models/index.html | 1 + .../models/oneallsociallogin.php | 145 ++++++ .../oneallsociallogin.php | 35 ++ .../com_oneallsociallogin/views/index.html | 1 + .../views/oneallsociallogin/index.html | 1 + .../views/oneallsociallogin/tmpl/default.php | 254 +++++++++++ .../views/oneallsociallogin/tmpl/index.html | 1 + .../views/oneallsociallogin/view.html.php | 77 ++++ .../en-GB/en-GB.com_oneallsociallogin.sys.ini | 1 + .../com_oneallsociallogin/index.html | 1 + .../oneallsociallogin.php | 35 ++ .../mod_oneallsociallogin/classes/helper.php | 101 +++++ .../mod_oneallsociallogin/classes/index.html | 1 + .../modules/mod_oneallsociallogin/index.html | 1 + .../mod_oneallsociallogin.php | 54 +++ .../mod_oneallsociallogin.xml | 29 ++ .../mod_oneallsociallogin/tmpl/default.php | 117 +++++ .../mod_oneallsociallogin/tmpl/index.html | 1 + .../system/oneallsociallogin/helper.php | 390 ++++++++++++++++ .../system/oneallsociallogin/index.html | 1 + .../oneallsociallogin/oneallsociallogin.php | 421 ++++++++++++++++++ .../oneallsociallogin/oneallsociallogin.xml | 22 + 39 files changed, 2771 insertions(+) create mode 100644 packages/oneallsociallogin/administrator/components/com_oneallsociallogin/assets/cfg.php create mode 100644 packages/oneallsociallogin/administrator/components/com_oneallsociallogin/assets/css/index.html create mode 100755 packages/oneallsociallogin/administrator/components/com_oneallsociallogin/assets/css/oneallsociallogin.css create mode 100644 packages/oneallsociallogin/administrator/components/com_oneallsociallogin/assets/img/index.html create mode 100644 packages/oneallsociallogin/administrator/components/com_oneallsociallogin/assets/img/sprite_35_35.png create mode 100644 packages/oneallsociallogin/administrator/components/com_oneallsociallogin/assets/img/status_error.png create mode 100644 packages/oneallsociallogin/administrator/components/com_oneallsociallogin/assets/img/status_loading.gif create mode 100644 packages/oneallsociallogin/administrator/components/com_oneallsociallogin/assets/img/status_ok.png create mode 100644 packages/oneallsociallogin/administrator/components/com_oneallsociallogin/assets/index.html create mode 100644 packages/oneallsociallogin/administrator/components/com_oneallsociallogin/assets/js/index.html create mode 100755 packages/oneallsociallogin/administrator/components/com_oneallsociallogin/assets/js/jquery.js create mode 100755 packages/oneallsociallogin/administrator/components/com_oneallsociallogin/assets/js/oneallsociallogin.js create mode 100644 packages/oneallsociallogin/administrator/components/com_oneallsociallogin/controller.php create mode 100644 packages/oneallsociallogin/administrator/components/com_oneallsociallogin/index.html create mode 100644 packages/oneallsociallogin/administrator/components/com_oneallsociallogin/install/index.html create mode 100755 packages/oneallsociallogin/administrator/components/com_oneallsociallogin/install/install.mysql.utf8.sql create mode 100755 packages/oneallsociallogin/administrator/components/com_oneallsociallogin/install/uninstall.mysql.utf8.sql create mode 100644 packages/oneallsociallogin/administrator/components/com_oneallsociallogin/models/index.html create mode 100644 packages/oneallsociallogin/administrator/components/com_oneallsociallogin/models/oneallsociallogin.php create mode 100644 packages/oneallsociallogin/administrator/components/com_oneallsociallogin/oneallsociallogin.php create mode 100644 packages/oneallsociallogin/administrator/components/com_oneallsociallogin/views/index.html create mode 100644 packages/oneallsociallogin/administrator/components/com_oneallsociallogin/views/oneallsociallogin/index.html create mode 100644 packages/oneallsociallogin/administrator/components/com_oneallsociallogin/views/oneallsociallogin/tmpl/default.php create mode 100644 packages/oneallsociallogin/administrator/components/com_oneallsociallogin/views/oneallsociallogin/tmpl/index.html create mode 100644 packages/oneallsociallogin/administrator/components/com_oneallsociallogin/views/oneallsociallogin/view.html.php create mode 100755 packages/oneallsociallogin/administrator/language/en-GB/en-GB.com_oneallsociallogin.sys.ini create mode 100644 packages/oneallsociallogin/components/com_oneallsociallogin/index.html create mode 100644 packages/oneallsociallogin/components/com_oneallsociallogin/oneallsociallogin.php create mode 100644 packages/oneallsociallogin/modules/mod_oneallsociallogin/classes/helper.php create mode 100644 packages/oneallsociallogin/modules/mod_oneallsociallogin/classes/index.html create mode 100644 packages/oneallsociallogin/modules/mod_oneallsociallogin/index.html create mode 100644 packages/oneallsociallogin/modules/mod_oneallsociallogin/mod_oneallsociallogin.php create mode 100755 packages/oneallsociallogin/modules/mod_oneallsociallogin/mod_oneallsociallogin.xml create mode 100644 packages/oneallsociallogin/modules/mod_oneallsociallogin/tmpl/default.php create mode 100644 packages/oneallsociallogin/modules/mod_oneallsociallogin/tmpl/index.html create mode 100644 packages/oneallsociallogin/plugins/system/oneallsociallogin/helper.php create mode 100644 packages/oneallsociallogin/plugins/system/oneallsociallogin/index.html create mode 100644 packages/oneallsociallogin/plugins/system/oneallsociallogin/oneallsociallogin.php create mode 100755 packages/oneallsociallogin/plugins/system/oneallsociallogin/oneallsociallogin.xml diff --git a/packages/oneallsociallogin/administrator/components/com_oneallsociallogin/assets/cfg.php b/packages/oneallsociallogin/administrator/components/com_oneallsociallogin/assets/cfg.php new file mode 100644 index 00000000..f38c0659 --- /dev/null +++ b/packages/oneallsociallogin/administrator/components/com_oneallsociallogin/assets/cfg.php @@ -0,0 +1,147 @@ + array( + 'name' => 'Amazon' + ), + 'battlenet' => array( + 'name' => 'Battle.net' + ), + 'blogger' => array( + 'name' => 'Blogger' + ), + 'discord' => array( + 'name' => 'Discord' + ), + 'disqus' => array( + 'name' => 'Disqus' + ), + 'draugiem' => array( + 'name' => 'Draugiem' + ), + 'dribbble' => array( + 'name' => 'Dribbble' + ), + 'facebook' => array( + 'name' => 'Facebook' + ), + 'foursquare' => array( + 'name' => 'Foursquare' + ), + 'github' => array( + 'name' => 'Github.com' + ), + 'google' => array( + 'name' => 'Google' + ), + 'instagram' => array( + 'name' => 'Instagram' + ), + 'line' => array( + 'name' => 'Line' + ), + 'linkedin' => array( + 'name' => 'LinkedIn' + ), + 'livejournal' => array( + 'name' => 'LiveJournal' + ), + 'mailru' => array( + 'name' => 'Mail.ru' + ), + 'meetup' => array( + 'name' => 'Meetup' + ), + 'mixer' => array( + 'name' => 'Mixer' + ), + 'odnoklassniki' => array( + 'name' => 'Odnoklassniki' + ), + 'openid' => array( + 'name' => 'OpenID' + ), + 'paypal' => array( + 'name' => 'PayPal' + ), + 'pinterest' => array( + 'name' => 'Pinterest' + ), + 'pixelpin' => array( + 'name' => 'PixelPin' + ), + 'reddit' => array( + 'name' => 'Reddit' + ), + 'skyrock' => array( + 'name' => 'Skyrock.com' + ), + 'soundcloud' => array( + 'name' => 'SoundCloud' + ), + 'stackexchange' => array( + 'name' => 'StackExchange' + ), + 'steam' => array( + 'name' => 'Steam' + ), + 'tumblr' => array( + 'name' => 'Tumblr' + ), + 'twitch' => array( + 'name' => 'Twitch.tv' + ), + 'twitter' => array( + 'name' => 'Twitter' + ), + 'vimeo' => array( + 'name' => 'Vimeo' + ), + 'vkontakte' => array( + 'name' => 'VKontakte' + ), + 'weibo' => array( + 'name' => 'Weibo' + ), + 'windowslive' => array( + 'name' => 'Windows Live' + ), + 'wordpress' => array( + 'name' => 'WordPress.com' + ), + 'xing' => array( + 'name' => 'Xing' + ), + 'yahoo' => array( + 'name' => 'Yahoo' + ), + 'youtube' => array( + 'name' => 'YouTube' + ) +); diff --git a/packages/oneallsociallogin/administrator/components/com_oneallsociallogin/assets/css/index.html b/packages/oneallsociallogin/administrator/components/com_oneallsociallogin/assets/css/index.html new file mode 100644 index 00000000..5d5190f8 --- /dev/null +++ b/packages/oneallsociallogin/administrator/components/com_oneallsociallogin/assets/css/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/oneallsociallogin/administrator/components/com_oneallsociallogin/assets/css/oneallsociallogin.css b/packages/oneallsociallogin/administrator/components/com_oneallsociallogin/assets/css/oneallsociallogin.css new file mode 100755 index 00000000..dcc6f409 --- /dev/null +++ b/packages/oneallsociallogin/administrator/components/com_oneallsociallogin/assets/css/oneallsociallogin.css @@ -0,0 +1,343 @@ +.oa_social_login_admin h4 { + font-size: 18px; + line-height: 16px; + margin-top: 30px !important; + color: #444; +} + +.oa_social_login_admin .error_message { + color: red; + background: url("../img/status_error.png") no-repeat scroll 0 50% #F6F6F6; + padding-left: 25px; + font-weight: bold; + margin-top: 5px; +} + +.oa_social_login_admin .success_message { + color: green; + background: url("../img/status_ok.png") no-repeat scroll 0 50% #F6F6F6; + padding-left: 25px; + font-weight: bold; + margin-top: 5px; +} + +.oa_social_login_admin .working_message { + color: blue; + background: url("../img/status_loading.gif") no-repeat scroll 0 50% #F6F6F6; + padding-left: 25px; + font-weight: bold; + margin-top: 5px; +} + +.oa_social_login_provider { + background-image: url("../img/sprite_35_35.png"); + text-indent: -9999px; + height: 35px; + width: 35px; + display: inline-block; +} + +.social_login_form { + width: 800px; + padding: 0px; + background-color: #fff; + margin-bottom: 20px; + border: 1px solid #ddd; +} + +.social_login_form a { + text-decoration: underline !important; +} + +.social_login_form a:hover { + text-decoration: none !important;; +} + +.social_login_form legend { + margin: 0; + background-color: #fff; +} + +.social_login_form input[type="text"] { + display: block; + width: 97%; +} + +.social_login_form input[type="radio"] { + float: left; + margin: 0 5px; +} + +.social_login_form .social_login_form_row { + padding: 5px 10px; + font-size: 12px; + clear: both; + overflow: hidden; +} + +.social_login_form .social_login_form_row_provider { + line-height: 40px; +} + +.social_login_form .social_login_form_row_provider .provider_icon { + float: left; + clear: none; + cursor: pointer; +} + +.social_login_form .social_login_form_row_provider .provider_check { + float: left; + clear: none; + margin: 12px; +} + +.social_login_form .social_login_form_row_provider .provider_name { + clear: none; + float: left; + margin: 0; + padding: 0; + cursor: pointer; + line-height: 40px; + font-weight: bold; +} + +.social_login_form .social_login_form_row_odd { + background-color: #ddd; + color: #222; +} + +.social_login_form .social_login_form_row_even { + background-color: #eee; +} + +.social_login_form .social_login_form_row_title { + font-size: 20px; + font-weight: bold; + margin-top: 10px; +} + +.social_login_form .social_login_form_row_button { + background-color: #F6F6F6; + border-top: 1px dotted #ddd; + padding: 5px 10px; +} + +.social_login_form .social_login_form_row_button_link { + font-size: 14px; + font-weight: bold; +} + +.social_login_form .social_login_form_row_description { + padding: 5px 0 10px 10px; + font-weight: bold; +} + +.social_login_form_info { + background-color: #FFFFE0; + padding-top: 10px; +} + +.social_login_form_info .social_login_form_row { + padding: 0 10px 10px !important; +} + +.social_login_form_welcome { + background-color: #E1EDFF; + border: 1px solid #CACFF2; +} + +.social_login_form_saved { + background-color: #DFF0D8; + border: 1px solid #D6E9C6; + color: #468847; +} + +.social_login_form_saved .social_login_form_row_title { + margin: 10px 0; + font-size: 18px; +} + +.social_login_form_welcome .social_login_form_row { + margin-bottom: 10px; +} + +.social_login_form_welcome .social_login_form_row_button { + padding-bottom: 0 !important; + background-color: #E1EDFF; +} + + + + +/* Buttons */ +.oa_social_login_provider_vimeo { + background-position: -2px -1px; +} + +.oa_social_login_provider_blogger { + background-position: -39px -1px; +} + +.oa_social_login_provider_facebook { + background-position: -76px -1px; +} + +.oa_social_login_provider_foursquare { + background-position: -113px -1px; +} + +.oa_social_login_provider_google { + background-position: -150px -1px; +} + +.oa_social_login_provider_reddit { + background-position: -187px -1px; +} + +.oa_social_login_provider_linkedin { + background-position: -224px -1px; +} + +.oa_social_login_provider_windowslive { + background-position: -261px -1px; +} + +.oa_social_login_provider_livejournal { + background-position: -298px -1px; +} + +.oa_social_login_provider_myspace { + background-position: -372px -1px; +} + +.oa_social_login_provider_openid { + background-position: -409px -1px; +} + +.oa_social_login_provider_draugiem { + background-position: -446px -1px; +} + +.oa_social_login_provider_twitter { + background-position: -520px -1px; +} + +.oa_social_login_provider_vkontakte { + background-position: -631px -1px; +} + +.oa_social_login_provider_wordpress { + background-position: -668px -1px; +} + +.oa_social_login_provider_yahoo { + background-position: -705px -1px; +} + +.oa_social_login_provider_paypal { + background-position: -742px -1px; +} + +.oa_social_login_provider_stackexchange { + background-position: -779px -1px; +} + +.oa_social_login_provider_steam { + background-position: -816px -1px; +} + +.oa_social_login_provider_mailru { + background-position: -853px -1px; +} + +.oa_social_login_provider_skyrock { + background-position: -890px -1px; +} + +.oa_social_login_provider_github { + background-position: -927px -1px; +} + +.oa_social_login_provider_disqus { + background-position: -964px -1px; +} + +.oa_social_login_provider_youtube { + background-position: -1001px -1px; +} + +.oa_social_login_provider_odnoklassniki { + background-position: -1038px -1px; +} + +.oa_social_login_provider_deviantart { + background-position: -1075px -1px; +} + +.oa_social_login_provider_twitch { + background-position: -1112px -1px; +} + +.oa_social_login_provider_amazon { + background-position: -1149px -1px; +} + +.oa_social_login_provider_instagram { + background-position: -1186px -1px; +} + +.oa_social_login_provider_battlenet { + background-position: -1223px -1px; +} + +.oa_social_login_provider_dribbble { + background-position: -1260px -1px; +} + +.oa_social_login_provider_pinterest { + background-position: -1297px -1px; +} + +.oa_social_login_provider_pixelpin { + background-position: -1334px -1px; +} + +.oa_social_login_provider_storage { + background-position: -1371px -1px; +} + +.oa_social_login_provider_meetup { + background-position: -1408px -1px; +} + +.oa_social_login_provider_line { + background-position: -1445px -1px; +} + +.oa_social_login_provider_soundcloud { + background-position: -1482px -1px; +} + +.oa_social_login_provider_discord { + background-position: -1519px -1px; +} + +.oa_social_login_provider_weibo { + background-position: -1556px -1px; +} + +.oa_social_login_provider_tumblr { + background-position: -1593px -1px; +} + +.oa_social_login_provider_xing { + background-position: -372px -1px; +} + +.oa_social_login_provider_mixer { + background-position: -1667px -1px; +} + +.oa_social_login_provider_google { + background-position: -1704px -1px; +} \ No newline at end of file diff --git a/packages/oneallsociallogin/administrator/components/com_oneallsociallogin/assets/img/index.html b/packages/oneallsociallogin/administrator/components/com_oneallsociallogin/assets/img/index.html new file mode 100644 index 00000000..5d5190f8 --- /dev/null +++ b/packages/oneallsociallogin/administrator/components/com_oneallsociallogin/assets/img/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/oneallsociallogin/administrator/components/com_oneallsociallogin/assets/img/sprite_35_35.png b/packages/oneallsociallogin/administrator/components/com_oneallsociallogin/assets/img/sprite_35_35.png new file mode 100644 index 0000000000000000000000000000000000000000..e1fef08a2241a1997c0bd7ba4eb914757a40a455 GIT binary patch literal 66306 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
mlpBqJ`&Jhn>aXfrc^Xo7g# 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°h4YIKWIiD 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%0AYymyLWprv{5JZ?8yOi|)fe{{NzCrwNYmm8^S zFaU8nG#y;-G_k{hjj?*&Mp`?4Abo`H_GDu98>S2Pb^1{Y3O<>u_wj|LEs%ac!}L_6 z#R@f}m5&2|^8gGi11pqz-F$x|M@=|}D}iwI(;rwKm&Q>OO3C*((vdp|fOb1f`Em1{ zq@i%+(+~J~+zdKy9`*Mm4v7SnHNmYqhuAC(fFsIrk|t0QbqwiL++$ zyT>23kL3GA(Fj78jkmCBz{YsUa{6&Z-zR9&geWbmFb6~`PE`~%Cs5IpV%)j%s3;hT zKivB1-zQaPP~I^1Hg8IuON)!>^bbtdzpiVjY7hN>;q@4*^V& z?`Qn@@dLL8`~5w(m5wb%Gc?TLr|;-_@;&HzJ)DJYz_?PkhXHQelI?<4OXd`)3M!7Q zl>mfPx?~#_CnhE|>HIF0M9@+wssoBCDpC;$)!ElpB|<1MSw_X#mR!dyUK2`yWLdvGu`OaN@r^3y|#NUu?x;Ux`>bFQFil z&LO3OVz|gzG=#>bP~K}8OD2FVhjC_OSr*Y~6kT_ue05z%Rnrkx2+~JbzGGjN{J4Dt>Q9NrjE;D`Ah2~ zFxH7bNh0Nok8>j>_5i$hn%7JD;^S!i{q2coS7JpY^XE)+!=;1=AU^K#xS2m^8YNaV zaq&>djCdwbce_6GKgj5(-zUZ8Mx8vJP{>S-r!uoWvUtH{H$X7_>HEPs9)raTCiAy{ zyqCBkW^G+0ckEa=+OuO4>G6n#JGd z4@*=8R{YIg6GA4yfW!_=2-KnYn-kD=yRYW&w^YXGc(?J5U0=KU4!7GFu(ZF{f8HQ4u;P;jwiyqe#_p_K=mi??%IgN7{B=9i+ztj{&-;Bx^)8?_z7No z@x_V4R%+RxpMT-T-~6P;r6Y;IsHhygSMPAy&``VFm3>E z(>BYNbK-xTKWnJ(sgL#tn&B|n1q!GNDk^F$9^aQ`W<&7&Swjm5sW-%l0k1W$Q(k{MZLZKCj(nntWFoCW~HZNJI0So z2FJ3=p0_M3ak9L>UOlPv+J9`ydd^hn;o|L?{%$_~_h+12Kzuk7*ZAVm}Jc@o}(-~jBtyIwmEO^)??}~U7{l>(!UZ&o7 z+w&LS<}XtRtWR%j{8PkVrY8F2%e8I{{Br(nzFcd-`V@FakN9$}M4v*1l{fzVk1KBr z6;=*dpO(M0J`yUdO!P@txN*Zd=ijC)3|OBU|8Pe{S4i}!S$Ey|l`mX-TeI#Ous)So z(MYrIO7zL=HEwLZ;VZX!y~cp`DHJjzUayhpQ-e`(<0W7G`)v(I!GQJYZ~u5N(qI%M z`eY2QxN*}v@7`t%t{AXBnYDEhV{k>HPs)Eae-Evl_?2e|^!m@NAK2^rmi^<9j^B0m z$%l0OsApgO?;!mDxD|iyrb9Zubo}l+@A{Aa{wqJP4CwXeJ^bJG z_rLAG?Z556?Z55+zqVw_k^#N`7r*$$Lppxu6Nh&F)fXMw@f*h;TKskL_Raqtg#T>= z*5toWAJFS77ruB{PLt-}ObC@s`aSvI|F(g6{)Z^@cc}5xYp%IwK)?V0zOZdTuV1|H z%|kl=e_oq%NXP&4qz#Am1-^ZV@q^zT+W7hQZw5A>^>;UoJ*4A5JVe#6*}D!c*KyLk zGY{$bO)H;2q~imZoHn4(&(}>ktG})A*xL{3__lX$IHcp(ty_0U$4`r~$NJO$-vAOj VAGoscfmHwi002ovPDHLkV1k4S>HGiy literal 0 HcmV?d00001 diff --git a/packages/oneallsociallogin/administrator/components/com_oneallsociallogin/assets/img/status_error.png b/packages/oneallsociallogin/administrator/components/com_oneallsociallogin/assets/img/status_error.png new file mode 100644 index 0000000000000000000000000000000000000000..1514d51a3cf1b67e1c5b9ada36f1fd474e2d214a GIT binary patch literal 655 zcmV;A0&x9_P)uEoyT++I zn$b9r%cFfhHe2K68PkBu*@^<$y+7xQ$wJ~;c5aBx$R=xq*41Wo zhwQus_VOgm0hughj}MhOvs#{>Vg09Y8WxjWUJY5YW zJ?&8eG!59Cz=|E%Ns@013KLWOLV)CObIIj_5{>{#k%TEAMs_GbdDV`x-iYsGH z#=Z{USAQA>NY(}X7=3{K8#FYQWHy3QxwWG zOEMG^vl1(E@)J|^GV{{%85DoAFmM5tEB@#9a}5c0b_{Se(lcOY1PbW@G0D8JzOW7Eb1{;*gxf?l&Wi({-cap7;r7l!E}X+)Eqz!)jo2f+oR?VMR6u=p2PZ6D-9amptEdYo3ARahV5- zdQRKso(f;H$dHGPTckK~_XgANQyCi#HgI|}DR^^EXzVP; zcee@)rY3aUO`LPrWLm4E+ff6N2??{eG4iq;auAqp*l_6Dxrs1i*fER&#{BA3rz>+b wugh_899HN%UdYE{Xt46shIIiFhk(%)c55kWdP)4-QibtN)VXQDpczE`xXAkUjh%RI>;okxb7K@0kpyQ1k_Y(|Oe7$m(^ zNYX>mI||sUbmn+c3<&FnE=4u#()KBS^SH8e)Qs5i!#lY=$-1gbH6VluzU=m=EP78&5vQ z-?+fFP-G2l&l_QzYealK$;1Rl?FkzXR&Jv@fBPNjCr#AYRyJ7UJQ0v#?)7Ott=>3`#-pV!7>9}>Q1jL)H6h&gkP@3nI=+F3nA~M>u#(n* z8T!#8oEw&-mED4!h4s!N@Jo3S7N&Q6%6l3}nlcd~X@>;uelvPsSkXIgg~e+^T1zSf z3SNj(5%jK~i8@b;C \ No newline at end of file diff --git a/packages/oneallsociallogin/administrator/components/com_oneallsociallogin/assets/js/index.html b/packages/oneallsociallogin/administrator/components/com_oneallsociallogin/assets/js/index.html new file mode 100644 index 00000000..5d5190f8 --- /dev/null +++ b/packages/oneallsociallogin/administrator/components/com_oneallsociallogin/assets/js/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/oneallsociallogin/administrator/components/com_oneallsociallogin/assets/js/jquery.js b/packages/oneallsociallogin/administrator/components/com_oneallsociallogin/assets/js/jquery.js new file mode 100755 index 00000000..8305ef31 --- /dev/null +++ b/packages/oneallsociallogin/administrator/components/com_oneallsociallogin/assets/js/jquery.js @@ -0,0 +1,4 @@ +/*! jQuery v1.7.1 jquery.com | jquery.org/license */ +(function(a,b){function cy(a){return f.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:!1}function cv(a){if(!ck[a]){var b=c.body,d=f("<"+a+">").appendTo(b),e=d.css("display");d.remove();if(e==="none"||e===""){cl||(cl=c.createElement("iframe"),cl.frameBorder=cl.width=cl.height=0),b.appendChild(cl);if(!cm||!cl.createElement)cm=(cl.contentWindow||cl.contentDocument).document,cm.write((c.compatMode==="CSS1Compat"?"":"")+""),cm.close();d=cm.createElement(a),cm.body.appendChild(d),e=f.css(d,"display"),b.removeChild(cl)}ck[a]=e}return ck[a]}function cu(a,b){var c={};f.each(cq.concat.apply([],cq.slice(0,b)),function(){c[this]=a});return c}function ct(){cr=b}function cs(){setTimeout(ct,0);return cr=f.now()}function cj(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function ci(){try{return new a.XMLHttpRequest}catch(b){}}function cc(a,c){a.dataFilter&&(c=a.dataFilter(c,a.dataType));var d=a.dataTypes,e={},g,h,i=d.length,j,k=d[0],l,m,n,o,p;for(g=1;g0){if(c!=="border")for(;g=0===c})}function S(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function K(){return!0}function J(){return!1}function n(a,b,c){var d=b+"defer",e=b+"queue",g=b+"mark",h=f._data(a,d);h&&(c==="queue"||!f._data(a,e))&&(c==="mark"||!f._data(a,g))&&setTimeout(function(){!f._data(a,e)&&!f._data(a,g)&&(f.removeData(a,d,!0),h.fire())},0)}function m(a){for(var b in a){if(b==="data"&&f.isEmptyObject(a[b]))continue;if(b!=="toJSON")return!1}return!0}function l(a,c,d){if(d===b&&a.nodeType===1){var e="data-"+c.replace(k,"-$1").toLowerCase();d=a.getAttribute(e);if(typeof d=="string"){try{d=d==="true"?!0:d==="false"?!1:d==="null"?null:f.isNumeric(d)?parseFloat(d):j.test(d)?f.parseJSON(d):d}catch(g){}f.data(a,c,d)}else d=b}return d}function h(a){var b=g[a]={},c,d;a=a.split(/\s+/);for(c=0,d=a.length;c)[^>]*$|#([\w\-]*)$)/,j=/\S/,k=/^\s+/,l=/\s+$/,m=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,n=/^[\],:{}\s]*$/,o=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,p=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,q=/(?:^|:|,)(?:\s*\[)+/g,r=/(webkit)[ \/]([\w.]+)/,s=/(opera)(?:.*version)?[ \/]([\w.]+)/,t=/(msie) ([\w.]+)/,u=/(mozilla)(?:.*? rv:([\w.]+))?/,v=/-([a-z]|[0-9])/ig,w=/^-ms-/,x=function(a,b){return(b+"").toUpperCase()},y=d.userAgent,z,A,B,C=Object.prototype.toString,D=Object.prototype.hasOwnProperty,E=Array.prototype.push,F=Array.prototype.slice,G=String.prototype.trim,H=Array.prototype.indexOf,I={};e.fn=e.prototype={constructor:e,init:function(a,d,f){var g,h,j,k;if(!a)return this;if(a.nodeType){this.context=this[0]=a,this.length=1;return this}if(a==="body"&&!d&&c.body){this.context=c,this[0]=c.body,this.selector=a,this.length=1;return this}if(typeof a=="string"){a.charAt(0)!=="<"||a.charAt(a.length-1)!==">"||a.length<3?g=i.exec(a):g=[null,a,null];if(g&&(g[1]||!d)){if(g[1]){d=d instanceof e?d[0]:d,k=d?d.ownerDocument||d:c,j=m.exec(a),j?e.isPlainObject(d)?(a=[c.createElement(j[1])],e.fn.attr.call(a,d,!0)):a=[k.createElement(j[1])]:(j=e.buildFragment([g[1]],[k]),a=(j.cacheable?e.clone(j.fragment):j.fragment).childNodes);return e.merge(this,a)}h=c.getElementById(g[2]);if(h&&h.parentNode){if(h.id!==g[2])return f.find(a);this.length=1,this[0]=h}this.context=c,this.selector=a;return this}return!d||d.jquery?(d||f).find(a):this.constructor(d).find(a)}if(e.isFunction(a))return f.ready(a);a.selector!==b&&(this.selector=a.selector,this.context=a.context);return e.makeArray(a,this)},selector:"",jquery:"1.7.1",length:0,size:function(){return this.length},toArray:function(){return F.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var d=this.constructor();e.isArray(a)?E.apply(d,a):e.merge(d,a),d.prevObject=this,d.context=this.context,b==="find"?d.selector=this.selector+(this.selector?" ":"")+c:b&&(d.selector=this.selector+"."+b+"("+c+")");return d},each:function(a,b){return e.each(this,a,b)},ready:function(a){e.bindReady(),A.add(a);return this},eq:function(a){a=+a;return a===-1?this.slice(a):this.slice(a,a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(F.apply(this,arguments),"slice",F.call(arguments).join(","))},map:function(a){return this.pushStack(e.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:E,sort:[].sort,splice:[].splice},e.fn.init.prototype=e.fn,e.extend=e.fn.extend=function(){var a,c,d,f,g,h,i=arguments[0]||{},j=1,k=arguments.length,l=!1;typeof i=="boolean"&&(l=i,i=arguments[1]||{},j=2),typeof i!="object"&&!e.isFunction(i)&&(i={}),k===j&&(i=this,--j);for(;j0)return;A.fireWith(c,[e]),e.fn.trigger&&e(c).trigger("ready").off("ready")}},bindReady:function(){if(!A){A=e.Callbacks("once memory");if(c.readyState==="complete")return setTimeout(e.ready,1);if(c.addEventListener)c.addEventListener("DOMContentLoaded",B,!1),a.addEventListener("load",e.ready,!1);else if(c.attachEvent){c.attachEvent("onreadystatechange",B),a.attachEvent("onload",e.ready);var b=!1;try{b=a.frameElement==null}catch(d){}c.documentElement.doScroll&&b&&J()}}},isFunction:function(a){return e.type(a)==="function"},isArray:Array.isArray||function(a){return e.type(a)==="array"},isWindow:function(a){return a&&typeof a=="object"&&"setInterval"in a},isNumeric:function(a){return!isNaN(parseFloat(a))&&isFinite(a)},type:function(a){return a==null?String(a):I[C.call(a)]||"object"},isPlainObject:function(a){if(!a||e.type(a)!=="object"||a.nodeType||e.isWindow(a))return!1;try{if(a.constructor&&!D.call(a,"constructor")&&!D.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}var d;for(d in a);return d===b||D.call(a,d)},isEmptyObject:function(a){for(var b in a)return!1;return!0},error:function(a){throw new Error(a)},parseJSON:function(b){if(typeof b!="string"||!b)return null;b=e.trim(b);if(a.JSON&&a.JSON.parse)return a.JSON.parse(b);if(n.test(b.replace(o,"@").replace(p,"]").replace(q,"")))return(new Function("return "+b))();e.error("Invalid JSON: "+b)},parseXML:function(c){var d,f;try{a.DOMParser?(f=new DOMParser,d=f.parseFromString(c,"text/xml")):(d=new ActiveXObject("Microsoft.XMLDOM"),d.async="false",d.loadXML(c))}catch(g){d=b}(!d||!d.documentElement||d.getElementsByTagName("parsererror").length)&&e.error("Invalid XML: "+c);return d},noop:function(){},globalEval:function(b){b&&j.test(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(w,"ms-").replace(v,x)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,c,d){var f,g=0,h=a.length,i=h===b||e.isFunction(a);if(d){if(i){for(f in a)if(c.apply(a[f],d)===!1)break}else for(;g0&&a[0]&&a[j-1]||j===0||e.isArray(a));if(k)for(;i1?i.call(arguments,0):b,j.notifyWith(k,e)}}function l(a){return function(c){b[a]=arguments.length>1?i.call(arguments,0):c,--g||j.resolveWith(j,b)}}var b=i.call(arguments,0),c=0,d=b.length,e=Array(d),g=d,h=d,j=d<=1&&a&&f.isFunction(a.promise)?a:f.Deferred(),k=j.promise();if(d>1){for(;c
a",d=q.getElementsByTagName("*"),e=q.getElementsByTagName("a")[0];if(!d||!d.length||!e)return{};g=c.createElement("select"),h=g.appendChild(c.createElement("option")),i=q.getElementsByTagName("input")[0],b={leadingWhitespace:q.firstChild.nodeType===3,tbody:!q.getElementsByTagName("tbody").length,htmlSerialize:!!q.getElementsByTagName("link").length,style:/top/.test(e.getAttribute("style")),hrefNormalized:e.getAttribute("href")==="/a",opacity:/^0.55/.test(e.style.opacity),cssFloat:!!e.style.cssFloat,checkOn:i.value==="on",optSelected:h.selected,getSetAttribute:q.className!=="t",enctype:!!c.createElement("form").enctype,html5Clone:c.createElement("nav").cloneNode(!0).outerHTML!=="<:nav>",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0},i.checked=!0,b.noCloneChecked=i.cloneNode(!0).checked,g.disabled=!0,b.optDisabled=!h.disabled;try{delete q.test}catch(s){b.deleteExpando=!1}!q.addEventListener&&q.attachEvent&&q.fireEvent&&(q.attachEvent("onclick",function(){b.noCloneEvent=!1}),q.cloneNode(!0).fireEvent("onclick")),i=c.createElement("input"),i.value="t",i.setAttribute("type","radio"),b.radioValue=i.value==="t",i.setAttribute("checked","checked"),q.appendChild(i),k=c.createDocumentFragment(),k.appendChild(q.lastChild),b.checkClone=k.cloneNode(!0).cloneNode(!0).lastChild.checked,b.appendChecked=i.checked,k.removeChild(i),k.appendChild(q),q.innerHTML="",a.getComputedStyle&&(j=c.createElement("div"),j.style.width="0",j.style.marginRight="0",q.style.width="2px",q.appendChild(j),b.reliableMarginRight=(parseInt((a.getComputedStyle(j,null)||{marginRight:0}).marginRight,10)||0)===0);if(q.attachEvent)for(o in{submit:1,change:1,focusin:1})n="on"+o,p=n in q,p||(q.setAttribute(n,"return;"),p=typeof q[n]=="function"),b[o+"Bubbles"]=p;k.removeChild(q),k=g=h=j=q=i=null,f(function(){var a,d,e,g,h,i,j,k,m,n,o,r=c.getElementsByTagName("body")[0];!r||(j=1,k="position:absolute;top:0;left:0;width:1px;height:1px;margin:0;",m="visibility:hidden;border:0;",n="style='"+k+"border:5px solid #000;padding:0;'",o="
"+""+"
",a=c.createElement("div"),a.style.cssText=m+"width:0;height:0;position:static;top:0;margin-top:"+j+"px",r.insertBefore(a,r.firstChild),q=c.createElement("div"),a.appendChild(q),q.innerHTML="
t
",l=q.getElementsByTagName("td"),p=l[0].offsetHeight===0,l[0].style.display="",l[1].style.display="none",b.reliableHiddenOffsets=p&&l[0].offsetHeight===0,q.innerHTML="",q.style.width=q.style.paddingLeft="1px",f.boxModel=b.boxModel=q.offsetWidth===2,typeof q.style.zoom!="undefined"&&(q.style.display="inline",q.style.zoom=1,b.inlineBlockNeedsLayout=q.offsetWidth===2,q.style.display="",q.innerHTML="
",b.shrinkWrapBlocks=q.offsetWidth!==2),q.style.cssText=k+m,q.innerHTML=o,d=q.firstChild,e=d.firstChild,h=d.nextSibling.firstChild.firstChild,i={doesNotAddBorder:e.offsetTop!==5,doesAddBorderForTableAndCells:h.offsetTop===5},e.style.position="fixed",e.style.top="20px",i.fixedPosition=e.offsetTop===20||e.offsetTop===15,e.style.position=e.style.top="",d.style.overflow="hidden",d.style.position="relative",i.subtractsBorderForOverflowNotVisible=e.offsetTop===-5,i.doesNotIncludeMarginInBodyOffset=r.offsetTop!==j,r.removeChild(a),q=a=null,f.extend(b,i))});return b}();var j=/^(?:\{.*\}|\[.*\])$/,k=/([A-Z])/g;f.extend({cache:{},uuid:0,expando:"jQuery"+(f.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(a){a=a.nodeType?f.cache[a[f.expando]]:a[f.expando];return!!a&&!m(a)},data:function(a,c,d,e){if(!!f.acceptData(a)){var g,h,i,j=f.expando,k=typeof c=="string",l=a.nodeType,m=l?f.cache:a,n=l?a[j]:a[j]&&j,o=c==="events";if((!n||!m[n]||!o&&!e&&!m[n].data)&&k&&d===b)return;n||(l?a[j]=n=++f.uuid:n=j),m[n]||(m[n]={},l||(m[n].toJSON=f.noop));if(typeof c=="object"||typeof c=="function")e?m[n]=f.extend(m[n],c):m[n].data=f.extend(m[n].data,c);g=h=m[n],e||(h.data||(h.data={}),h=h.data),d!==b&&(h[f.camelCase(c)]=d);if(o&&!h[c])return g.events;k?(i=h[c],i==null&&(i=h[f.camelCase(c)])):i=h;return i}},removeData:function(a,b,c){if(!!f.acceptData(a)){var d,e,g,h=f.expando,i=a.nodeType,j=i?f.cache:a,k=i?a[h]:h;if(!j[k])return;if(b){d=c?j[k]:j[k].data;if(d){f.isArray(b)||(b in d?b=[b]:(b=f.camelCase(b),b in d?b=[b]:b=b.split(" ")));for(e=0,g=b.length;e-1)return!0;return!1},val:function(a){var c,d,e,g=this[0];{if(!!arguments.length){e=f.isFunction(a);return this.each(function(d){var g=f(this),h;if(this.nodeType===1){e?h=a.call(this,d,g.val()):h=a,h==null?h="":typeof h=="number"?h+="":f.isArray(h)&&(h=f.map(h,function(a){return a==null?"":a+""})),c=f.valHooks[this.nodeName.toLowerCase()]||f.valHooks[this.type];if(!c||!("set"in c)||c.set(this,h,"value")===b)this.value=h}})}if(g){c=f.valHooks[g.nodeName.toLowerCase()]||f.valHooks[g.type];if(c&&"get"in c&&(d=c.get(g,"value"))!==b)return d;d=g.value;return typeof d=="string"?d.replace(q,""):d==null?"":d}}}}),f.extend({valHooks:{option:{get:function(a){var b=a.attributes.value;return!b||b.specified?a.value:a.text}},select:{get:function(a){var b,c,d,e,g=a.selectedIndex,h=[],i=a.options,j=a.type==="select-one";if(g<0)return null;c=j?g:0,d=j?g+1:i.length;for(;c=0}),c.length||(a.selectedIndex=-1);return c}}},attrFn:{val:!0,css:!0,html:!0,text:!0,data:!0,width:!0,height:!0,offset:!0},attr:function(a,c,d,e){var g,h,i,j=a.nodeType;if(!!a&&j!==3&&j!==8&&j!==2){if(e&&c in f.attrFn)return f(a)[c](d);if(typeof a.getAttribute=="undefined")return f.prop(a,c,d);i=j!==1||!f.isXMLDoc(a),i&&(c=c.toLowerCase(),h=f.attrHooks[c]||(u.test(c)?x:w));if(d!==b){if(d===null){f.removeAttr(a,c);return}if(h&&"set"in h&&i&&(g=h.set(a,d,c))!==b)return g;a.setAttribute(c,""+d);return d}if(h&&"get"in h&&i&&(g=h.get(a,c))!==null)return g;g=a.getAttribute(c);return g===null?b:g}},removeAttr:function(a,b){var c,d,e,g,h=0;if(b&&a.nodeType===1){d=b.toLowerCase().split(p),g=d.length;for(;h=0}})});var z=/^(?:textarea|input|select)$/i,A=/^([^\.]*)?(?:\.(.+))?$/,B=/\bhover(\.\S+)?\b/,C=/^key/,D=/^(?:mouse|contextmenu)|click/,E=/^(?:focusinfocus|focusoutblur)$/,F=/^(\w*)(?:#([\w\-]+))?(?:\.([\w\-]+))?$/,G=function(a){var b=F.exec(a);b&&(b[1]=(b[1]||"").toLowerCase(),b[3]=b[3]&&new RegExp("(?:^|\\s)"+b[3]+"(?:\\s|$)"));return b},H=function(a,b){var c=a.attributes||{};return(!b[1]||a.nodeName.toLowerCase()===b[1])&&(!b[2]||(c.id||{}).value===b[2])&&(!b[3]||b[3].test((c["class"]||{}).value))},I=function(a){return f.event.special.hover?a:a.replace(B,"mouseenter$1 mouseleave$1")}; +f.event={add:function(a,c,d,e,g){var h,i,j,k,l,m,n,o,p,q,r,s;if(!(a.nodeType===3||a.nodeType===8||!c||!d||!(h=f._data(a)))){d.handler&&(p=d,d=p.handler),d.guid||(d.guid=f.guid++),j=h.events,j||(h.events=j={}),i=h.handle,i||(h.handle=i=function(a){return typeof f!="undefined"&&(!a||f.event.triggered!==a.type)?f.event.dispatch.apply(i.elem,arguments):b},i.elem=a),c=f.trim(I(c)).split(" ");for(k=0;k=0&&(h=h.slice(0,-1),k=!0),h.indexOf(".")>=0&&(i=h.split("."),h=i.shift(),i.sort());if((!e||f.event.customEvent[h])&&!f.event.global[h])return;c=typeof c=="object"?c[f.expando]?c:new f.Event(h,c):new f.Event(h),c.type=h,c.isTrigger=!0,c.exclusive=k,c.namespace=i.join("."),c.namespace_re=c.namespace?new RegExp("(^|\\.)"+i.join("\\.(?:.*\\.)?")+"(\\.|$)"):null,o=h.indexOf(":")<0?"on"+h:"";if(!e){j=f.cache;for(l in j)j[l].events&&j[l].events[h]&&f.event.trigger(c,d,j[l].handle.elem,!0);return}c.result=b,c.target||(c.target=e),d=d!=null?f.makeArray(d):[],d.unshift(c),p=f.event.special[h]||{};if(p.trigger&&p.trigger.apply(e,d)===!1)return;r=[[e,p.bindType||h]];if(!g&&!p.noBubble&&!f.isWindow(e)){s=p.delegateType||h,m=E.test(s+h)?e:e.parentNode,n=null;for(;m;m=m.parentNode)r.push([m,s]),n=m;n&&n===e.ownerDocument&&r.push([n.defaultView||n.parentWindow||a,s])}for(l=0;le&&i.push({elem:this,matches:d.slice(e)});for(j=0;j0?this.on(b,null,a,c):this.trigger(b)},f.attrFn&&(f.attrFn[b]=!0),C.test(b)&&(f.event.fixHooks[b]=f.event.keyHooks),D.test(b)&&(f.event.fixHooks[b]=f.event.mouseHooks)}),function(){function x(a,b,c,e,f,g){for(var h=0,i=e.length;h0){k=j;break}}j=j[a]}e[h]=k}}}function w(a,b,c,e,f,g){for(var h=0,i=e.length;h+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,d="sizcache"+(Math.random()+"").replace(".",""),e=0,g=Object.prototype.toString,h=!1,i=!0,j=/\\/g,k=/\r\n/g,l=/\W/;[0,0].sort(function(){i=!1;return 0});var m=function(b,d,e,f){e=e||[],d=d||c;var h=d;if(d.nodeType!==1&&d.nodeType!==9)return[];if(!b||typeof b!="string")return e;var i,j,k,l,n,q,r,t,u=!0,v=m.isXML(d),w=[],x=b;do{a.exec(""),i=a.exec(x);if(i){x=i[3],w.push(i[1]);if(i[2]){l=i[3];break}}}while(i);if(w.length>1&&p.exec(b))if(w.length===2&&o.relative[w[0]])j=y(w[0]+w[1],d,f);else{j=o.relative[w[0]]?[d]:m(w.shift(),d);while(w.length)b=w.shift(),o.relative[b]&&(b+=w.shift()),j=y(b,j,f)}else{!f&&w.length>1&&d.nodeType===9&&!v&&o.match.ID.test(w[0])&&!o.match.ID.test(w[w.length-1])&&(n=m.find(w.shift(),d,v),d=n.expr?m.filter(n.expr,n.set)[0]:n.set[0]);if(d){n=f?{expr:w.pop(),set:s(f)}:m.find(w.pop(),w.length===1&&(w[0]==="~"||w[0]==="+")&&d.parentNode?d.parentNode:d,v),j=n.expr?m.filter(n.expr,n.set):n.set,w.length>0?k=s(j):u=!1;while(w.length)q=w.pop(),r=q,o.relative[q]?r=w.pop():q="",r==null&&(r=d),o.relative[q](k,r,v)}else k=w=[]}k||(k=j),k||m.error(q||b);if(g.call(k)==="[object Array]")if(!u)e.push.apply(e,k);else if(d&&d.nodeType===1)for(t=0;k[t]!=null;t++)k[t]&&(k[t]===!0||k[t].nodeType===1&&m.contains(d,k[t]))&&e.push(j[t]);else for(t=0;k[t]!=null;t++)k[t]&&k[t].nodeType===1&&e.push(j[t]);else s(k,e);l&&(m(l,h,e,f),m.uniqueSort(e));return e};m.uniqueSort=function(a){if(u){h=i,a.sort(u);if(h)for(var b=1;b0},m.find=function(a,b,c){var d,e,f,g,h,i;if(!a)return[];for(e=0,f=o.order.length;e":function(a,b){var c,d=typeof b=="string",e=0,f=a.length;if(d&&!l.test(b)){b=b.toLowerCase();for(;e=0)?c||d.push(h):c&&(b[g]=!1));return!1},ID:function(a){return a[1].replace(j,"")},TAG:function(a,b){return a[1].replace(j,"").toLowerCase()},CHILD:function(a){if(a[1]==="nth"){a[2]||m.error(a[0]),a[2]=a[2].replace(/^\+|\s*/g,"");var b=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(a[2]==="even"&&"2n"||a[2]==="odd"&&"2n+1"||!/\D/.test(a[2])&&"0n+"+a[2]||a[2]);a[2]=b[1]+(b[2]||1)-0,a[3]=b[3]-0}else a[2]&&m.error(a[0]);a[0]=e++;return a},ATTR:function(a,b,c,d,e,f){var g=a[1]=a[1].replace(j,"");!f&&o.attrMap[g]&&(a[1]=o.attrMap[g]),a[4]=(a[4]||a[5]||"").replace(j,""),a[2]==="~="&&(a[4]=" "+a[4]+" ");return a},PSEUDO:function(b,c,d,e,f){if(b[1]==="not")if((a.exec(b[3])||"").length>1||/^\w/.test(b[3]))b[3]=m(b[3],null,null,c);else{var g=m.filter(b[3],c,d,!0^f);d||e.push.apply(e,g);return!1}else if(o.match.POS.test(b[0])||o.match.CHILD.test(b[0]))return!0;return b},POS:function(a){a.unshift(!0);return a}},filters:{enabled:function(a){return a.disabled===!1&&a.type!=="hidden"},disabled:function(a){return a.disabled===!0},checked:function(a){return a.checked===!0},selected:function(a){a.parentNode&&a.parentNode.selectedIndex;return a.selected===!0},parent:function(a){return!!a.firstChild},empty:function(a){return!a.firstChild},has:function(a,b,c){return!!m(c[3],a).length},header:function(a){return/h\d/i.test(a.nodeName)},text:function(a){var b=a.getAttribute("type"),c=a.type;return a.nodeName.toLowerCase()==="input"&&"text"===c&&(b===c||b===null)},radio:function(a){return a.nodeName.toLowerCase()==="input"&&"radio"===a.type},checkbox:function(a){return a.nodeName.toLowerCase()==="input"&&"checkbox"===a.type},file:function(a){return a.nodeName.toLowerCase()==="input"&&"file"===a.type},password:function(a){return a.nodeName.toLowerCase()==="input"&&"password"===a.type},submit:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"submit"===a.type},image:function(a){return a.nodeName.toLowerCase()==="input"&&"image"===a.type},reset:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"reset"===a.type},button:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&"button"===a.type||b==="button"},input:function(a){return/input|select|textarea|button/i.test(a.nodeName)},focus:function(a){return a===a.ownerDocument.activeElement}},setFilters:{first:function(a,b){return b===0},last:function(a,b,c,d){return b===d.length-1},even:function(a,b){return b%2===0},odd:function(a,b){return b%2===1},lt:function(a,b,c){return bc[3]-0},nth:function(a,b,c){return c[3]-0===b},eq:function(a,b,c){return c[3]-0===b}},filter:{PSEUDO:function(a,b,c,d){var e=b[1],f=o.filters[e];if(f)return f(a,c,b,d);if(e==="contains")return(a.textContent||a.innerText||n([a])||"").indexOf(b[3])>=0;if(e==="not"){var g=b[3];for(var h=0,i=g.length;h=0}},ID:function(a,b){return a.nodeType===1&&a.getAttribute("id")===b},TAG:function(a,b){return b==="*"&&a.nodeType===1||!!a.nodeName&&a.nodeName.toLowerCase()===b},CLASS:function(a,b){return(" "+(a.className||a.getAttribute("class"))+" ").indexOf(b)>-1},ATTR:function(a,b){var c=b[1],d=m.attr?m.attr(a,c):o.attrHandle[c]?o.attrHandle[c](a):a[c]!=null?a[c]:a.getAttribute(c),e=d+"",f=b[2],g=b[4];return d==null?f==="!=":!f&&m.attr?d!=null:f==="="?e===g:f==="*="?e.indexOf(g)>=0:f==="~="?(" "+e+" ").indexOf(g)>=0:g?f==="!="?e!==g:f==="^="?e.indexOf(g)===0:f==="$="?e.substr(e.length-g.length)===g:f==="|="?e===g||e.substr(0,g.length+1)===g+"-":!1:e&&d!==!1},POS:function(a,b,c,d){var e=b[2],f=o.setFilters[e];if(f)return f(a,c,b,d)}}},p=o.match.POS,q=function(a,b){return"\\"+(b-0+1)};for(var r in o.match)o.match[r]=new RegExp(o.match[r].source+/(?![^\[]*\])(?![^\(]*\))/.source),o.leftMatch[r]=new RegExp(/(^(?:.|\r|\n)*?)/.source+o.match[r].source.replace(/\\(\d+)/g,q));var s=function(a,b){a=Array.prototype.slice.call(a,0);if(b){b.push.apply(b,a);return b}return a};try{Array.prototype.slice.call(c.documentElement.childNodes,0)[0].nodeType}catch(t){s=function(a,b){var c=0,d=b||[];if(g.call(a)==="[object Array]")Array.prototype.push.apply(d,a);else if(typeof a.length=="number")for(var e=a.length;c",e.insertBefore(a,e.firstChild),c.getElementById(d)&&(o.find.ID=function(a,c,d){if(typeof c.getElementById!="undefined"&&!d){var e=c.getElementById(a[1]);return e?e.id===a[1]||typeof e.getAttributeNode!="undefined"&&e.getAttributeNode("id").nodeValue===a[1]?[e]:b:[]}},o.filter.ID=function(a,b){var c=typeof a.getAttributeNode!="undefined"&&a.getAttributeNode("id");return a.nodeType===1&&c&&c.nodeValue===b}),e.removeChild(a),e=a=null}(),function(){var a=c.createElement("div");a.appendChild(c.createComment("")),a.getElementsByTagName("*").length>0&&(o.find.TAG=function(a,b){var c=b.getElementsByTagName(a[1]);if(a[1]==="*"){var d=[];for(var e=0;c[e];e++)c[e].nodeType===1&&d.push(c[e]);c=d}return c}),a.innerHTML="",a.firstChild&&typeof a.firstChild.getAttribute!="undefined"&&a.firstChild.getAttribute("href")!=="#"&&(o.attrHandle.href=function(a){return a.getAttribute("href",2)}),a=null}(),c.querySelectorAll&&function(){var a=m,b=c.createElement("div"),d="__sizzle__";b.innerHTML="

";if(!b.querySelectorAll||b.querySelectorAll(".TEST").length!==0){m=function(b,e,f,g){e=e||c;if(!g&&!m.isXML(e)){var h=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b);if(h&&(e.nodeType===1||e.nodeType===9)){if(h[1])return s(e.getElementsByTagName(b),f);if(h[2]&&o.find.CLASS&&e.getElementsByClassName)return s(e.getElementsByClassName(h[2]),f)}if(e.nodeType===9){if(b==="body"&&e.body)return s([e.body],f);if(h&&h[3]){var i=e.getElementById(h[3]);if(!i||!i.parentNode)return s([],f);if(i.id===h[3])return s([i],f)}try{return s(e.querySelectorAll(b),f)}catch(j){}}else if(e.nodeType===1&&e.nodeName.toLowerCase()!=="object"){var k=e,l=e.getAttribute("id"),n=l||d,p=e.parentNode,q=/^\s*[+~]/.test(b);l?n=n.replace(/'/g,"\\$&"):e.setAttribute("id",n),q&&p&&(e=e.parentNode);try{if(!q||p)return s(e.querySelectorAll("[id='"+n+"'] "+b),f)}catch(r){}finally{l||k.removeAttribute("id")}}}return a(b,e,f,g)};for(var e in a)m[e]=a[e];b=null}}(),function(){var a=c.documentElement,b=a.matchesSelector||a.mozMatchesSelector||a.webkitMatchesSelector||a.msMatchesSelector;if(b){var d=!b.call(c.createElement("div"),"div"),e=!1;try{b.call(c.documentElement,"[test!='']:sizzle")}catch(f){e=!0}m.matchesSelector=function(a,c){c=c.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!m.isXML(a))try{if(e||!o.match.PSEUDO.test(c)&&!/!=/.test(c)){var f=b.call(a,c);if(f||!d||a.document&&a.document.nodeType!==11)return f}}catch(g){}return m(c,null,null,[a]).length>0}}}(),function(){var a=c.createElement("div");a.innerHTML="
";if(!!a.getElementsByClassName&&a.getElementsByClassName("e").length!==0){a.lastChild.className="e";if(a.getElementsByClassName("e").length===1)return;o.order.splice(1,0,"CLASS"),o.find.CLASS=function(a,b,c){if(typeof b.getElementsByClassName!="undefined"&&!c)return b.getElementsByClassName(a[1])},a=null}}(),c.documentElement.contains?m.contains=function(a,b){return a!==b&&(a.contains?a.contains(b):!0)}:c.documentElement.compareDocumentPosition?m.contains=function(a,b){return!!(a.compareDocumentPosition(b)&16)}:m.contains=function(){return!1},m.isXML=function(a){var b=(a?a.ownerDocument||a:0).documentElement;return b?b.nodeName!=="HTML":!1};var y=function(a,b,c){var d,e=[],f="",g=b.nodeType?[b]:b;while(d=o.match.PSEUDO.exec(a))f+=d[0],a=a.replace(o.match.PSEUDO,"");a=o.relative[a]?a+"*":a;for(var h=0,i=g.length;h0)for(h=g;h=0:f.filter(a,this).length>0:this.filter(a).length>0)},closest:function(a,b){var c=[],d,e,g=this[0];if(f.isArray(a)){var h=1;while(g&&g.ownerDocument&&g!==b){for(d=0;d-1:f.find.matchesSelector(g,a)){c.push(g);break}g=g.parentNode;if(!g||!g.ownerDocument||g===b||g.nodeType===11)break}}c=c.length>1?f.unique(c):c;return this.pushStack(c,"closest",a)},index:function(a){if(!a)return this[0]&&this[0].parentNode?this.prevAll().length:-1;if(typeof a=="string")return f.inArray(this[0],f(a));return f.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var c=typeof a=="string"?f(a,b):f.makeArray(a&&a.nodeType?[a]:a),d=f.merge(this.get(),c);return this.pushStack(S(c[0])||S(d[0])?d:f.unique(d))},andSelf:function(){return this.add(this.prevObject)}}),f.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return f.dir(a,"parentNode")},parentsUntil:function(a,b,c){return f.dir(a,"parentNode",c)},next:function(a){return f.nth(a,2,"nextSibling")},prev:function(a){return f.nth(a,2,"previousSibling")},nextAll:function(a){return f.dir(a,"nextSibling")},prevAll:function(a){return f.dir(a,"previousSibling")},nextUntil:function(a,b,c){return f.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return f.dir(a,"previousSibling",c)},siblings:function(a){return f.sibling(a.parentNode.firstChild,a)},children:function(a){return f.sibling(a.firstChild)},contents:function(a){return f.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:f.makeArray(a.childNodes)}},function(a,b){f.fn[a]=function(c,d){var e=f.map(this,b,c);L.test(a)||(d=c),d&&typeof d=="string"&&(e=f.filter(d,e)),e=this.length>1&&!R[a]?f.unique(e):e,(this.length>1||N.test(d))&&M.test(a)&&(e=e.reverse());return this.pushStack(e,a,P.call(arguments).join(","))}}),f.extend({filter:function(a,b,c){c&&(a=":not("+a+")");return b.length===1?f.find.matchesSelector(b[0],a)?[b[0]]:[]:f.find.matches(a,b)},dir:function(a,c,d){var e=[],g=a[c];while(g&&g.nodeType!==9&&(d===b||g.nodeType!==1||!f(g).is(d)))g.nodeType===1&&e.push(g),g=g[c];return e},nth:function(a,b,c,d){b=b||1;var e=0;for(;a;a=a[c])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)a.nodeType===1&&a!==b&&c.push(a);return c}});var V="abbr|article|aside|audio|canvas|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",W=/ jQuery\d+="(?:\d+|null)"/g,X=/^\s+/,Y=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,Z=/<([\w:]+)/,$=/",""],legend:[1,"
","
"],thead:[1,"","
"],tr:[2,"","
"],td:[3,"","
"],col:[2,"","
"],area:[1,"",""],_default:[0,"",""]},bh=U(c);bg.optgroup=bg.option,bg.tbody=bg.tfoot=bg.colgroup=bg.caption=bg.thead,bg.th=bg.td,f.support.htmlSerialize||(bg._default=[1,"div
","
"]),f.fn.extend({text:function(a){if(f.isFunction(a))return this.each(function(b){var c=f(this);c.text(a.call(this,b,c.text()))});if(typeof a!="object"&&a!==b)return this.empty().append((this[0]&&this[0].ownerDocument||c).createTextNode(a));return f.text(this)},wrapAll:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapAll(a.call(this,b))});if(this[0]){var b=f(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapInner(a.call(this,b))});return this.each(function(){var b=f(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=f.isFunction(a);return this.each(function(c){f(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){f.nodeName(this,"body")||f(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var a=f.clean(arguments);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,f.clean(arguments));return a}},remove:function(a,b){for(var c=0,d;(d=this[c])!=null;c++)if(!a||f.filter(a,[d]).length)!b&&d.nodeType===1&&(f.cleanData(d.getElementsByTagName("*")),f.cleanData([d])),d.parentNode&&d.parentNode.removeChild(d);return this},empty:function() +{for(var a=0,b;(b=this[a])!=null;a++){b.nodeType===1&&f.cleanData(b.getElementsByTagName("*"));while(b.firstChild)b.removeChild(b.firstChild)}return this},clone:function(a,b){a=a==null?!1:a,b=b==null?a:b;return this.map(function(){return f.clone(this,a,b)})},html:function(a){if(a===b)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(W,""):null;if(typeof a=="string"&&!ba.test(a)&&(f.support.leadingWhitespace||!X.test(a))&&!bg[(Z.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Y,"<$1>");try{for(var c=0,d=this.length;c1&&l0?this.clone(!0):this).get();f(e[h])[b](j),d=d.concat(j)}return this.pushStack(d,a,e.selector)}}),f.extend({clone:function(a,b,c){var d,e,g,h=f.support.html5Clone||!bc.test("<"+a.nodeName)?a.cloneNode(!0):bo(a);if((!f.support.noCloneEvent||!f.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!f.isXMLDoc(a)){bk(a,h),d=bl(a),e=bl(h);for(g=0;d[g];++g)e[g]&&bk(d[g],e[g])}if(b){bj(a,h);if(c){d=bl(a),e=bl(h);for(g=0;d[g];++g)bj(d[g],e[g])}}d=e=null;return h},clean:function(a,b,d,e){var g;b=b||c,typeof b.createElement=="undefined"&&(b=b.ownerDocument||b[0]&&b[0].ownerDocument||c);var h=[],i;for(var j=0,k;(k=a[j])!=null;j++){typeof k=="number"&&(k+="");if(!k)continue;if(typeof k=="string")if(!_.test(k))k=b.createTextNode(k);else{k=k.replace(Y,"<$1>");var l=(Z.exec(k)||["",""])[1].toLowerCase(),m=bg[l]||bg._default,n=m[0],o=b.createElement("div");b===c?bh.appendChild(o):U(b).appendChild(o),o.innerHTML=m[1]+k+m[2];while(n--)o=o.lastChild;if(!f.support.tbody){var p=$.test(k),q=l==="table"&&!p?o.firstChild&&o.firstChild.childNodes:m[1]===""&&!p?o.childNodes:[];for(i=q.length-1;i>=0;--i)f.nodeName(q[i],"tbody")&&!q[i].childNodes.length&&q[i].parentNode.removeChild(q[i])}!f.support.leadingWhitespace&&X.test(k)&&o.insertBefore(b.createTextNode(X.exec(k)[0]),o.firstChild),k=o.childNodes}var r;if(!f.support.appendChecked)if(k[0]&&typeof (r=k.length)=="number")for(i=0;i=0)return b+"px"}}}),f.support.opacity||(f.cssHooks.opacity={get:function(a,b){return br.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=f.isNumeric(b)?"alpha(opacity="+b*100+")":"",g=d&&d.filter||c.filter||"";c.zoom=1;if(b>=1&&f.trim(g.replace(bq,""))===""){c.removeAttribute("filter");if(d&&!d.filter)return}c.filter=bq.test(g)?g.replace(bq,e):g+" "+e}}),f(function(){f.support.reliableMarginRight||(f.cssHooks.marginRight={get:function(a,b){var c;f.swap(a,{display:"inline-block"},function(){b?c=bz(a,"margin-right","marginRight"):c=a.style.marginRight});return c}})}),c.defaultView&&c.defaultView.getComputedStyle&&(bA=function(a,b){var c,d,e;b=b.replace(bs,"-$1").toLowerCase(),(d=a.ownerDocument.defaultView)&&(e=d.getComputedStyle(a,null))&&(c=e.getPropertyValue(b),c===""&&!f.contains(a.ownerDocument.documentElement,a)&&(c=f.style(a,b)));return c}),c.documentElement.currentStyle&&(bB=function(a,b){var c,d,e,f=a.currentStyle&&a.currentStyle[b],g=a.style;f===null&&g&&(e=g[b])&&(f=e),!bt.test(f)&&bu.test(f)&&(c=g.left,d=a.runtimeStyle&&a.runtimeStyle.left,d&&(a.runtimeStyle.left=a.currentStyle.left),g.left=b==="fontSize"?"1em":f||0,f=g.pixelLeft+"px",g.left=c,d&&(a.runtimeStyle.left=d));return f===""?"auto":f}),bz=bA||bB,f.expr&&f.expr.filters&&(f.expr.filters.hidden=function(a){var b=a.offsetWidth,c=a.offsetHeight;return b===0&&c===0||!f.support.reliableHiddenOffsets&&(a.style&&a.style.display||f.css(a,"display"))==="none"},f.expr.filters.visible=function(a){return!f.expr.filters.hidden(a)});var bD=/%20/g,bE=/\[\]$/,bF=/\r?\n/g,bG=/#.*$/,bH=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,bI=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,bJ=/^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,bK=/^(?:GET|HEAD)$/,bL=/^\/\//,bM=/\?/,bN=/)<[^<]*)*<\/script>/gi,bO=/^(?:select|textarea)/i,bP=/\s+/,bQ=/([?&])_=[^&]*/,bR=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,bS=f.fn.load,bT={},bU={},bV,bW,bX=["*/"]+["*"];try{bV=e.href}catch(bY){bV=c.createElement("a"),bV.href="",bV=bV.href}bW=bR.exec(bV.toLowerCase())||[],f.fn.extend({load:function(a,c,d){if(typeof a!="string"&&bS)return bS.apply(this,arguments);if(!this.length)return this;var e=a.indexOf(" ");if(e>=0){var g=a.slice(e,a.length);a=a.slice(0,e)}var h="GET";c&&(f.isFunction(c)?(d=c,c=b):typeof c=="object"&&(c=f.param(c,f.ajaxSettings.traditional),h="POST"));var i=this;f.ajax({url:a,type:h,dataType:"html",data:c,complete:function(a,b,c){c=a.responseText,a.isResolved()&&(a.done(function(a){c=a}),i.html(g?f("
").append(c.replace(bN,"")).find(g):c)),d&&i.each(d,[c,b,a])}});return this},serialize:function(){return f.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?f.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||bO.test(this.nodeName)||bI.test(this.type))}).map(function(a,b){var c=f(this).val();return c==null?null:f.isArray(c)?f.map(c,function(a,c){return{name:b.name,value:a.replace(bF,"\r\n")}}):{name:b.name,value:c.replace(bF,"\r\n")}}).get()}}),f.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){f.fn[b]=function(a){return this.on(b,a)}}),f.each(["get","post"],function(a,c){f[c]=function(a,d,e,g){f.isFunction(d)&&(g=g||e,e=d,d=b);return f.ajax({type:c,url:a,data:d,success:e,dataType:g})}}),f.extend({getScript:function(a,c){return f.get(a,b,c,"script")},getJSON:function(a,b,c){return f.get(a,b,c,"json")},ajaxSetup:function(a,b){b?b_(a,f.ajaxSettings):(b=a,a=f.ajaxSettings),b_(a,b);return a},ajaxSettings:{url:bV,isLocal:bJ.test(bW[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":bX},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":a.String,"text html":!0,"text json":f.parseJSON,"text xml":f.parseXML},flatOptions:{context:!0,url:!0}},ajaxPrefilter:bZ(bT),ajaxTransport:bZ(bU),ajax:function(a,c){function w(a,c,l,m){if(s!==2){s=2,q&&clearTimeout(q),p=b,n=m||"",v.readyState=a>0?4:0;var o,r,u,w=c,x=l?cb(d,v,l):b,y,z;if(a>=200&&a<300||a===304){if(d.ifModified){if(y=v.getResponseHeader("Last-Modified"))f.lastModified[k]=y;if(z=v.getResponseHeader("Etag"))f.etag[k]=z}if(a===304)w="notmodified",o=!0;else try{r=cc(d,x),w="success",o=!0}catch(A){w="parsererror",u=A}}else{u=w;if(!w||a)w="error",a<0&&(a=0)}v.status=a,v.statusText=""+(c||w),o?h.resolveWith(e,[r,w,v]):h.rejectWith(e,[v,w,u]),v.statusCode(j),j=b,t&&g.trigger("ajax"+(o?"Success":"Error"),[v,d,o?r:u]),i.fireWith(e,[v,w]),t&&(g.trigger("ajaxComplete",[v,d]),--f.active||f.event.trigger("ajaxStop"))}}typeof a=="object"&&(c=a,a=b),c=c||{};var d=f.ajaxSetup({},c),e=d.context||d,g=e!==d&&(e.nodeType||e instanceof f)?f(e):f.event,h=f.Deferred(),i=f.Callbacks("once memory"),j=d.statusCode||{},k,l={},m={},n,o,p,q,r,s=0,t,u,v={readyState:0,setRequestHeader:function(a,b){if(!s){var c=a.toLowerCase();a=m[c]=m[c]||a,l[a]=b}return this},getAllResponseHeaders:function(){return s===2?n:null},getResponseHeader:function(a){var c;if(s===2){if(!o){o={};while(c=bH.exec(n))o[c[1].toLowerCase()]=c[2]}c=o[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){s||(d.mimeType=a);return this},abort:function(a){a=a||"abort",p&&p.abort(a),w(0,a);return this}};h.promise(v),v.success=v.done,v.error=v.fail,v.complete=i.add,v.statusCode=function(a){if(a){var b;if(s<2)for(b in a)j[b]=[j[b],a[b]];else b=a[v.status],v.then(b,b)}return this},d.url=((a||d.url)+"").replace(bG,"").replace(bL,bW[1]+"//"),d.dataTypes=f.trim(d.dataType||"*").toLowerCase().split(bP),d.crossDomain==null&&(r=bR.exec(d.url.toLowerCase()),d.crossDomain=!(!r||r[1]==bW[1]&&r[2]==bW[2]&&(r[3]||(r[1]==="http:"?80:443))==(bW[3]||(bW[1]==="http:"?80:443)))),d.data&&d.processData&&typeof d.data!="string"&&(d.data=f.param(d.data,d.traditional)),b$(bT,d,c,v);if(s===2)return!1;t=d.global,d.type=d.type.toUpperCase(),d.hasContent=!bK.test(d.type),t&&f.active++===0&&f.event.trigger("ajaxStart");if(!d.hasContent){d.data&&(d.url+=(bM.test(d.url)?"&":"?")+d.data,delete d.data),k=d.url;if(d.cache===!1){var x=f.now(),y=d.url.replace(bQ,"$1_="+x);d.url=y+(y===d.url?(bM.test(d.url)?"&":"?")+"_="+x:"")}}(d.data&&d.hasContent&&d.contentType!==!1||c.contentType)&&v.setRequestHeader("Content-Type",d.contentType),d.ifModified&&(k=k||d.url,f.lastModified[k]&&v.setRequestHeader("If-Modified-Since",f.lastModified[k]),f.etag[k]&&v.setRequestHeader("If-None-Match",f.etag[k])),v.setRequestHeader("Accept",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+(d.dataTypes[0]!=="*"?", "+bX+"; q=0.01":""):d.accepts["*"]);for(u in d.headers)v.setRequestHeader(u,d.headers[u]);if(d.beforeSend&&(d.beforeSend.call(e,v,d)===!1||s===2)){v.abort();return!1}for(u in{success:1,error:1,complete:1})v[u](d[u]);p=b$(bU,d,c,v);if(!p)w(-1,"No Transport");else{v.readyState=1,t&&g.trigger("ajaxSend",[v,d]),d.async&&d.timeout>0&&(q=setTimeout(function(){v.abort("timeout")},d.timeout));try{s=1,p.send(l,w)}catch(z){if(s<2)w(-1,z);else throw z}}return v},param:function(a,c){var d=[],e=function(a,b){b=f.isFunction(b)?b():b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};c===b&&(c=f.ajaxSettings.traditional);if(f.isArray(a)||a.jquery&&!f.isPlainObject(a))f.each(a,function(){e(this.name,this.value)});else for(var g in a)ca(g,a[g],c,e);return d.join("&").replace(bD,"+")}}),f.extend({active:0,lastModified:{},etag:{}});var cd=f.now(),ce=/(\=)\?(&|$)|\?\?/i;f.ajaxSetup({jsonp:"callback",jsonpCallback:function(){return f.expando+"_"+cd++}}),f.ajaxPrefilter("json jsonp",function(b,c,d){var e=b.contentType==="application/x-www-form-urlencoded"&&typeof b.data=="string";if(b.dataTypes[0]==="jsonp"||b.jsonp!==!1&&(ce.test(b.url)||e&&ce.test(b.data))){var g,h=b.jsonpCallback=f.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,i=a[h],j=b.url,k=b.data,l="$1"+h+"$2";b.jsonp!==!1&&(j=j.replace(ce,l),b.url===j&&(e&&(k=k.replace(ce,l)),b.data===k&&(j+=(/\?/.test(j)?"&":"?")+b.jsonp+"="+h))),b.url=j,b.data=k,a[h]=function(a){g=[a]},d.always(function(){a[h]=i,g&&f.isFunction(i)&&a[h](g[0])}),b.converters["script json"]=function(){g||f.error(h+" was not called");return g[0]},b.dataTypes[0]="json";return"script"}}),f.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(a){f.globalEval(a);return a}}}),f.ajaxPrefilter("script",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),f.ajaxTransport("script",function(a){if(a.crossDomain){var d,e=c.head||c.getElementsByTagName("head")[0]||c.documentElement;return{send:function(f,g){d=c.createElement("script"),d.async="async",a.scriptCharset&&(d.charset=a.scriptCharset),d.src=a.url,d.onload=d.onreadystatechange=function(a,c){if(c||!d.readyState||/loaded|complete/.test(d.readyState))d.onload=d.onreadystatechange=null,e&&d.parentNode&&e.removeChild(d),d=b,c||g(200,"success")},e.insertBefore(d,e.firstChild)},abort:function(){d&&d.onload(0,1)}}}});var cf=a.ActiveXObject?function(){for(var a in ch)ch[a](0,1)}:!1,cg=0,ch;f.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&ci()||cj()}:ci,function(a){f.extend(f.support,{ajax:!!a,cors:!!a&&"withCredentials"in a})}(f.ajaxSettings.xhr()),f.support.ajax&&f.ajaxTransport(function(c){if(!c.crossDomain||f.support.cors){var d;return{send:function(e,g){var h=c.xhr(),i,j;c.username?h.open(c.type,c.url,c.async,c.username,c.password):h.open(c.type,c.url,c.async);if(c.xhrFields)for(j in c.xhrFields)h[j]=c.xhrFields[j];c.mimeType&&h.overrideMimeType&&h.overrideMimeType(c.mimeType),!c.crossDomain&&!e["X-Requested-With"]&&(e["X-Requested-With"]="XMLHttpRequest");try{for(j in e)h.setRequestHeader(j,e[j])}catch(k){}h.send(c.hasContent&&c.data||null),d=function(a,e){var j,k,l,m,n;try{if(d&&(e||h.readyState===4)){d=b,i&&(h.onreadystatechange=f.noop,cf&&delete ch[i]);if(e)h.readyState!==4&&h.abort();else{j=h.status,l=h.getAllResponseHeaders(),m={},n=h.responseXML,n&&n.documentElement&&(m.xml=n),m.text=h.responseText;try{k=h.statusText}catch(o){k=""}!j&&c.isLocal&&!c.crossDomain?j=m.text?200:404:j===1223&&(j=204)}}}catch(p){e||g(-1,p)}m&&g(j,k,m,l)},!c.async||h.readyState===4?d():(i=++cg,cf&&(ch||(ch={},f(a).unload(cf)),ch[i]=d),h.onreadystatechange=d)},abort:function(){d&&d(0,1)}}}});var ck={},cl,cm,cn=/^(?:toggle|show|hide)$/,co=/^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,cp,cq=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]],cr;f.fn.extend({show:function(a,b,c){var d,e;if(a||a===0)return this.animate(cu("show",3),a,b,c);for(var g=0,h=this.length;g=i.duration+this.startTime){this.now=this.end,this.pos=this.state=1,this.update(),i.animatedProperties[this.prop]=!0;for(b in i.animatedProperties)i.animatedProperties[b]!==!0&&(g=!1);if(g){i.overflow!=null&&!f.support.shrinkWrapBlocks&&f.each(["","X","Y"],function(a,b){h.style["overflow"+b]=i.overflow[a]}),i.hide&&f(h).hide();if(i.hide||i.show)for(b in i.animatedProperties)f.style(h,b,i.orig[b]),f.removeData(h,"fxshow"+b,!0),f.removeData(h,"toggle"+b,!0);d=i.complete,d&&(i.complete=!1,d.call(h))}return!1}i.duration==Infinity?this.now=e:(c=e-this.startTime,this.state=c/i.duration,this.pos=f.easing[i.animatedProperties[this.prop]](this.state,c,0,1,i.duration),this.now=this.start+(this.end-this.start)*this.pos),this.update();return!0}},f.extend(f.fx,{tick:function(){var a,b=f.timers,c=0;for(;c-1,k={},l={},m,n;j?(l=e.position(),m=l.top,n=l.left):(m=parseFloat(h)||0,n=parseFloat(i)||0),f.isFunction(b)&&(b=b.call(a,c,g)),b.top!=null&&(k.top=b.top-g.top+m),b.left!=null&&(k.left=b.left-g.left+n),"using"in b?b.using.call(a,k):e.css(k)}},f.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),c=this.offset(),d=cx.test(b[0].nodeName)?{top:0,left:0}:b.offset();c.top-=parseFloat(f.css(a,"marginTop"))||0,c.left-=parseFloat(f.css(a,"marginLeft"))||0,d.top+=parseFloat(f.css(b[0],"borderTopWidth"))||0,d.left+=parseFloat(f.css(b[0],"borderLeftWidth"))||0;return{top:c.top-d.top,left:c.left-d.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||c.body;while(a&&!cx.test(a.nodeName)&&f.css(a,"position")==="static")a=a.offsetParent;return a})}}),f.each(["Left","Top"],function(a,c){var d="scroll"+c;f.fn[d]=function(c){var e,g;if(c===b){e=this[0];if(!e)return null;g=cy(e);return g?"pageXOffset"in g?g[a?"pageYOffset":"pageXOffset"]:f.support.boxModel&&g.document.documentElement[d]||g.document.body[d]:e[d]}return this.each(function(){g=cy(this),g?g.scrollTo(a?f(g).scrollLeft():c,a?c:f(g).scrollTop()):this[d]=c})}}),f.each(["Height","Width"],function(a,c){var d=c.toLowerCase();f.fn["inner"+c]=function(){var a=this[0];return a?a.style?parseFloat(f.css(a,d,"padding")):this[d]():null},f.fn["outer"+c]=function(a){var b=this[0];return b?b.style?parseFloat(f.css(b,d,a?"margin":"border")):this[d]():null},f.fn[d]=function(a){var e=this[0];if(!e)return a==null?null:this;if(f.isFunction(a))return this.each(function(b){var c=f(this);c[d](a.call(this,b,c[d]()))});if(f.isWindow(e)){var g=e.document.documentElement["client"+c],h=e.document.body;return e.document.compatMode==="CSS1Compat"&&g||h&&h["client"+c]||g}if(e.nodeType===9)return Math.max(e.documentElement["client"+c],e.body["scroll"+c],e.documentElement["scroll"+c],e.body["offset"+c],e.documentElement["offset"+c]);if(a===b){var i=f.css(e,d),j=parseFloat(i);return f.isNumeric(j)?j:i}return this.css(d,typeof a=="string"?a:a+"px")}}),a.jQuery=a.$=f,typeof define=="function"&&define.amd&&define.amd.jQuery&&define("jquery",[],function(){return f})})(window); \ No newline at end of file diff --git a/packages/oneallsociallogin/administrator/components/com_oneallsociallogin/assets/js/oneallsociallogin.js b/packages/oneallsociallogin/administrator/components/com_oneallsociallogin/assets/js/oneallsociallogin.js new file mode 100755 index 00000000..138dbb61 --- /dev/null +++ b/packages/oneallsociallogin/administrator/components/com_oneallsociallogin/assets/js/oneallsociallogin.js @@ -0,0 +1,147 @@ +jQuery(document).ready(function($) { + + /* Autodetect API Connection Handler */ + $('#oa_social_login_autodetect_api_connection_handler').click(function(){ + var message_string; + var message_container; + var is_success; + + var data = {'action' : 'autodetect_api_connection_handler'}; + var ajaxurl = 'index.php?option=com_oneallsociallogin&task=autodetect_api_connection_handler'; + + + message_container = jQuery('#oa_social_login_api_connection_handler_result'); + message_container.removeClass('success_message error_message').addClass('working_message'); + message_container.html('Contacting API - please wait ...'); + + jQuery.post(ajaxurl,data, function(response) { + + /* Radio Boxes */ + var radio_curl = jQuery("#oa_social_login_api_connection_handler_curl"); + var radio_fsockopen = jQuery("#oa_social_login_api_connection_handler_fsockopen"); + var radio_443 = jQuery("#oa_social_login_api_connection_port_443"); + var radio_80 = jQuery("#oa_social_login_api_connection_port_80"); + + radio_curl.removeAttr("checked"); + radio_fsockopen.removeAttr("checked"); + radio_443.removeAttr("checked"); + radio_80.removeAttr("checked"); + + + /* CURL detected */ + if (response == 'success_autodetect_api_curl_443') + { + is_success = true; + radio_curl.attr("checked", "checked"); + radio_443.attr("checked", "checked"); + message_string = 'Autodetected CURL on port 443 - do not forget to save your changes!'; + } + else if (response == 'success_autodetect_api_fsockopen_443') + { + is_success = true; + radio_fsockopen.attr("checked", "checked"); + radio_443.attr("checked", "checked"); + message_string = 'Autodetected FSOCKOPEN on port 443 - do not forget to save your changes!'; + } + else if (response == 'success_autodetect_api_curl_80') + { + is_success = true; + radio_curl.attr("checked", "checked"); + radio_80.attr("checked", "checked"); + message_string = 'Autodetected CURL on port 80 - do not forget to save your changes!'; + } + else if (response == 'success_autodetect_api_fsockopen_80') + { + is_success = true; + radio_fsockopen.attr("checked", "checked"); + radio_80.attr("checked", "checked"); + message_string = 'Autodetected FSOCKOPEN on port 80 - do not forget to save your changes!'; + } + /* No handler detected */ + else + { + is_success = false; + radio_curl.attr("checked", "checked"); + message_string = 'Autodetection Error - our documentation might help you fix this issue.'; + } + + message_container.removeClass('working_message'); + message_container.html(message_string); + + if (is_success){ + message_container.addClass('success_message'); + } else { + message_container.addClass('error_message'); + } + }); + return false; + }); + + + /* Test API Settings */ + $('#oa_social_login_test_api_settings').click(function() { + + var message_string; + var message_container; + var is_success; + + var radio_curl_val = jQuery("#oa_social_login_api_connection_handler_curl:checked").val(); + var radio_fsockopen_val = jQuery("#oa_social_login_api_connection_handler_fsockopen:checked").val(); + var radio_use_port_443 = jQuery("#oa_social_login_api_connection_port_443:checked").val(); + var radio_use_port_80 = jQuery("#oa_social_login_api_connection_port_80:checked").val(); + + var subdomain = jQuery('#settings_api_subdomain').val(); + var key = jQuery('#settings_api_key').val(); + var secret = jQuery('#settings_api_secret').val(); + var handler = (radio_fsockopen_val == 'fsockopen' ? 'fsockopen' : 'curl'); + var port = (radio_use_port_80 == 1 ? 80 : 443); + + var data = { + 'action' : 'check_api_settings', + 'api_subdomain' : subdomain, + 'api_key' : key, + 'api_secret' : secret, + 'api_connection_port': port, + 'api_connection_handler' : handler + }; + + var ajaxurl = 'index.php?option=com_oneallsociallogin&task=check_api_settings'; + + message_container = jQuery('#oa_social_login_api_test_result'); + message_container.removeClass('success_message error_message').addClass('working_message'); + message_container.html('Contacting API - please wait ...'); + + jQuery.post(ajaxurl, data, function(response) { + is_success = false; + + if (response == 'error_selected_handler_faulty') { + message_string = 'The API Connection cannot be made, try using the API Connection autodetection'; + } else if (response == 'error_not_all_fields_filled_out') { + message_string = 'Please fill out each of the fields above' + } else if (response == 'error_subdomain_wrong') { + message_string = 'The subdomain does not exist. Have you filled it out correctly?' + } else if (response == 'error_subdomain_wrong_syntax') { + message_string = 'The subdomain has a wrong syntax!' + } else if (response == 'error_communication') { + message_string = 'Could not contact API. Try using another connection handler' + } else if (response == 'error_authentication_credentials_wrong') { + message_string = 'The API credentials are wrong'; + } else if (response == 'success') { + is_success = true; + message_string = 'The settings are correct - do not forget to save your changes!'; + } else { + message_string = 'An unknow error occured! The settings could not be verified.'; + } + + message_container.removeClass('working_message'); + message_container.html(message_string); + + if (is_success){ + message_container.addClass('success_message'); + } else { + message_container.addClass('error_message'); + } + }); + return false; + }); +}); \ No newline at end of file diff --git a/packages/oneallsociallogin/administrator/components/com_oneallsociallogin/controller.php b/packages/oneallsociallogin/administrator/components/com_oneallsociallogin/controller.php new file mode 100644 index 00000000..6bbcbb83 --- /dev/null +++ b/packages/oneallsociallogin/administrator/components/com_oneallsociallogin/controller.php @@ -0,0 +1,399 @@ +getModel (); + $model->saveSettings (); + $this->setRedirect (JRoute::_ ('index.php?option=com_oneallsociallogin&action=save', false)); + } + + /** + * Autodetect API Connection Handler + */ + public function autodetect_api_connection_handler () + { + // CURL Works on port 443 + if ($this->is_curl_available (true) === true) + { + die ('success_autodetect_api_curl_443'); + } + + // FSOCKOPEN works on port 443 + if ($this->is_fsockopen_available (true) == true) + { + die ('success_autodetect_api_fsockopen_443'); + } + + // CURL Works on port 80 + if ($this->is_curl_available (false) === true) + { + die ('success_autodetect_api_curl_80'); + } + + // FSOCKOPEN works on port 80 + if ($this->is_fsockopen_available (false) == true) + { + die ('success_autodetect_api_fsockopen_80'); + } + + // No working handler found + die ('error_autodetect_api_no_handler'); + } + + /** + * Check API Settings + */ + public function check_api_settings () + { + $model = $this->getModel (); + + // Check if all fields have been filled out + if (empty ($_POST ['api_subdomain']) or empty ($_POST ['api_key']) or empty ($_POST ['api_secret'])) + { + $model->setSetting ('api_settings_verified', 0); + die ('error_not_all_fields_filled_out'); + } + + // Check the handler + $api_connection_handler = ((!empty ($_POST ['api_connection_handler']) and $_POST ['api_connection_handler'] == 'fsockopen') ? 'fsockopen' : 'curl'); + $api_connection_port = ((!empty ($_POST ['api_connection_port']) and $_POST ['api_connection_port'] == 80) ? 80 : 443); + $api_connection_secure = ($api_connection_port == 443); + + // FSOCKOPEN + if ($api_connection_handler == 'fsockopen') + { + if ($this->is_fsockopen_available ($api_connection_secure) !== true) + { + $model->setSetting ('api_settings_verified', 0); + die ('error_selected_handler_faulty'); + } + } + // CURL + else + { + if ($this->is_curl_available ($api_connection_secure) !== true) + { + $model->setSetting ('api_settings_verified', 0); + die ('error_selected_handler_faulty'); + } + } + + // Parameters + $api_subdomain = trim (strtolower ($_POST ['api_subdomain'])); + $api_key = $_POST ['api_key']; + $api_secret = $_POST ['api_secret']; + + // Full domain entered + if (preg_match ("/([a-z0-9\-]+)\.api\.oneall\.com/i", $api_subdomain, $matches)) + { + $api_subdomain = trim ($matches [1]); + } + + // Check subdomain format + if (!preg_match ("/^[a-z0-9\-]+$/i", $api_subdomain)) + { + $model->setSetting ('api_settings_verified', 0); + die ('error_subdomain_wrong_syntax'); + } + + // Domain + $api_domain = $api_subdomain . '.api.oneall.com'; + + // Resource URI + $api_resource_url = ($api_connection_secure ? 'https' : 'http') . '://' . $api_domain . '/tools/ping.json'; + + // Get connection details + $result = $this->make_api_request ($api_connection_handler, $api_resource_url, array( + 'api_key' => $api_key, + 'api_secret' => $api_secret + ), 15); + + // Parse result + if (is_object ($result) and property_exists ($result, 'http_code') and property_exists ($result, 'http_data')) + { + switch ($result->http_code) + { + // Success + case 200 : + $model->setSetting ('api_settings_verified', 1); + die ('success'); + break; + + // Authentication Error + case 401 : + $model->setSetting ('api_settings_verified', 0); + die ('error_authentication_credentials_wrong'); + break; + + // Wrong Subdomain + case 404 : + $model->setSetting ('api_settings_verified', 0); + die ('error_subdomain_wrong'); + break; + + // Other error + default : + $model->setSetting ('api_settings_verified', 0); + die ('error_communication'); + break; + } + } + + $model->setSetting ('api_settings_verified', 0); + die ('error_communication'); + } + + /** + * Send an API request by using the given handler + */ + function make_api_request ($handler, $url, $options = array (), $timeout = 15) + { + // FSOCKOPEN + if ($handler == 'fsockopen') + { + return $this->make_fsockopen_request ($url, $options, $timeout); + } + // CURL + else + { + return $this->make_curl_request ($url, $options, $timeout); + } + } + + // /////////////////////////////////////////////////////////////////////////// + // CURL + // /////////////////////////////////////////////////////////////////////////// + + /** + * Check if CURL can be used + */ + public function is_curl_available ($secure = true) + { + if (in_array ('curl', get_loaded_extensions ()) and function_exists ('curl_exec')) + { + $result = $this->make_curl_request (($secure ? 'https' : 'http') . '://www.oneall.com/ping.html'); + if (is_object ($result) and property_exists ($result, 'http_code') and $result->http_code == 200) + { + if (property_exists ($result, 'http_data')) + { + if (strtolower ($result->http_data) == 'ok') + { + return true; + } + } + } + } + return false; + } + + /** + * Send a CURL request + */ + public function make_curl_request ($url, $options = array (), $timeout = 15) + { + // Store the result + $result = new stdClass (); + + // Send request + $curl = curl_init (); + curl_setopt ($curl, CURLOPT_URL, $url); + curl_setopt ($curl, CURLOPT_HEADER, 0); + curl_setopt ($curl, CURLOPT_TIMEOUT, $timeout); + curl_setopt ($curl, CURLOPT_VERBOSE, 0); + curl_setopt ($curl, CURLOPT_RETURNTRANSFER, 1); + curl_setopt ($curl, CURLOPT_SSL_VERIFYPEER, 0); + curl_setopt ($curl, CURLOPT_SSL_VERIFYHOST, 0); + curl_setopt ($curl, CURLOPT_USERAGENT, OA_USERAGENT); + + // BASIC AUTH? + if (isset ($options ['api_key']) and isset ($options ['api_secret'])) + { + curl_setopt ($curl, CURLOPT_USERPWD, $options ['api_key'] . ":" . $options ['api_secret']); + } + + // Make request + if (($http_data = curl_exec ($curl)) !== false) + { + $result->http_code = curl_getinfo ($curl, CURLINFO_HTTP_CODE); + $result->http_data = $http_data; + $result->http_error = null; + } + else + { + $result->http_code = -1; + $result->http_data = null; + $result->http_error = curl_error ($curl); + } + + // Done + return $result; + } + + // /////////////////////////////////////////////////////////////////////////// + // FSOCKOPEN + // /////////////////////////////////////////////////////////////////////////// + + /** + * Check if fsockopen can be used + */ + public function is_fsockopen_available ($secure = true) + { + $result = $this->make_fsockopen_request (($secure ? 'https' : 'http') . '://www.oneall.com/ping.html'); + if (is_object ($result) and property_exists ($result, 'http_code') and $result->http_code == 200) + { + if (property_exists ($result, 'http_data')) + { + if (strtolower ($result->http_data) == 'ok') + { + return true; + } + } + } + return false; + } + + /** + * Send a FSOCKOPEN request + */ + public function make_fsockopen_request ($url, $options = array (), $timeout = 15) + { + // Store the result + $result = new stdClass (); + + // Make that this is a valid URL + if (($uri = parse_url ($url)) == false) + { + $result->http_code = -1; + $result->http_data = null; + $result->http_error = 'invalid_uri'; + return $result; + } + + // Make sure we can handle the schema + switch ($uri ['scheme']) + { + case 'http' : + $port = (isset ($uri ['port']) ? $uri ['port'] : 80); + $host = ($uri ['host'] . ($port != 80 ? ':' . $port : '')); + $fp = @fsockopen ($uri ['host'], $port, $errno, $errstr, $timeout); + break; + + case 'https' : + $port = (isset ($uri ['port']) ? $uri ['port'] : 443); + $host = ($uri ['host'] . ($port != 443 ? ':' . $port : '')); + $fp = @fsockopen ('ssl://' . $uri ['host'], $port, $errno, $errstr, $timeout); + break; + + default : + $result->http_code = -1; + $result->http_data = null; + $result->http_error = 'invalid_schema'; + return $result; + break; + } + + // Make sure the socket opened properly + if (!$fp) + { + $result->http_code = -$errno; + $result->http_data = null; + $result->http_error = trim ($errstr); + return $result; + } + + // Construct the path to act on + $path = (isset ($uri ['path']) ? $uri ['path'] : '/'); + if (isset ($uri ['query'])) + { + $path .= '?' . $uri ['query']; + } + + // Create HTTP request + $defaults = array( + 'Host' => "Host: $host", + 'User-Agent' => 'User-Agent: ' . OA_USERAGENT + ); + + // BASIC AUTH? + if (isset ($options ['api_key']) and isset ($options ['api_secret'])) + { + $defaults ['Authorization'] = 'Authorization: Basic ' . base64_encode ($options ['api_key'] . ":" . $options ['api_secret']); + } + + // Build and send request + $request = 'GET ' . $path . " HTTP/1.0\r\n"; + $request .= implode ("\r\n", $defaults); + $request .= "\r\n\r\n"; + fwrite ($fp, $request); + + // Fetch response + $response = ''; + while ( !feof ($fp) ) + { + $response .= fread ($fp, 1024); + } + + // Close connection + fclose ($fp); + + // Parse response + list ($response_header, $response_body) = explode ("\r\n\r\n", $response, 2); + + // Parse header + $response_header = preg_split ("/\r\n|\n|\r/", $response_header); + list ($header_protocol, $header_code, $header_status_message) = explode (' ', trim (array_shift ($response_header)), 3); + + // Build result + $result->http_code = $header_code; + $result->http_data = $response_body; + + // Done + return $result; + } +} diff --git a/packages/oneallsociallogin/administrator/components/com_oneallsociallogin/index.html b/packages/oneallsociallogin/administrator/components/com_oneallsociallogin/index.html new file mode 100644 index 00000000..5d5190f8 --- /dev/null +++ b/packages/oneallsociallogin/administrator/components/com_oneallsociallogin/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/oneallsociallogin/administrator/components/com_oneallsociallogin/install/index.html b/packages/oneallsociallogin/administrator/components/com_oneallsociallogin/install/index.html new file mode 100644 index 00000000..5d5190f8 --- /dev/null +++ b/packages/oneallsociallogin/administrator/components/com_oneallsociallogin/install/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/oneallsociallogin/administrator/components/com_oneallsociallogin/install/install.mysql.utf8.sql b/packages/oneallsociallogin/administrator/components/com_oneallsociallogin/install/install.mysql.utf8.sql new file mode 100755 index 00000000..051b6de1 --- /dev/null +++ b/packages/oneallsociallogin/administrator/components/com_oneallsociallogin/install/install.mysql.utf8.sql @@ -0,0 +1,33 @@ +CREATE TABLE IF NOT EXISTS `#__oasl_settings` ( + `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, + `setting` varchar(255) NOT NULL, + `value` varchar(255) NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `setting` (`setting`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +CREATE TABLE IF NOT EXISTS `#__oasl_user_mapping` ( + `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, + `user_id` int(11) NOT NULL, + `token` varchar(255) NOT NULL, + PRIMARY KEY (`id`), + KEY `user_id` (`user_id`), + UNIQUE KEY `token` (`token`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + + +INSERT IGNORE INTO `#__oasl_settings` SET + `setting` = 'api_connection_handler', + `value` = 'curl'; + +INSERT IGNORE INTO `#__oasl_settings` SET + `setting` = 'link_verified_accounts', + `value` = '1'; + +INSERT IGNORE INTO `#__oasl_settings` SET + `setting` = 'mod_caption', + `value` = 'Sign in with a social network:'; + +INSERT IGNORE INTO `#__oasl_settings` SET + `setting` = 'providers', + `value` = 'a:4:{i:0;s:8:"facebook";i:1;s:7:"twitter";i:2;s:6:"google";i:3;s:8:"linkedin";}'; diff --git a/packages/oneallsociallogin/administrator/components/com_oneallsociallogin/install/uninstall.mysql.utf8.sql b/packages/oneallsociallogin/administrator/components/com_oneallsociallogin/install/uninstall.mysql.utf8.sql new file mode 100755 index 00000000..0b9e2815 --- /dev/null +++ b/packages/oneallsociallogin/administrator/components/com_oneallsociallogin/install/uninstall.mysql.utf8.sql @@ -0,0 +1,2 @@ +DROP TABLE IF EXISTS `#__oasl_settings`; +DROP TABLE IF EXISTS `#__oasl_user_mapping`; \ No newline at end of file diff --git a/packages/oneallsociallogin/administrator/components/com_oneallsociallogin/models/index.html b/packages/oneallsociallogin/administrator/components/com_oneallsociallogin/models/index.html new file mode 100644 index 00000000..5d5190f8 --- /dev/null +++ b/packages/oneallsociallogin/administrator/components/com_oneallsociallogin/models/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/oneallsociallogin/administrator/components/com_oneallsociallogin/models/oneallsociallogin.php b/packages/oneallsociallogin/administrator/components/com_oneallsociallogin/models/oneallsociallogin.php new file mode 100644 index 00000000..a1b0a210 --- /dev/null +++ b/packages/oneallsociallogin/administrator/components/com_oneallsociallogin/models/oneallsociallogin.php @@ -0,0 +1,145 @@ +getDbo (); + + // Read Settings + $settings = JRequest::getVar ('settings'); + + // Cleanup subdomain + if (!empty ($settings ['api_subdomain'])) + { + $settings ['api_subdomain'] = strtolower (trim ($settings ['api_subdomain'])); + + // Full domain entered + if (preg_match ("/([a-z0-9\-]+)\.api\.oneall\.com/i", $settings ['api_subdomain'], $matches)) + { + $settings ['api_subdomain'] = trim ($matches [1]); + } + } + + // Save providers + $providers = array(); + if (isset ($settings ['providers']) and is_array ($settings ['providers'])) + { + foreach ($settings ['providers'] as $key => $value) + { + if (!empty ($value)) + { + $providers [] = $key; + } + } + } + $settings ['providers'] = serialize ($providers); + + // Remove current settings + $sql = "DELETE FROM #__oasl_settings WHERE setting <> 'api_settings_verified'"; + $db->setQuery ($sql); + $db->query (); + + // Insert new settings + foreach ($settings as $k => $v) + { + $sql = "INSERT INTO #__oasl_settings ( setting, value )" . " VALUES ( " . $db->Quote ($k) . ", " . $db->Quote ($v) . " )"; + $db->setQuery ($sql); + $db->query (); + } + } + + /** + * Read Settings + */ + public function getSettings () + { + // Container + $settings = array(); + + // Get database handle + $db = $this->getDbo (); + + // Read settings + $sql = "SELECT * FROM #__oasl_settings"; + $db->setQuery ($sql); + $rows = $db->LoadAssocList (); + + if (is_array ($rows)) + { + foreach ($rows as $key => $data) + { + if ($data ['setting'] == 'providers') + { + $tmp = @unserialize ($data ['value']); + if (is_array ($tmp)) + { + $settings [$data ['setting']] = $tmp; + } + else + { + $settings [$data ['setting']] = array(); + } + } + else + { + $settings [$data ['setting']] = $data ['value']; + } + } + } + + return $settings; + } + + /** + * Insert a given setting + */ + public function setSetting ($key, $value) + { + // Get database handle + $db = $this->getDbo (); + + // Delete setting + $sql = "DELETE FROM #__oasl_settings WHERE setting = " . $db->Quote ($key) . ""; + $db->setQuery ($sql); + $db->query (); + + // Insert new value + $sql = "INSERT INTO #__oasl_settings ( setting, value )" . " VALUES ( " . $db->Quote ($key) . ", " . $db->Quote ($value) . " )"; + $db->setQuery ($sql); + $db->query (); + } +} \ No newline at end of file diff --git a/packages/oneallsociallogin/administrator/components/com_oneallsociallogin/oneallsociallogin.php b/packages/oneallsociallogin/administrator/components/com_oneallsociallogin/oneallsociallogin.php new file mode 100644 index 00000000..2c78c8e1 --- /dev/null +++ b/packages/oneallsociallogin/administrator/components/com_oneallsociallogin/oneallsociallogin.php @@ -0,0 +1,35 @@ +execute (JRequest::getCmd ('task', 'display')); + +// Redirect if set by the controller +$controller->redirect (); diff --git a/packages/oneallsociallogin/administrator/components/com_oneallsociallogin/views/index.html b/packages/oneallsociallogin/administrator/components/com_oneallsociallogin/views/index.html new file mode 100644 index 00000000..5d5190f8 --- /dev/null +++ b/packages/oneallsociallogin/administrator/components/com_oneallsociallogin/views/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/oneallsociallogin/administrator/components/com_oneallsociallogin/views/oneallsociallogin/index.html b/packages/oneallsociallogin/administrator/components/com_oneallsociallogin/views/oneallsociallogin/index.html new file mode 100644 index 00000000..5d5190f8 --- /dev/null +++ b/packages/oneallsociallogin/administrator/components/com_oneallsociallogin/views/oneallsociallogin/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/oneallsociallogin/administrator/components/com_oneallsociallogin/views/oneallsociallogin/tmpl/default.php b/packages/oneallsociallogin/administrator/components/com_oneallsociallogin/views/oneallsociallogin/tmpl/default.php new file mode 100644 index 00000000..af1f26b0 --- /dev/null +++ b/packages/oneallsociallogin/administrator/components/com_oneallsociallogin/views/oneallsociallogin/tmpl/default.php @@ -0,0 +1,254 @@ + +

OneAll Social Login

+ + + + + + + + +

Help, Updates & Documentation

+ + +

API Connection

+ + + +

API Settings

+ + +

Choose the social networks to use

+ + +

Enter the text to be displayed above the social network login buttons:

+ + +

Should social network profiles with verified email addresses be linked to existing accounts?

+ + +

Redirect the user to this page after having registered a new account using Social Login:

+ + +

Redirect the user to this page after having logged in using Social Login:

+ + +

Should the module display a logout button for users that are logged in?

+ + +

Enter the text to be displayed above the logout button:

+ + +

Enter an URL to a CSS stylesheet to be used by Social Login:

+ + + + + \ No newline at end of file diff --git a/packages/oneallsociallogin/administrator/components/com_oneallsociallogin/views/oneallsociallogin/tmpl/index.html b/packages/oneallsociallogin/administrator/components/com_oneallsociallogin/views/oneallsociallogin/tmpl/index.html new file mode 100644 index 00000000..5d5190f8 --- /dev/null +++ b/packages/oneallsociallogin/administrator/components/com_oneallsociallogin/views/oneallsociallogin/tmpl/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/oneallsociallogin/administrator/components/com_oneallsociallogin/views/oneallsociallogin/view.html.php b/packages/oneallsociallogin/administrator/components/com_oneallsociallogin/views/oneallsociallogin/view.html.php new file mode 100644 index 00000000..45b62564 --- /dev/null +++ b/packages/oneallsociallogin/administrator/components/com_oneallsociallogin/views/oneallsociallogin/view.html.php @@ -0,0 +1,77 @@ +addStyleSheet ('components/com_oneallsociallogin/assets/css/oneallsociallogin.css'); + $document->addScript ('components/com_oneallsociallogin/assets/js/jquery.js'); + $document->addScript ('components/com_oneallsociallogin/assets/js/oneallsociallogin.js'); + + //Read settings + $model = $this->getModel (); + $this->settings = $model->getSettings (); + + //Read providers + $this->providers = $social_login_providers; + + //Build page + $this->form = $this->get ('Form'); + $this->addToolbar (); + + // Display the template + parent::display ($tpl); + } + + /** + * OneAllSocialLogin - Add Toolbar + * @return void + */ + protected function addToolbar () + { + JRequest::setVar ('hidemainmenu', false); + JToolBarHelper::title (JText::_ ('Social Login Configuration'), 'weblinks.png'); + JToolBarHelper::apply ('apply'); + } +} \ No newline at end of file diff --git a/packages/oneallsociallogin/administrator/language/en-GB/en-GB.com_oneallsociallogin.sys.ini b/packages/oneallsociallogin/administrator/language/en-GB/en-GB.com_oneallsociallogin.sys.ini new file mode 100755 index 00000000..b2490b20 --- /dev/null +++ b/packages/oneallsociallogin/administrator/language/en-GB/en-GB.com_oneallsociallogin.sys.ini @@ -0,0 +1 @@ +COM_ONEALLSOCIALLOGIN="OneAll Social Login" \ No newline at end of file diff --git a/packages/oneallsociallogin/components/com_oneallsociallogin/index.html b/packages/oneallsociallogin/components/com_oneallsociallogin/index.html new file mode 100644 index 00000000..5d5190f8 --- /dev/null +++ b/packages/oneallsociallogin/components/com_oneallsociallogin/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/oneallsociallogin/components/com_oneallsociallogin/oneallsociallogin.php b/packages/oneallsociallogin/components/com_oneallsociallogin/oneallsociallogin.php new file mode 100644 index 00000000..839ee676 --- /dev/null +++ b/packages/oneallsociallogin/components/com_oneallsociallogin/oneallsociallogin.php @@ -0,0 +1,35 @@ +execute (JRequest::getCmd ('task', 'display')); + +// Redirect if set by the controller +$controller->redirect (); \ No newline at end of file diff --git a/packages/oneallsociallogin/modules/mod_oneallsociallogin/classes/helper.php b/packages/oneallsociallogin/modules/mod_oneallsociallogin/classes/helper.php new file mode 100644 index 00000000..1c1c44b5 --- /dev/null +++ b/packages/oneallsociallogin/modules/mod_oneallsociallogin/classes/helper.php @@ -0,0 +1,101 @@ +setQuery ($sql); + $rows = $db->LoadAssocList (); + + if (is_array ($rows)) + { + foreach ($rows as $key => $data) + { + if ($data ['setting'] == 'providers') + { + $tmp = @unserialize ($data ['value']); + if (is_array ($tmp)) + { + $settings [$data ['setting']] = $tmp; + } + else + { + $settings [$data ['setting']] = array(); + } + } + else + { + $settings [$data ['setting']] = $data ['value']; + } + } + } + + return $settings; + } +} \ No newline at end of file diff --git a/packages/oneallsociallogin/modules/mod_oneallsociallogin/classes/index.html b/packages/oneallsociallogin/modules/mod_oneallsociallogin/classes/index.html new file mode 100644 index 00000000..5d5190f8 --- /dev/null +++ b/packages/oneallsociallogin/modules/mod_oneallsociallogin/classes/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/oneallsociallogin/modules/mod_oneallsociallogin/index.html b/packages/oneallsociallogin/modules/mod_oneallsociallogin/index.html new file mode 100644 index 00000000..5d5190f8 --- /dev/null +++ b/packages/oneallsociallogin/modules/mod_oneallsociallogin/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/oneallsociallogin/modules/mod_oneallsociallogin/mod_oneallsociallogin.php b/packages/oneallsociallogin/modules/mod_oneallsociallogin/mod_oneallsociallogin.php new file mode 100644 index 00000000..ec6f1074 --- /dev/null +++ b/packages/oneallsociallogin/modules/mod_oneallsociallogin/mod_oneallsociallogin.php @@ -0,0 +1,54 @@ +def ('greeting', 1); + +// Get settings +$widget_settings = mod_oneallsocialloginHelper::getSettings (); + +// Add library +if (!empty ($widget_settings ['api_subdomain'])) +{ + $document = JFactory::getDocument (); + $document->addScriptDeclaration (" var oa = document.createElement('script'); + oa.type = 'text/javascript'; oa.async = true; + oa.src = '//" . trim ($widget_settings ['api_subdomain']) . ".api.oneall.com/socialize/library.js'; + var s = document.getElementsByTagName('script')[0]; + s.parentNode.insertBefore(oa, s);"); +} + +// Get user status +$user = JFactory::getUser (); +$user_status = ((!$user->get ('guest')) ? 'logout' : 'login'); + +// Return URL +$return_url = JURI::getInstance ()->toString (); + +// Get Module Class Suffix +$moduleclass_sfx = htmlspecialchars ($params->get ('moduleclass_sfx')); + +// Show template +require JModuleHelper::getLayoutPath ('mod_oneallsociallogin', $params->get ('layout', 'default')); diff --git a/packages/oneallsociallogin/modules/mod_oneallsociallogin/mod_oneallsociallogin.xml b/packages/oneallsociallogin/modules/mod_oneallsociallogin/mod_oneallsociallogin.xml new file mode 100755 index 00000000..5c5cb1f3 --- /dev/null +++ b/packages/oneallsociallogin/modules/mod_oneallsociallogin/mod_oneallsociallogin.xml @@ -0,0 +1,29 @@ + + + OneAll Social Login + Open Source License, GPL v2 based + OneAll LLC + support@oneall.com + http://www.oneall.com + 2014-10-29 + 2011 - Today, OneAll LLC + 2.1 + + +The module displays the social network buttons.

+Visit us at http://www.oneall.com/
+Contact our support at: http://www.oneall.com/company/contact-us/ +]]>
+ + mod_oneallsociallogin.php + classes + tmpl + + + +
+ +
+
+
+
diff --git a/packages/oneallsociallogin/modules/mod_oneallsociallogin/tmpl/default.php b/packages/oneallsociallogin/modules/mod_oneallsociallogin/tmpl/default.php new file mode 100644 index 00000000..ced5bf91 --- /dev/null +++ b/packages/oneallsociallogin/modules/mod_oneallsociallogin/tmpl/default.php @@ -0,0 +1,117 @@ + +
+
+ 0) + { + ?> + + +
+ + + +
+ +
+ 0) + { + // Check if providers have been selected + if (isset ($widget_settings ['providers']) and is_array ($widget_settings ['providers'])) + { + // Random integer for unique dom element ids; + $rnd = rand (); + + ?> +
+ 0) + { + ?> + + +
+ + +
+ +
+ [Social Login] Please select at least one Social Network (Admin: Components\OneAll Social Login) +
+ +
+ [Social Login] Please complete your API Settings (Admin: Components\OneAll Social Login) +
+ \ No newline at end of file diff --git a/packages/oneallsociallogin/plugins/system/oneallsociallogin/helper.php b/packages/oneallsociallogin/plugins/system/oneallsociallogin/helper.php new file mode 100644 index 00000000..68d0a785 --- /dev/null +++ b/packages/oneallsociallogin/plugins/system/oneallsociallogin/helper.php @@ -0,0 +1,390 @@ +quote ($username); + $db->setQuery ($sql); + $user_id = $db->loadResult (); + + // Done + return (!empty ($user_id) and is_numeric ($user_id)); + } + + /** + * Check if the given email exists + */ + public static function useremailExists ($email) + { + // Database handler + $db = JFactory::getDBO (); + + // Get user for email + $sql = "SELECT id FROM #__users WHERE email = " . $db->quote ($email); + $db->setQuery ($sql); + $user_id = $db->loadResult (); + + // Done + return (!empty ($user_id) and is_numeric ($user_id)); + } + + /** + * Create random email + */ + public static function getRandomUseremail () + { + // Create unique email + do + { + $email = md5 (uniqid (rand (10000, 99000))) . "@example.com"; + } + while ( self::useremailExists ($email) ); + + // Done + return $email; + } + + /** + * Link token to userid + */ + public static function setUserIdForToken ($token, $user_id) + { + // Database handler + $db = JFactory::getDBO (); + + // Remove + $sql = "DELETE FROM #__oasl_user_mapping WHERE token = " . $db->quote ($token); + $db->setQuery ($sql); + if ($db->query ()) + { + // Add + $sql = "INSERT INTO #__oasl_user_mapping SET token = " . $db->quote ($token) . ", user_id = " . $db->Quote ($user_id); + $db->setQuery ($sql); + if ($db->query ()) + { + return true; + } + } + return false; + } + + /** + * Check if we have a userid for the given token + */ + public static function getUserIdForToken ($token) + { + // Database handler + $db = JFactory::getDBO (); + + // Read user + $sql = "SELECT u.ID FROM #__oasl_user_mapping AS um INNER JOIN #__users AS u ON (um.user_id=u.ID) WHERE um.token = " . $db->quote ($token); + $db->setQuery ($sql); + $user_id = $db->loadResult (); + if ($user_id) + { + return $user_id; + } + return false; + } + + /** + * Get the userid for a given email + */ + public static function getUserIdForEmail ($email) + { + // Database handler + $db = JFactory::getDBO (); + + // Read user + $sql = "SELECT id FROM #__users WHERE email = " . $db->quote ($email); + $db->setQuery ($sql); + $user_id = $db->loadResult (); + if ($user_id) + { + return $user_id; + } + return false; + } + + /** + * Make an API Request to obtain the data for a given connection_token + */ + public static function makeTokenLookup ($token) + { + // Read settings + $settings = self::getSettings (); + + // API Settings + $api_subdomain = (!empty ($settings ['api_subdomain']) ? trim ($settings ['api_subdomain']) : ''); + $api_key = (!empty ($settings ['api_key']) ? $settings ['api_key'] : ''); + $api_secret = (!empty ($settings ['api_secret']) ? $settings ['api_secret'] : ''); + + // API Connection + $api_connection_handler = ((!empty ($settings ['api_connection_handler']) and $settings ['api_connection_handler'] == 'fsockopen') ? 'fsockopen' : 'curl'); + $api_connection_port = ((!empty ($settings ['api_connection_port']) and $settings ['api_connection_port'] == 80) ? 80 : 443); + $api_connection_secure = ($api_connection_port == 443); + + $api_resource = ($api_connection_secure ? 'https' : 'http') . '://' . $api_subdomain . '.api.oneall.com/connections/' . $token . '.json'; + + // Send request to the API + $result = self::makeHttpRequest ($api_connection_handler, $api_resource, array( + 'api_key' => $api_key, + 'api_secret' => $api_secret + )); + + // Parse result + if (is_object ($result) and property_exists ($result, 'http_data') and property_exists ($result, 'http_code') and $result->http_code == 200) + { + // Result + $json = $result->http_data; + + // Decode + $json_decoded = @json_decode ($json); + + // Check format + if (is_object ($json_decoded) and !empty ($json_decoded->response->request->status->code) and $json_decoded->response->request->status->code == 200) + { + $social_data = $json_decoded; + } + } + + return ((isset ($social_data) and is_object ($social_data)) ? $social_data : null); + } + + /** + * Send a HTTP request by using the given handler + */ + public static function makeHttpRequest ($handler, $url, $options = array (), $timeout = 15) + { + // FSOCKOPEN + if ($handler == 'fsockopen') + { + return self::makeFsockopenRequest ($url, $options, $timeout); + } + // CURL + else + { + return self::makeCurlRequest ($url, $options, $timeout); + } + } + + /** + * Send a HTTP request by using CURL + */ + public static function makeCurlRequest ($url, $options = array (), $timeout = 15) + { + // Store the result + $result = new stdClass (); + + // Send request + $curl = curl_init (); + curl_setopt ($curl, CURLOPT_URL, $url); + curl_setopt ($curl, CURLOPT_HEADER, 0); + curl_setopt ($curl, CURLOPT_TIMEOUT, $timeout); + curl_setopt ($curl, CURLOPT_VERBOSE, 0); + curl_setopt ($curl, CURLOPT_RETURNTRANSFER, 1); + curl_setopt ($curl, CURLOPT_SSL_VERIFYPEER, 0); + curl_setopt ($curl, CURLOPT_SSL_VERIFYHOST, 0); + curl_setopt ($curl, CURLOPT_USERAGENT, OA_USERAGENT); + + // BASIC AUTH? + if (isset ($options ['api_key']) and isset ($options ['api_secret'])) + { + curl_setopt ($curl, CURLOPT_USERPWD, $options ['api_key'] . ":" . $options ['api_secret']); + } + + // Make request + if (($http_data = curl_exec ($curl)) !== false) + { + $result->http_code = curl_getinfo ($curl, CURLINFO_HTTP_CODE); + $result->http_data = $http_data; + $result->http_error = null; + } + else + { + $result->http_code = -1; + $result->http_data = null; + $result->http_error = curl_error ($curl); + } + + // Done + return $result; + } + + /** + * Send a HTTP request by using FSOCKOPEN + */ + public static function makeFsockopenRequest ($url, $options = array (), $timeout = 15) + { + // Store the result + $result = new stdClass (); + + // Make that this is a valid URL + if (($uri = parse_url ($url)) == false) + { + $result->http_code = -1; + $result->http_data = null; + $result->http_error = 'invalid_uri'; + return $result; + } + + // Make sure we can handle the schema + switch ($uri ['scheme']) + { + case 'http' : + $port = (isset ($uri ['port']) ? $uri ['port'] : 80); + $host = ($uri ['host'] . ($port != 80 ? ':' . $port : '')); + $fp = @fsockopen ($uri ['host'], $port, $errno, $errstr, $timeout); + break; + + case 'https' : + $port = (isset ($uri ['port']) ? $uri ['port'] : 443); + $host = ($uri ['host'] . ($port != 443 ? ':' . $port : '')); + $fp = @fsockopen ('ssl://' . $uri ['host'], $port, $errno, $errstr, $timeout); + break; + + default : + $result->http_code = -1; + $result->http_data = null; + $result->http_error = 'invalid_schema'; + return $result; + break; + } + + // Make sure the socket opened properly + if (!$fp) + { + $result->http_code = -$errno; + $result->http_data = null; + $result->http_error = trim ($errstr); + return $result; + } + + // Construct the path to act on + $path = (isset ($uri ['path']) ? $uri ['path'] : '/'); + if (isset ($uri ['query'])) + { + $path .= '?' . $uri ['query']; + } + + // Create HTTP request + $defaults = array( + 'Host' => "Host: $host", + 'User-Agent' => 'User-Agent: ' . OA_USERAGENT + ); + + // BASIC AUTH? + if (isset ($options ['api_key']) and isset ($options ['api_secret'])) + { + $defaults ['Authorization'] = 'Authorization: Basic ' . base64_encode ($options ['api_key'] . ":" . $options ['api_secret']); + } + + // Build and send request + $request = 'GET ' . $path . " HTTP/1.0\r\n"; + $request .= implode ("\r\n", $defaults); + $request .= "\r\n\r\n"; + fwrite ($fp, $request); + + // Fetch response + $response = ''; + while ( !feof ($fp) ) + { + $response .= fread ($fp, 1024); + } + + // Close connection + fclose ($fp); + + // Parse response + list ($response_header, $response_body) = explode ("\r\n\r\n", $response, 2); + + // Parse header + $response_header = preg_split ("/\r\n|\n|\r/", $response_header); + list ($header_protocol, $header_code, $header_status_message) = explode (' ', trim (array_shift ($response_header)), 3); + + // Build result + $result->http_code = $header_code; + $result->http_data = $response_body; + + // Done + return $result; + } + + /** + * Get settings + */ + public static function getSettings () + { + // Container + $settings = array(); + + // Get database handle + $db = JFactory::getDBO (); + + // Read settings + $sql = "SELECT * FROM #__oasl_settings"; + $db->setQuery ($sql); + $rows = $db->LoadAssocList (); + + if (is_array ($rows)) + { + foreach ($rows as $key => $data) + { + if ($data ['setting'] == 'providers') + { + $tmp = @unserialize ($data ['value']); + if ($tmp !== false and is_array ($tmp)) + { + $settings [$data ['setting']] = $tmp; + } + else + { + $settings [$data ['setting']] = array(); + } + } + else + { + $settings [$data ['setting']] = $data ['value']; + } + } + } + + return $settings; + } +} diff --git a/packages/oneallsociallogin/plugins/system/oneallsociallogin/index.html b/packages/oneallsociallogin/plugins/system/oneallsociallogin/index.html new file mode 100644 index 00000000..5d5190f8 --- /dev/null +++ b/packages/oneallsociallogin/plugins/system/oneallsociallogin/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/oneallsociallogin/plugins/system/oneallsociallogin/oneallsociallogin.php b/packages/oneallsociallogin/plugins/system/oneallsociallogin/oneallsociallogin.php new file mode 100644 index 00000000..c986dc0d --- /dev/null +++ b/packages/oneallsociallogin/plugins/system/oneallsociallogin/oneallsociallogin.php @@ -0,0 +1,421 @@ +response->result->data->user->identity; + $user_token = $social_data->response->result->data->user->user_token; + + // Identity + $user_identity_id = $identity->id; + $user_identity_provider = $identity->source->name; + + // ***** Firstname ***** + if (isset($identity->name->givenName) and !empty($identity->name->givenName)) + { + $user_first_name = $identity->name->givenName; + } + elseif (isset($identity->preferredUsername)) + { + $user_first_name = $identity->preferredUsername; + } + else + { + $user_first_name = 'noname'; + } + + // ***** Lastname ***** + if (isset($identity->name->familyName) and !empty($identity->name->familyName)) + { + $user_last_name = $identity->name->familyName; + } + else + { + $user_last_name = ''; + } + + // ***** Fullname ***** + if (!empty($identity->name->formatted)) + { + $user_full_name = $identity->name->formatted; + } + elseif (!empty($identity->name->displayName)) + { + $user_full_name = $identity->name->displayName; + } + else + { + $user_full_name = trim($user_first_name . ' ' . $user_last_name); + } + + // ***** Email ***** + $user_email = ''; + if (property_exists($identity, 'emails') and is_array($identity->emails)) + { + foreach ($identity->emails as $email) + { + $user_email = $email->value; + $user_email_is_verified = ($email->is_verified == '1'); + } + } + + // ***** Thumbnail ***** + if (property_exists($identity, 'thumbnailUrl') and !empty($identity->thumbnailUrl)) + { + $user_thumbnail = trim($identity->thumbnailUrl); + } + else + { + $user_thumbnail = ''; + } + + // ***** User Website ***** + if (property_exists($identity, 'profileUrl') and !empty($identity->profileUrl)) + { + $user_website = $identity->profileUrl; + } + elseif (property_exists($identity, 'urls') and !empty($identity->urls[0]->value)) + { + $user_website = $identity->urls[0]->value; + } + else + { + $user_website = ''; + } + + // ***** Preferred Username ***** + if (!empty($identity->preferredUsername)) + { + $user_login = $identity->preferredUsername; + } + elseif (!empty($identity->displayName)) + { + $user_login = $identity->displayName; + } + elseif (!empty($identity->name->formatted)) + { + $user_login = $identity->name->formatted; + } + else + { + $user_login = ''; + } + + // Get user by token + $user_id = plgSystemOneAllSocialLoginHelper::getUserIdForToken($user_token); + + // Not linked, try to link to existing account + if (!is_numeric($user_id)) + { + // Linking enabled? + if (!empty($settings['link_verified_accounts'])) + { + // Only of email is verified + if (!empty($user_email) and $user_email_is_verified === true) + { + // Read existing user + if (($user_id_tmp = plgSystemOneAllSocialLoginHelper::getUserIdForEmail($user_email)) !== false) + { + // Link user to token + if (is_numeric($user_id_tmp)) + { + if (plgSystemOneAllSocialLoginHelper::setUserIdForToken($user_token, $user_id_tmp)) + { + $user_id = $user_id_tmp; + } + } + } + } + } + } + + // ***** New User ***** + if (!is_numeric($user_id)) + { + // Import libraries + jimport('joomla.user.helper'); + jimport('joomla.application.component.helper'); + + // New user + $new_user = true; + + // Get the com_user params + $usersParams = JComponentHelper::getParams('com_users'); + + // Make sure user registration is allowed. + if ($usersParams->get('allowUserRegistration') == '0' && !$usersParams->get('override_allow_user_registration', 0)) + { + JFactory::getApplication()->enqueueMessage(JText::_('Sorry, but your account could not be created as the registration of new users has been disabled by the administrator of this website.'), 'error'); + + return false; + } + + // Replace characters that are now allowed by Joomla + // See JLIB_DATABASE_ERROR_VALID_AZ09 in libraries/joomla/table/user.php + $user_login = preg_replace('#[<>"\'%;()&\s\\\\]|\\.\\./#', "", $user_login); + $user_login = trim(trim($user_login), '.'); + + // Username must be at least 2 characters long + if (strlen($user_login) < 2) + { + $user_login = $user_identity_provider . 'User'; + } + + // Username must be unique + if (plgSystemOneAllSocialLoginHelper::usernameExists($user_login)) + { + $i = 1; + $user_login_tmp = $user_login; + do + { + $user_login_tmp = $user_login . ($i++); + } while (plgSystemOneAllSocialLoginHelper::usernameExists($user_login_tmp)); + + // Unique user login + $user_login = $user_login_tmp; + } + + // Email must be unique + if (empty($user_email) or plgSystemOneAllSocialLoginHelper::useremailExists($user_email)) + { + $user_email = plgSystemOneAllSocialLoginHelper::getRandomUseremail(); + } + + // Get the ACL + $acl = JFactory::getACL(); + + // Ggenerate a new JUser Object + $user = JFactory::getUser(0); + + // Array for all user settings + $data = array(); + + // Get the default usertype + $defaultUserGroups = $usersParams->get('new_usertype', 2); + if (!$defaultUserGroups) + { + $defaultUserGroups = 'Registered'; + } + + // Setup the "main" user information + $data['name'] = $user_full_name; + $data['username'] = $user_login; + $data['email'] = $user_email; + $data['usertype'] = 'deprecated'; + $data['language'] = JComponentHelper::getParams('com_languages')->get('site', 'en-GB'); + $data['groups'] = array( + $defaultUserGroups + ); + $data['registerDate'] = JFactory::getDate()->toSQL(); + $data['password'] = JUserHelper::genRandomPassword(); + $data['password2'] = $data['password']; + $data['sendEmail'] = 0; + $data['block'] = 0; + + // Bind the data to the JUser Object + if (!$user->bind($data)) + { + JError::raiseWarning('', JText::_('Could not bind data to user') . ': ' . JText::_($user->getError())); + + return false; + } + + // Save the user + if (!$user->save()) + { + JError::raiseWarning('', JText::_('Could not create user') . ': ' . JText::_($user->getError())); + + return false; + } + + // Store userid + $user_id = $user->get('id'); + + // Link to token + plgSystemOneAllSocialLoginHelper::setUserIdForToken($user_token, $user_id); + } + // Returning user + else + { + $new_user = false; + } + + // Sucess + if (isset($user_id) and is_numeric($user_id) and !empty($user_id)) + { + // User exists + $user = JFactory::getUser($user_id); + if (is_object($user)) + { + // Get the application object. + $app = JFactory::getApplication(); + $db = JFactory::getDBO(); + $query = 'SELECT `id`, `username`, `password` FROM `#__users` WHERE id = ' . $db->Quote($user->get('id')); + $db->setQuery($query); + $result = $db->loadObject(); + + // Login user + if ($result and !empty($result->username)) + { + JPluginHelper::importPlugin('user'); + + // Setup options + $options = array(); + $options['action'] = 'core.login.site'; + + // Return to the original URL + /* + * if ( ! empty ($_REQUEST['return'])) + * { + * $url = base64_decode (urldecode ($_REQUEST['return'])); + * + * //Registration + * $settings['redirect_register_url'] = $url; + * + * //Login + * $settings['redirect_login_url'] = $url; + * + * } + */ + + // Setup return url for new users + if ($new_user === true) + { + if (isset($settings['redirect_register_url']) and strlen(trim($settings['redirect_register_url'])) > 0) + { + $session = JFactory::getSession(); + $session->set('redirect_url', trim($settings['redirect_register_url']), 'plg_oneallsociallogin'); + } + } + // Setup return url for returning users + elseif ($new_user === false) + { + if (isset($settings['redirect_login_url']) and strlen(trim($settings['redirect_login_url'])) > 0) + { + $session = JFactory::getSession(); + $session->set('redirect_url', trim($settings['redirect_login_url']), 'plg_oneallsociallogin'); + } + } + + $response = new stdClass(); + $response->username = $result->username; + $response->fullname = $result->username; + $response->password = $result->password; + $response->type = 'oneall-social-login'; + $response->status = \JAuthentication::STATUS_SUCCESS; + + $loginResult = $app->triggerEvent('onUserLogin', array((array) $response, $options)); + + $user = \JFactory::getUser(); + if (in_array(false, $loginResult, true) == false) + { + $options['user'] = $user; + $options['responseType'] = $response->type; + + // The user is successfully logged in. Run the after login events + $app->triggerEvent('onUserAfterLogin', array($options)); + } + + //Done + + return true; + } + } + } + } + } + + /** + * Check for token + */ + public function onAfterInitialise() + { + // Check if we have a connection token + if (isset($_POST) and !empty($_POST['oa_action']) and $_POST['oa_action'] == 'social_login' and !empty($_POST['connection_token'])) + { + $this->doAuth($_POST['connection_token']); + } + } + + /** + * Redirect if necessary + */ + public function onAfterRoute() + { + // Read session + $session = JFactory::getSession(); + + // Check for uri + $redirect_url = $session->get('redirect_url', null, 'plg_oneallsociallogin'); + if (!empty($redirect_url)) + { + // Clear uri + $session->clear('redirect_url', 'plg_oneallsociallogin'); + + // Redirect + $app = JFactory::getApplication(); + $app->redirect($redirect_url); + } + } +} diff --git a/packages/oneallsociallogin/plugins/system/oneallsociallogin/oneallsociallogin.xml b/packages/oneallsociallogin/plugins/system/oneallsociallogin/oneallsociallogin.xml new file mode 100755 index 00000000..2429dd7d --- /dev/null +++ b/packages/oneallsociallogin/plugins/system/oneallsociallogin/oneallsociallogin.xml @@ -0,0 +1,22 @@ + + + System - OneAll Social Login + Open Source License, GPL v2 based + OneAll LLC + support@oneall.com + http://www.oneall.com + 2014-10-29 + 2011 - Today, OneAll LLC + 2.1 + + +The plugin handles the authentication process through a social network account.

+Visit us at http://www.oneall.com/
+Contact our support at: http://www.oneall.com/company/contact-us/ +]]>
+ + oneallsociallogin.php + index.html + helper.php + +