public function ajax_connect_clef_account_with_oauth_code()
 {
     if (!ClefUtils::isset_POST('identifier')) {
         return new WP_Error("invalid_oauth_code", __("invalid OAuth Code", "clef"));
     }
     try {
         $info = ClefUtils::exchange_oauth_code_for_info(ClefUtils::isset_POST('identifier'), $this->settings);
     } catch (LoginException $e) {
         return new WP_Error("bad_oauth_exchange", $e->getMessage());
     }
     $result = ClefUtils::associate_clef_id($info->id);
     if (is_wp_error($result)) {
         return $result;
     } else {
         $session = ClefSession::start();
         $session->set('logged_in_at', time());
         return array("success" => true);
     }
 }
 public function connect_clef_account()
 {
     if (ClefUtils::isset_GET('connect_clef_account') && ClefUtils::isset_get('code')) {
         try {
             $info = ClefUtils::exchange_oauth_code_for_info(ClefUtils::isset_GET('code'), $this->settings);
             $result = ClefUtils::associate_clef_id($info->id);
             if (is_wp_error($result)) {
                 $this->connect_error = $result;
             } else {
                 $session = ClefSession::start();
                 $session->set('logged_in_at', time());
                 return;
             }
         } catch (LoginException $e) {
             $this->connect_error = new WP_Error("bad_oauth_exchange", $e->getMessage());
         } catch (ClefStateException $e) {
             $this->connect_error = new WP_Error("bad_state_parameter", $e->getMessage());
         }
     }
 }
 public function authenticate_clef($user, $username, $password)
 {
     if (isset($_REQUEST['clef']) && isset($_REQUEST['code'])) {
         $this->apply_filter_and_action_fixes("authenticate");
         // Authenticate
         try {
             $info = ClefUtils::exchange_oauth_code_for_info($_REQUEST['code'], $this->settings);
         } catch (LoginException $e) {
             return new WP_Error('clef', $e->getMessage());
         } catch (ClefStateException $e) {
             return new WP_Error('clef', $e->getMessage());
         }
         $clef_id = $info->id;
         $email = isset($info->email) ? $info->email : "";
         $first_name = isset($info->first_name) ? $info->first_name : "";
         $last_name = isset($info->last_name) ? $info->last_name : "";
         $users = get_users(array('meta_key' => 'clef_id', 'meta_value' => $clef_id, 'blog_id' => false));
         if ($users) {
             // already have a user with this clef_id
             $user = $users[0];
         } else {
             $user = get_user_by('email', $email);
             if (!$user) {
                 if (get_option('users_can_register') && $this->settings->registration_with_clef_is_allowed()) {
                     // Users can register, so create a new user
                     $id = wp_create_user($email, wp_generate_password(16, FALSE), $email);
                     if (is_wp_error($id)) {
                         return new WP_Error('clef', __("An error occurred when creating your new account: ", 'clef') . $id->get_error_message());
                     }
                     $user = get_user_by('id', $id);
                 } else {
                     $this->clef_id_to_connect = $clef_id;
                     return new WP_Error('clef', __("There's <b>no WordPress user</b> connected to your Clef account. <br></br> Log in with your standard username and password to <b>automatically connect your Clef account</b> now.", 'clef'));
                 }
             }
             ClefUtils::associate_clef_id($clef_id, $user->ID);
         }
         do_action('clef_login', $user->ID);
         // Log in the user
         $session = ClefSession::start();
         $session->set('logged_in_at', time());
         return $user;
     } else {
         return $user;
     }
 }