oauth.php 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. <?php
  2. namespace NinjaForms;
  3. class OAuth
  4. {
  5. protected static $instance;
  6. protected $base_url;
  7. protected $client_id,
  8. $client_secret;
  9. public static function getInstance() {
  10. if ( null == self::$instance ) {
  11. self::$instance = new static();
  12. }
  13. return self::$instance;
  14. }
  15. public static function set_base_url( $base_url ) {
  16. self::getInstance()->base_url = trailingslashit( $base_url );
  17. }
  18. protected function __construct() {
  19. $this->client_id = get_option( 'ninja_forms_oauth_client_id' );
  20. $this->client_secret = get_option( 'ninja_forms_oauth_client_secret' );
  21. if( ! $this->client_secret ){
  22. $this->client_secret = self::generate_secret();
  23. update_option( 'ninja_forms_oauth_client_secret', $this->client_secret );
  24. }
  25. }
  26. public function setup() {
  27. add_action( 'wp_ajax_nf_oauth', function(){
  28. wp_die( json_encode( [
  29. 'data' => [
  30. 'connected' => ( $this->client_id ),
  31. 'connect_url' => self::connect_url(),
  32. ]
  33. ] ) );
  34. });
  35. add_action( 'wp_ajax_nf_oauth_connect', [ $this, 'connect' ] );
  36. add_action( 'wp_ajax_nf_oauth_disconnect', [ $this, 'disconnect' ] );
  37. }
  38. public static function is_connected() {
  39. return ( self::getInstance()->client_id );
  40. }
  41. public static function get_client_id() {
  42. return self::getInstance()->client_id;
  43. }
  44. public static function get_client_secret() {
  45. return self::getInstance()->client_secret;
  46. }
  47. public static function connect_url( $endpoint = 'connect' ) {
  48. $client_redirect = add_query_arg( [
  49. 'action' => 'nf_oauth_connect',
  50. 'nonce' => wp_create_nonce( 'nf-oauth-connect' )
  51. ], admin_url( 'admin-ajax.php' ) );
  52. return add_query_arg([
  53. 'client_secret' => self::get_client_secret(),
  54. 'client_redirect' => urlencode( $client_redirect ),
  55. 'client_site_url' => urlencode( site_url() ),
  56. ], self::getInstance()->base_url . $endpoint );
  57. }
  58. public function connect() {
  59. // wp_verify_nonce( $_REQUEST['nonce'], 'nf-oauth-connect' );
  60. if( ! isset( $_GET[ 'client_id' ] ) ) return;
  61. $client_id = sanitize_text_field( $_GET[ 'client_id' ] );
  62. update_option( 'ninja_forms_oauth_client_id', $client_id );
  63. if( isset( $_GET[ 'redirect' ] ) ){
  64. $redirect = sanitize_text_field( $_GET[ 'redirect' ] );
  65. $redirect = add_query_arg( 'client_id', $client_id, $redirect );
  66. wp_redirect( $redirect );
  67. exit;
  68. }
  69. wp_safe_redirect( admin_url( 'admin.php?page=ninja-forms#services' ) );
  70. exit;
  71. }
  72. public function disconnect() {
  73. do_action( 'ninja_forms_oauth_disconnect' );
  74. $url = trailingslashit( $this->base_url ) . 'disconnect';
  75. $args = [
  76. 'blocking' => false,
  77. 'method' => 'DELETE',
  78. 'body' => [
  79. 'client_id' => get_option( 'ninja_forms_oauth_client_id' ),
  80. 'client_secret' => get_option( 'ninja_forms_oauth_client_secret' )
  81. ]
  82. ];
  83. $response = wp_remote_request( $url, $args );
  84. delete_option( 'ninja_forms_oauth_client_id' );
  85. delete_option( 'ninja_forms_oauth_client_secret' );
  86. wp_die( 1 );
  87. }
  88. public static function generate_secret( $length = 40 ) {
  89. if( 0 >= $length ) $length = 40; // Min key length.
  90. if( 255 <= $length ) $length = 255; // Max key length.
  91. $characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
  92. $random_string = '';
  93. for ( $i = 0; $i < $length; $i ++ ) {
  94. $random_string .= $characters[ rand( 0, strlen( $characters ) - 1 ) ];
  95. }
  96. return $random_string;
  97. }
  98. }