Completed
Push — try/seperate-publicize-handlin... ( f77f43...05ee48 )
by
unknown
08:54
created

Jetpack_Service_Helper::disconnect()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 11

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 2
nc 2
nop 5
dl 0
loc 11
rs 9.9
c 0
b 0
f 0
1
<?php
2
3
class Jetpack_Service_Helper {
4
	/**
5
	 * @var Jetpack_Service_Helper
6
	 **/
7
	private static $instance = null;
8
9
	static function init() {
10
		if ( is_null( self::$instance ) ) {
11
			self::$instance = new Jetpack_Service_Helper;
12
		}
13
14
		return self::$instance;
15
	}
16
17
	private function __construct() {
18
		add_action( 'load-settings_page_sharing', array( __CLASS__, 'admin_page_load' ), 9 );
19
	}
20
21
	/**
22
	 * Gets a URL to the public-api actions. Works like WP's admin_url
23
	 *
24
	 * @param string $service Shortname of a specific service.
25
	 *
26
	 * @return URL to specific public-api process
27
	 */
28
	// on WordPress.com this is/calls Keyring::admin_url
29
	static function api_url( $service = false, $params = array() ) {
30
		/**
31
		 * Filters the API URL used to interact with WordPress.com.
32
		 *
33
		 * @module publicize
34
		 *
35
		 * @since 2.0.0
36
		 *
37
		 * @param string https://public-api.wordpress.com/connect/?jetpack=publicize Default Publicize API URL.
38
		 */
39
		$url = apply_filters( 'publicize_api_url', 'https://public-api.wordpress.com/connect/?jetpack=publicize' );
40
41
		if ( $service ) {
42
			$url = add_query_arg( array( 'service' => $service ), $url );
43
		}
44
45
		if ( count( $params ) ) {
46
			$url = add_query_arg( $params, $url );
47
		}
48
49
		return $url;
50
	}
51
52 View Code Duplication
	static function connect_url( $service_name ) {
53
		return add_query_arg( array(
54
			'action'   => 'request',
55
			'service'  => $service_name,
56
			'kr_nonce' => wp_create_nonce( 'keyring-request' ),
57
			'nonce'    => wp_create_nonce( "keyring-request-$service_name" ),
58
		), menu_page_url( 'sharing', false ) );
59
	}
60
61
	static function refresh_url( $service_name ) {
62
		return add_query_arg( array(
63
			'action'   => 'request',
64
			'service'  => $service_name,
65
			'kr_nonce' => wp_create_nonce( 'keyring-request' ),
66
			'refresh'  => 1,
67
			'for'      => 'publicize',
68
			'nonce'    => wp_create_nonce( "keyring-request-$service_name" ),
69
		), admin_url( 'options-general.php?page=sharing' ) );
70
	}
71
72 View Code Duplication
	static function disconnect_url( $service_name, $id ) {
73
		return add_query_arg( array(
74
			'action'   => 'delete',
75
			'service'  => $service_name,
76
			'id'       => $id,
77
			'kr_nonce' => wp_create_nonce( 'keyring-request' ),
78
			'nonce'    => wp_create_nonce( "keyring-request-$service_name" ),
79
		), menu_page_url( 'sharing', false ) );
80
	}
81
82
	static function admin_page_load() {
83
		if ( isset( $_GET['action'] ) ) {
84
			if ( isset( $_GET['service'] ) ) {
85
				$service_name = $_GET['service'];
86
			}
87
88
			switch ( $_GET['action'] ) {
89
90
				case 'request':
91
					check_admin_referer( 'keyring-request', 'kr_nonce' );
92
					check_admin_referer( "keyring-request-$service_name", 'nonce' );
0 ignored issues
show
Bug introduced by
The variable $service_name does not seem to be defined for all execution paths leading up to this point.

If you define a variable conditionally, it can happen that it is not defined for all execution paths.

Let’s take a look at an example:

function myFunction($a) {
    switch ($a) {
        case 'foo':
            $x = 1;
            break;

        case 'bar':
            $x = 2;
            break;
    }

    // $x is potentially undefined here.
    echo $x;
}

In the above example, the variable $x is defined if you pass “foo” or “bar” as argument for $a. However, since the switch statement has no default case statement, if you pass any other value, the variable $x would be undefined.

Available Fixes

  1. Check for existence of the variable explicitly:

    function myFunction($a) {
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
        }
    
        if (isset($x)) { // Make sure it's always set.
            echo $x;
        }
    }
    
  2. Define a default value for the variable:

    function myFunction($a) {
        $x = ''; // Set a default which gets overridden for certain paths.
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
        }
    
        echo $x;
    }
    
  3. Add a value for the missing path:

    function myFunction($a) {
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
    
            // We add support for the missing case.
            default:
                $x = '';
                break;
        }
    
        echo $x;
    }
    
Loading history...
93
94
					$verification = Jetpack::generate_secrets( 'publicize' );
95
					if ( ! $verification ) {
0 ignored issues
show
Bug Best Practice introduced by
The expression $verification of type array is implicitly converted to a boolean; are you sure this is intended? If so, consider using empty($expr) instead to make it clear that you intend to check for an array without elements.

This check marks implicit conversions of arrays to boolean values in a comparison. While in PHP an empty array is considered to be equal (but not identical) to false, this is not always apparent.

Consider making the comparison explicit by using empty(..) or ! empty(...) instead.

Loading history...
96
						$url = Jetpack::admin_url( 'jetpack#/settings' );
97
						wp_die( sprintf( __( "Jetpack is not connected. Please connect Jetpack by visiting <a href='%s'>Settings</a>.", 'jetpack' ), $url ) );
98
99
					}
100
					$stats_options = get_option( 'stats_options' );
101
					$wpcom_blog_id = Jetpack_Options::get_option( 'id' );
102
					$wpcom_blog_id = ! empty( $wpcom_blog_id ) ? $wpcom_blog_id : $stats_options['blog_id'];
103
104
					$user     = wp_get_current_user();
105
					$redirect = Jetpack_Service_Helper::api_url( $service_name, urlencode_deep( array(
106
						'action'       => 'request',
107
						'redirect_uri' => add_query_arg( array( 'action' => 'done' ), menu_page_url( 'sharing', false ) ),
108
						'for'          => 'publicize',
109
						// required flag that says this connection is intended for publicize
110
						'siteurl'      => site_url(),
111
						'state'        => $user->ID,
112
						'blog_id'      => $wpcom_blog_id,
113
						'secret_1'     => $verification['secret_1'],
114
						'secret_2'     => $verification['secret_2'],
115
						'eol'          => $verification['exp'],
116
					) ) );
117
					wp_redirect( $redirect );
118
					exit;
0 ignored issues
show
Coding Style Compatibility introduced by
The method admin_page_load() contains an exit expression.

An exit expression should only be used in rare cases. For example, if you write a short command line script.

In most cases however, using an exit expression makes the code untestable and often causes incompatibilities with other libraries. Thus, unless you are absolutely sure it is required here, we recommend to refactor your code to avoid its usage.

Loading history...
119
					break;
0 ignored issues
show
Unused Code introduced by
break; does not seem to be reachable.

This check looks for unreachable code. It uses sophisticated control flow analysis techniques to find statements which will never be executed.

Unreachable code is most often the result of return, die or exit statements that have been added for debug purposes.

function fx() {
    try {
        doSomething();
        return true;
    }
    catch (\Exception $e) {
        return false;
    }

    return false;
}

In the above example, the last return false will never be executed, because a return statement has already been met in every possible execution path.

Loading history...
120
121
				case 'completed':
122
					Jetpack::load_xml_rpc_client();
123
					$xml = new Jetpack_IXR_Client();
124
					$xml->query( 'jetpack.fetchPublicizeConnections' );
125
126
					if ( ! $xml->isError() ) {
127
						$response = $xml->getResponse();
128
						Jetpack_Options::update_option( 'publicize_connections', $response );
129
					}
130
131
					break;
132
133
				case 'delete':
134
					$id = $_GET['id'];
135
136
					check_admin_referer( 'keyring-request', 'kr_nonce' );
137
					check_admin_referer( "keyring-request-$service_name", 'nonce' );
138
139
					Jetpack_Service_Helper::disconnect( $service_name, $id );
140
141
					do_action( 'connection_disconnected', $service_name );
142
					break;
143
			}
144
		}
145
	}
146
147
	/**
148
	 * Remove a Publicize connection
149
	 */
150
	static function disconnect( $service_name, $connection_id, $_blog_id = false, $_user_id = false, $force_delete = false ) {
151
		Jetpack::load_xml_rpc_client();
152
		$xml = new Jetpack_IXR_Client();
153
		$xml->query( 'jetpack.deletePublicizeConnection', $connection_id );
154
155
		if ( ! $xml->isError() ) {
156
			Jetpack_Options::update_option( 'publicize_connections', $xml->getResponse() );
157
		} else {
158
			return false;
159
		}
160
	}
161
162
}
163