From 28ec03c8852bd2f383bef21b736b055e34c51e84 Mon Sep 17 00:00:00 2001 From: Christy Jacob Date: Sun, 19 Jan 2020 07:46:22 +0530 Subject: [PATCH 1/9] chore: added Salesforce to providers --- app/config/providers.php | 6 ++++++ src/Auth/OAuth/Salesforce.php | 0 2 files changed, 6 insertions(+) create mode 100644 src/Auth/OAuth/Salesforce.php diff --git a/app/config/providers.php b/app/config/providers.php index 5dc43e8e56..3b5661790f 100644 --- a/app/config/providers.php +++ b/app/config/providers.php @@ -67,6 +67,12 @@ return [ 'enabled' => true, 'mock' => false, ], + 'salesforce' => [ + 'developers' => 'https://developer.salesforce.com/docs/', + 'icon' => 'icon-salesforce', + 'enabled' => true, + 'mock' => false, + ], // 'apple' => [ // 'developers' => 'https://developer.apple.com/', // 'icon' => 'icon-apple', diff --git a/src/Auth/OAuth/Salesforce.php b/src/Auth/OAuth/Salesforce.php new file mode 100644 index 0000000000..e69de29bb2 From 26202fcac6c7bfb56ddb4771f797838b1d150e56 Mon Sep 17 00:00:00 2001 From: Christy Jacob Date: Sun, 19 Jan 2020 16:00:18 +0530 Subject: [PATCH 2/9] feat: added support for Salesforce OAuth --- public/images/oauth/salesforce.png | Bin 0 -> 3899 bytes src/Auth/OAuth/Salesforce.php | 151 +++++++++++++++++++++++++++++ 2 files changed, 151 insertions(+) create mode 100644 public/images/oauth/salesforce.png diff --git a/public/images/oauth/salesforce.png b/public/images/oauth/salesforce.png new file mode 100644 index 0000000000000000000000000000000000000000..2b8e4c98461983ee43535f5082fc1f7c6d1e607e GIT binary patch literal 3899 zcmZ`+2R9sC6ILQbStUf2=)ITS)p=!=h+fwcB8Xu18Y1e8MM(5scJ&fjy{;BDh(uUq zb&H5j)I~n;5BO%z+~>?WckY?Fcbb06~ zb_;jyb+t8!{{E*$nDSI2BEW%;hPv77yxsgDKQr@!A+<9MRHw8)#SVC{nu;qSi7TFE z-ize~q0%h=)=JwYI=o_cQe~k5A&#;?`y(Urk(!v95y!irk6ZN~^w@bY@2vUHyPXb4 z`eBnwH}jK4!Z>GoX}wuhiWwQtzOTX8AoKl20s%`{2n-8+Bf0#4ta%}0H4|X@Y8m{imNQFN^KvFV7LA}@$79JTIdCn*CAEr$D41gC@ z&B3E$qkl!I(()FwG0m4t;*qyY+QbvNo7q zPGke|$Aq-lf36=TPg{IDd2oiu4(Pm^-^zt#c=)l1cqR*lPHon=KRzsreoNjEYvHe4 z%FNkin`Tw9+{uw)Rh)L2xK&?hzwzOVyl^5LrW+x-H!-O{!&W4bSX@v$>wxqq5(-ly z(xuHu!Y@bvdBHiV5^q9l*>D_&dll_n5(t2K%WEH32d1yi%Wuc^)7xx8EiHNJZSU5v zTAm(TIE^oiJ!D2WWMj%U0YPm%=4aOM2;sxbA2g4}Yo0&lg=rtWyr8SI_ja0Kh=m+_^K!8`X$u0k5{=t zY3`szuSrwiyiZN&A%DEGkqffKq<)ML zw#(uydwsnO#M4djNyr;HLDGGz43+mCF?&fMh@QHQ=Rp|r5DR97(q=~WN5ZH_A_(G! z5gQQ4WZ*v}rKArY)eqV0uwzDo|GNgi?>u_BJ?VH| z&Rq$0v)EZwVnQJYx$%|RbBjyNlg(m94b#)D!*o26>pk5s+J625RggQ=KZsKxW_+e{ zJN!2Jaiy8-Ne!&AbThvO)@K5)WZEGbuJ?I{h=D;RKcL@_gp5IP#%tlj(YNI#eD03t zkJ-^lD;PaW5oTTMb>MTdurW1y?aHvE#2ZcJ%j+JZ&_y95d*%DbHskAtMqC@bCYIl{ zL4IIi?PYdFNeAP0Ijz(6pWaTN3$9RkZqOchHR=*TRpQUW_d6Kza&A*J{ruYR(CMb% zuM976c<#hmeF|QsIduhha(>WraNcsfuNor+kj_Y#p!>!6`Yy>5OLpIPfn061V{cSD zip+XyK*JYd@$53nGA}v5Mq1=Y5!kL_;?;LYo$_OdiT`|z{qv6_b!ETU?)#HDkheVn zF)CpMrfs!XH~^jU7lnq~0Dn zS|lOlRt;c~2-Ijda7r26OjjRtWGQK5#8vD69ydab@g+*b?l$*8{RNm3-P=v52WG`c z^@X2SMFDf_prrh+Zlm6rw?$;y@bVaHi~f4W?0C>~4t%#kXT;3Nv9z<6X}$f8sngd6 zkh#v^Qr1FdvFB3c{FcVz4n{6fZ)K}b&p`Jc6KiAi5P13!pJAjw!>D}r9yYJ=GYUJO zg1zH*bDe6HvF~j69Z%h*A_MeOlp7jQn%OwOXDAlT?yP0^={Y4G70GRi!qKgp5J@;7 z<`gU@F^2z%^uVSQ+8SYJ)1J_y?=!@q3j9&9VwKj$=8cYnafc8ezMl6JI%~+|Ngdxx z3zfjI<(Jc4gU*>~7KQ5diUx?Skea608!}_3NXb#%jpw&p(-&y2?BS21Qb1+v{0$S# zRdE?TI%P8S3dET7Zc zSvQS*Ds%MObf%Tu_gHRoKfwq26?6%unnS5q`{a`9nnY%+)^^00X+w6_jq(THtcTvb za;+fg^sk5;c#d6b`4?HKSjcft3f>qiC^@`55qquNS@)m?`MOyu6)M5mZ}4ekGriZK zyMdR|heuIE?&FY=h@2I7+c-!b1~miExmANN(5P!{8Cl_l6mVGg`$z!16WtJzYiRgl z)s9&-z+b}mYnIV2<_sda{RNV{y8jFc8E`K@oZvOFY%5QG7MQybua)Z#64;NOTQFg9 z!}x}FcgIOqMe@1C@4r7XTC|fsdn>7K9nQr8IsCmI)#}g~ORjd>oN-u8V{40Jt6Ip` zVU^Vml3#Afs%vgF-!t?3xk+T%-ocbh9Las{K5CMCu6EO1T2{abw%jjQ$CC=6(zh*OP+zNqo5ho_ zzpL+lUkQ{I6K{lU1`^n^Z(ji=&Eb^v^o4t6;kpv5r7yY?^tv#0m&ch(DR*sfi$!sy zeKkR(VUC4cRf)CT^3|)RZt6k~nr>@qKQhjcN5AmY`n|vONXgu~+dcxe$3gbaR%0FU zH5pL>PyI^wNbN;R!9vgelo#u9?rjXx3;zf4k&cvx`m0^|3|-9<^+&m)5N#Lw)+Hj8YP~0SQm* zB3dA`o8QB|#*n?&NK6D6H!@BvSebxKp_u(AN_dRWgWI|)u##Q%bcX^O4GfzU9JjQX zE5f)34N%t5J8mn9r23uSMR9(a_M`f3A!qLx_XxwIn&Z4{x82nOekl$TH1WDbDGqCv z3m7vuUR>YQlG?{3on@kD&cH{Pi&{P@pnx%oIh)(85Ptd8nX3utEHCs|6j(@)o&9%P z)1Mp(1@V%)5|N{5LZ=L3i9upqS3p#!SYQlB5&~nwN6zyF1dj)R-$X`!vQENjAue4q z5&d1vTM>tq^FA4|nE_xlX3){ON~_k|;dAo0fu+g$fSdC?pmIzf8(KlGgAhG5z<)9y zTo(JP+(}v$H-N3;g6XiXHPD1MH5Fi*1gHc{ePOmTq5*Q~a;&3XS;9NM#HLbYmMn5k zOJ{bV?oKGCDTyp~^5Tcu%LX@X(jZ|)T0_0hY-m_JMio_-6F&Zf|Ktik4_xeiAtkxv zwrrU?p3S0Ym_Buk-}JBP63K1(G~zVUd>1g4O&tK&8xHW^kF~u@Zckki3TR|+Uf@RA zux>99qnpPj{&izM7A#9$p6^6i=cMMc}_3pRM=5pL|3Ba#whM3411 z->eg3+1*xS0;^u1cLF)G(~@d?Jnt#F>cy09?VM_PHuq;pS|wRq)4qjmvGuf|HufTc znW*n+2!{kl2vQwxN`Hf~hS~tGfK0zvUXuot6D>WC(Osc>+Cg<5TU~#F^^*JioRBja zTs<1HB@w;!n_WpchDXPAH>WhIgq4z;QBHAnlCe_j?4qM@^5N&2$b7nhSc-Q$yYI|x z(t=P=im_UzJOvHW5|5Y++{rt1a_oP*AWxN3WQjuP|A4a|L((iz4yBZW&QzcX4udHn zK%+cqA3MsfM`F65pf)wTM*3KcR$;`dMS4X85*G}*^0jP%@}Ka<2)x9vUF$gZ}FHqt32B%a^1+ehz{YCyJq^ z9u1czKn+8LDk+<{HvrUT-y#igx}OIN>x$Eq9dmyYyP|#ax`xmYl zbT53~X?%pRw8zloi%2&=AScTwNrZ6HyD~lVWMb;%5O*OcImXn}?dfKrQ|ThcGn@=% z5-4vNbT17?B{uRRo45uJGXo}#B`f}-W#MIh>{tHUnH>gVg~~#?7DEG7{4ZhxjoAHiJGAI$fXFyWe$VZk-v2Z1Cp*Z(c&qkhMCoI`xj%ohemXg$T%&# zhO!ZrjT-JD{}j**+R%psrONu`k)=vgTxWqMn zXNpX7b`E27lo=NK=JU^F1S`K80;QpG;{iW%GQ8`4t^R&dXvS3R<;1imPGi<-HMD06 zw41bCbCr1QEbGz#ccshgant_IzdwJ4Qyi05$#Q)M5Z9n0nbU_;lyw;~pNf{bV2l zC^AcS$uv9{P#{hE{AiNCxV6!Uv4!GUjUBs8Vj z%a?a0moY2NT1kk4Vqk|B%*y}6AZARZ_*m8f@c)D~=`VR-N}JmGM6%88G)$zUX`oU2 H*e>#a*BhHb literal 0 HcmV?d00001 diff --git a/src/Auth/OAuth/Salesforce.php b/src/Auth/OAuth/Salesforce.php index e69de29bb2..89957e227e 100644 --- a/src/Auth/OAuth/Salesforce.php +++ b/src/Auth/OAuth/Salesforce.php @@ -0,0 +1,151 @@ + 'code', + 'client_id' => $this->appID, + 'redirect_uri'=> $this->callback, + 'scope'=> implode(' ', $this->getScopes()), + 'state' => json_encode($this->state) + ]); + } + + /** + * @param string $code + * + * @return string + */ + public function getAccessToken(string $code): string + { + $headers = [ + "Authorization: Basic " . base64_encode($this->appID . ":" . $this->appSecret), + "Content-Type: application/x-www-form-urlencoded", + ]; + + $accessToken = $this->request( + 'POST', + 'https://login.salesforce.com/services/oauth2/token', + $headers, + http_build_query([ + 'code' => $code, + 'redirect_uri' => $this->callback , + 'grant_type' => 'authorization_code' + ]) + ); + $accessToken = json_decode($accessToken, true); + + if (isset($accessToken['access_token'])) { + return $accessToken['access_token']; + } + + return ''; + } + + /** + * @param string $accessToken + * + * @return string + */ + public function getUserID(string $accessToken): string + { + $user = $this->getUser($accessToken); + + if (isset($user['user_id'])) { + return $user['user_id']; + } + + return ''; + } + + /** + * @param string $accessToken + * + * @return string + */ + public function getUserEmail(string $accessToken): string + { + $user = $this->getUser($accessToken); + + if (isset($user['email'])) { + return $user['email']; + } + + return ''; + } + + /** + * @param string $accessToken + * + * @return string + */ + public function getUserName(string $accessToken): string + { + $user = $this->getUser($accessToken); + + if (isset($user['name'])) { + return $user['name']; + } + + return ''; + } + + /** + * @param string $accessToken + * + * @return array + */ + protected function getUser(string $accessToken): array + { + if (empty($this->user)) { + $user = $this->request('GET', 'https://login.salesforce.com/services/oauth2/userinfo?access_token='.urlencode($accessToken)); + $this->user = json_decode($user, true); + } + return $this->user; + } +} From d41e1790c580c355f6ce50a59ef903a9a3c08f3c Mon Sep 17 00:00:00 2001 From: Christy Jacob Date: Mon, 20 Jan 2020 09:39:01 +0530 Subject: [PATCH 3/9] feat: added Yandex OAuth Adapter --- app/config/providers.php | 6 ++ src/Auth/OAuth/Yandex.php | 150 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 156 insertions(+) create mode 100644 src/Auth/OAuth/Yandex.php diff --git a/app/config/providers.php b/app/config/providers.php index 3b5661790f..c6bc9b2037 100644 --- a/app/config/providers.php +++ b/app/config/providers.php @@ -115,6 +115,12 @@ return [ 'enabled' => true, 'mock' => false, ], + 'yandex' => [ + 'developers' => 'https://tech.yandex.com/oauth/', + 'icon' => 'icon-yandex', + 'enabled' => true, + 'mock' => false, + ], 'twitter' => [ 'developers' => 'https://developer.twitter.com/', 'icon' => 'icon-twitter', diff --git a/src/Auth/OAuth/Yandex.php b/src/Auth/OAuth/Yandex.php new file mode 100644 index 0000000000..bcd7ec1a85 --- /dev/null +++ b/src/Auth/OAuth/Yandex.php @@ -0,0 +1,150 @@ + 'code', + 'client_id' => $this->appID, + 'scope'=> implode(' ', $this->getScopes()), + 'state' => json_encode($this->state) + ]); + } + + /** + * @param string $code + * + * @return string + */ + public function getAccessToken(string $code): string + { + $headers = [ + "Authorization: Basic " . base64_encode($this->appID . ":" . $this->appSecret), + "Content-Type: application/x-www-form-urlencoded", + ]; + + $accessToken = $this->request( + 'POST', + 'https://oauth.yandex.com/token', + $headers, + http_build_query([ + 'code' => $code, + 'grant_type' => 'authorization_code' + ]) + ); + $accessToken = json_decode($accessToken, true); + + if (isset($accessToken['access_token'])) { + return $accessToken['access_token']; + } + + return ''; + } + + /** + * @param string $accessToken + * + * @return string + */ + public function getUserID(string $accessToken): string + { + $user = $this->getUser($accessToken); + + if (isset($user['id'])) { + return $user['id']; + } + + return ''; + } + + /** + * @param string $accessToken + * + * @return string + */ + public function getUserEmail(string $accessToken): string + { + $user = $this->getUser($accessToken); + + if (isset($user['default_email'])) { + return $user['default_email']; + } + + return ''; + } + + /** + * @param string $accessToken + * + * @return string + */ + public function getUserName(string $accessToken): string + { + $user = $this->getUser($accessToken); + + if (isset($user['display_name'])) { + return $user['display_name']; + } + + return ''; + } + + /** + * @param string $accessToken + * + * @return array + */ + protected function getUser(string $accessToken): array + { + if (empty($this->user)) { + $user = $this->request('GET', 'https://login.yandex.ru/info?'.http_build_query([ + 'format' => 'json', + 'oauth_token' => $accessToken + ])); + $this->user = json_decode($user, true); + } + return $this->user; + } +} From 82c60b318d18b42197d7b0e22483c158a48bd111 Mon Sep 17 00:00:00 2001 From: Christy Jacob Date: Mon, 20 Jan 2020 10:23:29 +0530 Subject: [PATCH 4/9] added yandex logo --- public/images/oauth/yandex.png | Bin 0 -> 3265 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 public/images/oauth/yandex.png diff --git a/public/images/oauth/yandex.png b/public/images/oauth/yandex.png new file mode 100644 index 0000000000000000000000000000000000000000..cd47db8b36b108bace060e61c1422090407235b5 GIT binary patch literal 3265 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 literal 0 HcmV?d00001 From 47e32c990e372c9f83f897b2bf0fcd5b213e7986 Mon Sep 17 00:00:00 2001 From: Armino Popp Date: Mon, 20 Jan 2020 12:55:05 +0200 Subject: [PATCH 5/9] Added Paypal OAuth provider --- app/config/providers.php | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/app/config/providers.php b/app/config/providers.php index c6bc9b2037..863d880d69 100644 --- a/app/config/providers.php +++ b/app/config/providers.php @@ -127,6 +127,12 @@ return [ 'enabled' => false, 'mock' => false ], + 'paypal' => [ + 'developers' => 'https://developer.paypal.com/docs/api/overview/', + 'icon' => 'icon-paypal', + 'enabled' => true, + 'mock' => false + ], // Keep Last 'mock' => [ 'developers' => 'https://appwrite.io', From 3b1bd4578a35f0578b43105455e642303382055c Mon Sep 17 00:00:00 2001 From: Armino Popp Date: Mon, 20 Jan 2020 12:55:32 +0200 Subject: [PATCH 6/9] Added Paypal icon --- public/images/oauth/paypal.png | Bin 0 -> 2492 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 public/images/oauth/paypal.png diff --git a/public/images/oauth/paypal.png b/public/images/oauth/paypal.png new file mode 100644 index 0000000000000000000000000000000000000000..8c14828cfdbf9be43b58266d6e0526d79986f4dc GIT binary patch literal 2492 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 Date: Mon, 20 Jan 2020 12:56:16 +0200 Subject: [PATCH 7/9] Initial commit --- src/Auth/OAuth/Paypal.php | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 src/Auth/OAuth/Paypal.php diff --git a/src/Auth/OAuth/Paypal.php b/src/Auth/OAuth/Paypal.php new file mode 100644 index 0000000000..e69de29bb2 From 318b1a577bdb4fa3cb0ba315db3fa1c482bd7b35 Mon Sep 17 00:00:00 2001 From: Armino Popp Date: Mon, 20 Jan 2020 13:44:16 +0200 Subject: [PATCH 8/9] Added Paypal OAuth provider --- src/Auth/OAuth/Paypal.php | 164 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 164 insertions(+) diff --git a/src/Auth/OAuth/Paypal.php b/src/Auth/OAuth/Paypal.php index e69de29bb2..064b04cb82 100644 --- a/src/Auth/OAuth/Paypal.php +++ b/src/Auth/OAuth/Paypal.php @@ -0,0 +1,164 @@ + 'https://www.sandbox.paypal.com/', + 'live' => 'https://www.paypal.com/', + ]; + + private $resourceEndpoint = [ + 'sandbox' => 'https://api.sandbox.paypal.com/v1/', + 'live' => 'https://api.paypal.com/v1/', + ]; + + private $environment = 'sandbox'; + + /** + * @var array + */ + protected $user = []; + + + protected $scopes = [ + 'openid', + 'profile', + 'email' + ]; + + /** + * @return string + */ + public function getName(): string + { + return 'paypal'; + } + + /** + * @return string + */ + public function getLoginURL(): string + { + $url = $this->endpoint[$this->environment] . 'connect/?'. + http_build_query([ + 'flowEntry' => 'static', + 'response_type' => 'code', + 'client_id' => $this->appID, + 'scope' => implode(' ', $this->getScopes()), + // paypal is not accepting localhost string into return uri + 'redirect_uri' => str_replace("localhost", "127.0.0.1", $this->callback), + 'state' => json_encode($this->state), + ]); + + return $url; + } + + /** + * @param string $code + * + * @return string + */ + public function getAccessToken(string $code): string + { + $accessToken = $this->request( + 'POST', + $this->resourceEndpoint[$this->environment] . 'oauth2/token', + ['Authorization: Basic ' . base64_encode($this->appID . ':' . $this->appSecret)], + http_build_query([ + 'code' => $code, + 'grant_type' => 'authorization_code', + ]) + ); + + + $accessToken = json_decode($accessToken, true); + + + if (isset($accessToken['access_token'])) { + return $accessToken['access_token']; + } + + return ''; + } + + /** + * @param string $accessToken + * + * @return string + */ + public function getUserID(string $accessToken): string + { + $user = $this->getUser($accessToken); + + if (isset($user['payer_id'])) { + return $user['payer_id']; + } + + return ''; + } + + /** + * @param string $accessToken + * + * @return string + */ + public function getUserEmail(string $accessToken): string + { + $user = $this->getUser($accessToken); + + if (isset($user['emails'])) { + return $user['emails'][0]['value']; + } + + return ''; + } + + /** + * @param string $accessToken + * + * @return string + */ + public function getUserName(string $accessToken): string + { + $user = $this->getUser($accessToken); + + if (isset($user['name'])) { + return $user['name']; + } + + return ''; + } + + /** + * @param string $accessToken + * + * @return array + */ + protected function getUser(string $accessToken): array + { + $header = [ + 'Content-Type: application/json', + 'Authorization: Bearer '.urlencode($accessToken), + ]; + if (empty($this->user)) { + $user = $this->request( + 'GET', + $this->resourceEndpoint[$this->environment] . 'identity/oauth2/userinfo?schema=paypalv1.1', + $header + ); + $this->user = json_decode($user, true); + } + + return $this->user; + } +} From f68089e0e5b91ff7a513e34248fb03b0dec07218 Mon Sep 17 00:00:00 2001 From: Armino Popp Date: Mon, 20 Jan 2020 15:00:57 +0200 Subject: [PATCH 9/9] Changed to live --- src/Auth/OAuth/Paypal.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Auth/OAuth/Paypal.php b/src/Auth/OAuth/Paypal.php index 064b04cb82..bff273b24d 100644 --- a/src/Auth/OAuth/Paypal.php +++ b/src/Auth/OAuth/Paypal.php @@ -22,7 +22,7 @@ class Paypal extends OAuth 'live' => 'https://api.paypal.com/v1/', ]; - private $environment = 'sandbox'; + private $environment = 'live'; /** * @var array