These results are based on our legacy PHP analysis, consider migrating to our new PHP analysis engine instead. Learn more
| 1 | <?php |
||
| 2 | /** |
||
| 3 | * This file is part of the adlogix/guzzle-atlassian-connect package. |
||
| 4 | * |
||
| 5 | * For the full copyright and license information, please view the LICENSE |
||
| 6 | * file that was distributed with this source code. |
||
| 7 | */ |
||
| 8 | |||
| 9 | require_once 'vendor/autoload.php'; |
||
| 10 | |||
| 11 | use Adlogix\GuzzleAtlassianConnect\Middleware\ConnectMiddleware; |
||
| 12 | use Adlogix\GuzzleAtlassianConnect\Security\QueryParamAuthentication; |
||
| 13 | use GuzzleHttp\Client; |
||
| 14 | use GuzzleHttp\HandlerStack; |
||
| 15 | use Silex\Application; |
||
| 16 | use Symfony\Component\HttpFoundation\Request; |
||
| 17 | |||
| 18 | /** |
||
| 19 | * See the 'installed' webhook on how to recover this payload. |
||
| 20 | * |
||
| 21 | * The sharedSecret is given by the application we installed the add-on to, |
||
| 22 | * this is needed to sign our request and to validate the requests from the application. |
||
| 23 | */ |
||
| 24 | $sharedSecret = ''; |
||
| 25 | $baseUrl = ''; |
||
| 26 | View Code Duplication | if (file_exists('payload.json')) { |
|
| 27 | $payload = json_decode(file_get_contents('payload.json')); |
||
| 28 | $sharedSecret = $payload->sharedSecret; |
||
| 29 | $baseUrl = $payload->baseUrl; |
||
| 30 | } |
||
| 31 | |||
| 32 | /** |
||
| 33 | * Here we create the middleware; |
||
| 34 | * for the authentication method we give the key we defined in our descriptor, |
||
| 35 | * and the second parameter is the sharedSecret given by atlassian when we installed the add-on. |
||
| 36 | * |
||
| 37 | * For more info on the descriptor, |
||
| 38 | * @see https://developer.atlassian.com/static/connect/docs/latest/modules/ |
||
| 39 | * |
||
| 40 | * For more info on how to get the sharedKey, you need to define the installed lifecycle in your descriptor. |
||
| 41 | * @see https://developer.atlassian.com/static/connect/docs/latest/modules/lifecycle.html |
||
| 42 | * |
||
| 43 | * The second parameter ro create the middleware is the full path to the application we want to connect to. |
||
| 44 | * For the demo we use Confluence which resides at http://atlassian-confluence.dev/confluence |
||
| 45 | * |
||
| 46 | * If your sharedSecret is empty, there's no need to try to contact the application, |
||
| 47 | * so be sure you received the 'enabled' webhook call before trying to contact it. |
||
| 48 | */ |
||
| 49 | $middleware = new ConnectMiddleware( |
||
| 50 | new QueryParamAuthentication('ourKey', $sharedSecret), |
||
| 51 | $baseUrl |
||
| 52 | ); |
||
| 53 | |||
| 54 | |||
| 55 | /** |
||
| 56 | * We start to build ou Guzzle Client by defining the HandlerStack and pushing our middleware in it. |
||
| 57 | */ |
||
| 58 | $stack = HandlerStack::create(); |
||
| 59 | $stack->push($middleware); |
||
| 60 | |||
| 61 | /** |
||
| 62 | * And the Client creation |
||
| 63 | */ |
||
| 64 | $client = new Client( |
||
| 65 | [ |
||
| 66 | 'base_uri' => $baseUrl . '/rest/api/', |
||
| 67 | 'handler' => $stack, |
||
| 68 | 'debug' => true |
||
| 69 | ] |
||
| 70 | ); |
||
| 71 | |||
| 72 | |||
| 73 | /** |
||
| 74 | * Since [name-your-app] needs to reach our application to post some information, like the sharedSecret, we have to define some routes. |
||
| 75 | * At time of writing Confluence refuses to contact us if the route contains .php so we need to prettify our URLS. |
||
| 76 | * Our sample is not the best way to do it, but it's just for the demo. |
||
| 77 | */ |
||
| 78 | |||
| 79 | |||
| 80 | $app = new Application(); |
||
| 81 | |||
| 82 | |||
| 83 | /** |
||
| 84 | * Our sample descriptor is available at http://atlassian-connect.dev/descriptor.json |
||
| 85 | * |
||
| 86 | * This is the bare minimal descriptor to be defined. |
||
| 87 | * |
||
| 88 | * You can validate your descriptor |
||
| 89 | * @see https://atlassian-connect-validator.herokuapp.com/validate |
||
| 90 | */ |
||
| 91 | $app->get('/descriptor.json', function (Request $request) { |
||
| 92 | |||
| 93 | /* |
||
| 94 | * We have to construct the correct URL in order to confluence be able to contact us |
||
| 95 | * And the scheme MUST be https in order to confluence accept it. |
||
| 96 | */ |
||
| 97 | $host = $request->getHttpHost(); |
||
| 98 | $scheme = $request->getScheme(); |
||
| 99 | |||
| 100 | if (preg_match('/\.ngrok\.io/', $host)) { |
||
| 101 | $scheme = 'https'; |
||
| 102 | } |
||
| 103 | |||
| 104 | |||
| 105 | return json_encode([ |
||
| 106 | 'authentication' => [ |
||
| 107 | 'type' => 'jwt' |
||
| 108 | ], |
||
| 109 | 'baseUrl' => $scheme . '://' . $host, |
||
| 110 | 'scopes' => [ |
||
| 111 | 'read' |
||
| 112 | ], |
||
| 113 | 'key' => 'ourKey', |
||
| 114 | 'lifecycle' => [ |
||
| 115 | 'installed' => '/installed', |
||
| 116 | 'enabled' => '/enabled' |
||
| 117 | ], |
||
| 118 | ]); |
||
| 119 | }); |
||
| 120 | |||
| 121 | /** |
||
| 122 | * When we install our add-on into any atlassian app, they will contact us at the URL we define in the 'installed' lifecycle. |
||
| 123 | * They will give us a payload containing the sharedSecret we'll need to use to sign our request. |
||
| 124 | * For the demo we just save the content to a file. |
||
| 125 | */ |
||
| 126 | $app->post('/installed', function (Request $request) { |
||
| 127 | |||
| 128 | $payload = $request->getContent(); |
||
| 129 | file_put_contents('payload.json', $payload); |
||
| 130 | |||
| 131 | /** |
||
| 132 | * Be sure to send a 200 OK response, or the app will tell you that your plugin can't be installed. |
||
| 133 | */ |
||
| 134 | return new \Symfony\Component\HttpFoundation\Response('OK', 200); |
||
| 135 | }); |
||
| 136 | |||
| 137 | |||
| 138 | /** |
||
| 139 | * Even if the documentation tell's you the only needed webhook is the installed one, |
||
| 140 | * they won't let you enable the add-on unless you define the route to you 'enabled' webhook. |
||
| 141 | */ |
||
| 142 | $app->post('/enabled', function () { |
||
| 143 | /** |
||
| 144 | * Be sure to send a 200 OK response, or the app will tell you that your plugin can't be enabled. |
||
| 145 | */ |
||
| 146 | return new \Symfony\Component\HttpFoundation\Response('OK', 200); |
||
| 147 | }); |
||
| 148 | |||
| 149 | //Catch all route to run our test code |
||
| 150 | $app->match('{url}', function ($url) use ($client) { |
||
|
0 ignored issues
–
show
|
|||
| 151 | $response = $client->get('space'); |
||
| 152 | |||
| 153 | var_dump($response->getBody()->getContents()); |
||
| 154 | })->assert('url', '.+'); |
||
| 155 | |||
| 156 | |||
| 157 | $app->run(); |
||
| 158 |
This check looks from parameters that have been defined for a function or method, but which are not used in the method body.