mirror of
https://we.phorge.it/source/phorge.git
synced 2024-11-25 16:22:43 +01:00
Adding an "ssh" client for conduit
Summary: ..."ssh" is in quotes 'cuz this is step 1 and there's no ssh in sight at the moment. Test Plan: ran api.php PHID-USER-xee4ju2teq7mflitwfcs differential.query a few times... - tried valid input, it worked! - tried bad input, it worked in that it failed and told me so! ran api.php crap_user differential.query a few times... - verified error message with respect to crap_user ran api.php PHID-USER-xee4ju2teq7mflitwfcs crap_method a few times... - verified error message with respect to crap_method visited http://phabricator.dev/conduit/method/differential.query a few times... - tried valid input, it worked! Reviewers: epriestley Reviewed By: epriestley CC: aran, btrahan, epriestley Maniphest Tasks: T550 Differential Revision: https://secure.phabricator.com/D1357
This commit is contained in:
parent
04eb1f98e2
commit
cf61f0e32d
7 changed files with 181 additions and 10 deletions
97
scripts/conduit/api.php
Normal file
97
scripts/conduit/api.php
Normal file
|
@ -0,0 +1,97 @@
|
|||
#!/usr/bin/env php
|
||||
<?php
|
||||
|
||||
/*
|
||||
* Copyright 2012 Facebook, Inc.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
$root = dirname(dirname(dirname(__FILE__)));
|
||||
require_once $root.'/scripts/__init_script__.php';
|
||||
|
||||
phutil_require_module('phutil', 'console');
|
||||
|
||||
$time_start = microtime(true);
|
||||
|
||||
if ($argc !== 3) {
|
||||
echo "usage: api.php <user_phid> <method>\n";
|
||||
exit(1);
|
||||
}
|
||||
|
||||
$user = null;
|
||||
$user_str = $argv[1];
|
||||
try {
|
||||
$user = id(new PhabricatorUser())
|
||||
->loadOneWhere('phid = %s', $user_str);
|
||||
} catch (Exception $e) {
|
||||
// no op; we'll error in a line or two
|
||||
}
|
||||
if (empty($user)) {
|
||||
echo "usage: api.php <user_phid> <method>\n" .
|
||||
"user {$user_str} does not exist or failed to load\n";
|
||||
exit(1);
|
||||
}
|
||||
|
||||
$method = $argv[2];
|
||||
$method_class_str = ConduitAPIMethod::getClassNameFromAPIMethodName($method);
|
||||
try {
|
||||
$method_class = newv($method_class_str, array());
|
||||
} catch (Exception $e) {
|
||||
echo "usage: api.php <user_phid> <method>\n" .
|
||||
"method {$method_class_str} does not exist\n";
|
||||
exit(1);
|
||||
}
|
||||
$log = new PhabricatorConduitMethodCallLog();
|
||||
$log->setMethod($method);
|
||||
|
||||
$params = @file_get_contents('php://stdin');
|
||||
$params = json_decode($params, true);
|
||||
if (!is_array($params)) {
|
||||
echo "provide method parameters on stdin as a JSON blob";
|
||||
exit(1);
|
||||
}
|
||||
|
||||
// build a quick ConduitAPIRequest from stdin PLUS the authenticated user
|
||||
$conduit_request = new ConduitAPIRequest($params);
|
||||
$conduit_request->setUser($user);
|
||||
|
||||
try {
|
||||
$result = $method_class->executeMethod($conduit_request);
|
||||
$error_code = null;
|
||||
$error_info = null;
|
||||
} catch (ConduitException $ex) {
|
||||
$result = null;
|
||||
$error_code = $ex->getMessage();
|
||||
if ($ex->getErrorDescription()) {
|
||||
$error_info = $ex->getErrorDescription();
|
||||
} else {
|
||||
$error_info = $method_handler->getErrorDescription($error_code);
|
||||
}
|
||||
}
|
||||
$time_end = microtime(true);
|
||||
|
||||
$response = id(new ConduitAPIResponse())
|
||||
->setResult($result)
|
||||
->setErrorCode($error_code)
|
||||
->setErrorInfo($error_info);
|
||||
echo $response->toJSON(), "\n";
|
||||
|
||||
// TODO -- how get $connection_id from SSH?
|
||||
$connection_id = null;
|
||||
$log->setConnectionID($connection_id);
|
||||
$log->setError((string)$error_code);
|
||||
$log->setDuration(1000000 * ($time_end - $time_start));
|
||||
$log->save();
|
||||
|
||||
exit();
|
|
@ -90,6 +90,7 @@ phutil_register_library_map(array(
|
|||
'CelerityStaticResourceResponse' => 'infrastructure/celerity/response',
|
||||
'ConduitAPIMethod' => 'applications/conduit/method/base',
|
||||
'ConduitAPIRequest' => 'applications/conduit/protocol/request',
|
||||
'ConduitAPIResponse' => 'applications/conduit/protocol/response',
|
||||
'ConduitAPI_arcanist_Method' => 'applications/conduit/method/arcanist/base',
|
||||
'ConduitAPI_arcanist_projectinfo_Method' => 'applications/conduit/method/arcanist/projectinfo',
|
||||
'ConduitAPI_conduit_connect_Method' => 'applications/conduit/method/conduit/connect',
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
<?php
|
||||
|
||||
/*
|
||||
* Copyright 2011 Facebook, Inc.
|
||||
* Copyright 2012 Facebook, Inc.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
|
@ -181,23 +181,22 @@ class PhabricatorConduitAPIController
|
|||
unset($unguarded);
|
||||
}
|
||||
|
||||
$result = array(
|
||||
'result' => $result,
|
||||
'error_code' => $error_code,
|
||||
'error_info' => $error_info,
|
||||
);
|
||||
$response = id(new ConduitAPIResponse())
|
||||
->setResult($result)
|
||||
->setErrorCode($error_code)
|
||||
->setErrorInfo($error_info);
|
||||
|
||||
switch ($request->getStr('output')) {
|
||||
case 'human':
|
||||
return $this->buildHumanReadableResponse(
|
||||
$method,
|
||||
$api_request,
|
||||
$result);
|
||||
$response->toDictionary());
|
||||
case 'json':
|
||||
default:
|
||||
return id(new AphrontFileResponse())
|
||||
->setMimeType('application/json')
|
||||
->setContent('for(;;);'.json_encode($result));
|
||||
->setContent('for(;;);'.$response->toJSON());
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -11,6 +11,7 @@ phutil_require_module('phabricator', 'aphront/writeguard');
|
|||
phutil_require_module('phabricator', 'applications/conduit/controller/base');
|
||||
phutil_require_module('phabricator', 'applications/conduit/method/base');
|
||||
phutil_require_module('phabricator', 'applications/conduit/protocol/request');
|
||||
phutil_require_module('phabricator', 'applications/conduit/protocol/response');
|
||||
phutil_require_module('phabricator', 'applications/conduit/storage/methodcalllog');
|
||||
phutil_require_module('phabricator', 'applications/people/storage/user');
|
||||
phutil_require_module('phabricator', 'storage/queryfx');
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
<?php
|
||||
|
||||
/*
|
||||
* Copyright 2011 Facebook, Inc.
|
||||
* Copyright 2012 Facebook, Inc.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
|
@ -36,7 +36,7 @@ class ConduitAPIRequest {
|
|||
return $this->params;
|
||||
}
|
||||
|
||||
public function setUser($user) {
|
||||
public function setUser(PhabricatorUser $user) {
|
||||
$this->user = $user;
|
||||
return $this;
|
||||
}
|
||||
|
|
|
@ -0,0 +1,63 @@
|
|||
<?php
|
||||
|
||||
/*
|
||||
* Copyright 2012 Facebook, Inc.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @group conduit
|
||||
*/
|
||||
class ConduitAPIResponse {
|
||||
|
||||
private $result;
|
||||
private $errorCode;
|
||||
private $errorInfo;
|
||||
|
||||
public function setResult($result) {
|
||||
$this->result = $result;
|
||||
return $this;
|
||||
}
|
||||
public function getResult() {
|
||||
return $this->result;
|
||||
}
|
||||
|
||||
public function setErrorCode($error_code) {
|
||||
$this->errorCode = $error_code;
|
||||
return $this;
|
||||
}
|
||||
public function getErrorCode() {
|
||||
return $this->errorCode;
|
||||
}
|
||||
|
||||
public function setErrorInfo($error_info) {
|
||||
$this->errorInfo = $error_info;
|
||||
return $this;
|
||||
}
|
||||
public function getErrorInfo() {
|
||||
return $this->errorInfo;
|
||||
}
|
||||
|
||||
public function toDictionary() {
|
||||
return array(
|
||||
'result' => $this->getResult(),
|
||||
'error_code' => $this->getErrorCode(),
|
||||
'error_info' => $this->getErrorInfo(),
|
||||
);
|
||||
}
|
||||
|
||||
public function toJSON() {
|
||||
return json_encode($this->toDictionary());
|
||||
}
|
||||
}
|
10
src/applications/conduit/protocol/response/__init__.php
Normal file
10
src/applications/conduit/protocol/response/__init__.php
Normal file
|
@ -0,0 +1,10 @@
|
|||
<?php
|
||||
/**
|
||||
* This file is automatically generated. Lint this module to rebuild it.
|
||||
* @generated
|
||||
*/
|
||||
|
||||
|
||||
|
||||
|
||||
phutil_require_source('ConduitAPIResponse.php');
|
Loading…
Reference in a new issue