* @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
* @link http://status.net/
*/
-
class ApiAuthAction extends ApiAction
{
var $auth_user_nickname = null;
* @return boolean success flag
*
*/
-
function prepare($args)
{
parent::prepare($args);
*
* @return mixed the OAuthRequest or false
*/
-
function getOAuthRequest()
{
ApiOauthAction::cleanRequest();
*
* @return nothing
*/
-
function checkOAuthRequest($request)
{
$datastore = new ApiStatusNetOAuthDataStore();
$server->add_signature_method($hmac_method);
try {
-
$server->verify_request($request);
$consumer = $request->get_parameter('oauth_consumer_key');
$app = Oauth_application::getByConsumerKey($consumer);
if (empty($app)) {
- common_log(LOG_WARNING,
- 'Couldn\'t find the OAuth app for consumer key: ' .
- $consumer);
- throw new OAuthException('No application for that consumer key.');
+ common_log(
+ LOG_WARNING,
+ 'API OAuth - Couldn\'t find the OAuth app for consumer key: ' .
+ $consumer
+ );
+ // TRANS: OAuth exception thrown when no application is found for a given consumer key.
+ throw new OAuthException(_('No application for that consumer key.'));
}
// set the source attr
+ if ($app->name != 'anonymous') {
+ $this->source = $app->name;
+ }
- $this->source = $app->name;
$appUser = Oauth_application_user::staticGet('token', $access_token);
if (!empty($appUser)) {
-
// If access_type == 0 we have either a request token
// or a bad / revoked access token
if ($appUser->access_type != 0) {
-
// Set the access level for the api call
-
$this->access = ($appUser->access_type & Oauth_application::$writeAccess)
? self::READ_WRITE : self::READ_ONLY;
// Set the auth user
-
if (Event::handle('StartSetApiUser', array(&$user))) {
- $this->auth_user = User::staticGet('id', $appUser->profile_id);
+ $user = User::staticGet('id', $appUser->profile_id);
+ if (!empty($user)) {
+ if (!$user->hasRight(Right::API)) {
+ // TRANS: Authorization exception thrown when a user without API access tries to access the API.
+ throw new AuthorizationException(_('Not allowed to use API.'));
+ }
+ }
+ $this->auth_user = $user;
Event::handle('EndSetApiUser', array($user));
}
$msg = "API OAuth authentication for user '%s' (id: %d) on behalf of " .
- "application '%s' (id: %d) with %s access.";
-
- common_log(LOG_INFO, sprintf($msg,
- $this->auth_user->nickname,
- $this->auth_user->id,
- $app->name,
- $app->id,
- ($this->access = self::READ_WRITE) ?
- 'read-write' : 'read-only'
- ));
+ "application '%s' (id: %d) with %s access.";
+
+ common_log(
+ LOG_INFO,
+ sprintf(
+ $msg,
+ $this->auth_user->nickname,
+ $this->auth_user->id,
+ $app->name,
+ $app->id,
+ ($this->access = self::READ_WRITE) ? 'read-write' : 'read-only'
+ )
+ );
} else {
- throw new OAuthException('Bad access token.');
+ // TRANS: OAuth exception given when an incorrect access token was given for a user.
+ throw new OAuthException(_('Bad access token.'));
}
} else {
-
- // Also should not happen
-
- throw new OAuthException('No user for that token.');
+ // Also should not happen.
+ // TRANS: OAuth exception given when no user was found for a given token (no token was found).
+ throw new OAuthException(_('No user for that token.'));
}
} catch (OAuthException $e) {
+ $this->logAuthFailure($e->getMessage());
common_log(LOG_WARNING, 'API OAuthException - ' . $e->getMessage());
$this->clientError($e->getMessage(), 401, $this->format);
exit;
*
* @return boolean true
*/
-
function requiresAuth()
{
return true;
*
* @return boolean true or false
*/
-
function checkBasicAuthUser($required = true)
{
$this->basicAuthProcessHeader();
header('WWW-Authenticate: Basic realm="' . $realm . '"');
// show error if the user clicks 'cancel'
-
- $this->clientError("Could not authenticate you.", 401, $this->format);
+ // TRANS: Client error thrown when authentication fails becaus a user clicked "Cancel".
+ $this->clientError(_('Could not authenticate you.'), 401, $this->format);
exit;
} else {
if (Event::handle('StartSetApiUser', array(&$user))) {
if (!empty($user)) {
+ if (!$user->hasRight(Right::API)) {
+ // TRANS: Authorization exception thrown when a user without API access tries to access the API.
+ throw new AuthorizationException(_('Not allowed to use API.'));
+ }
$this->auth_user = $user;
}
}
// By default, basic auth users have rw access
-
$this->access = self::READ_WRITE;
if (empty($this->auth_user) && ($required || isset($_SERVER['PHP_AUTH_USER']))) {
-
- // basic authentication failed
-
- list($proxy, $ip) = common_client_ip();
-
- $msg = sprintf( 'Failed API auth attempt, nickname = %1$s, ' .
- 'proxy = %2$s, ip = %3$s',
- $this->auth_user_nickname,
- $proxy,
- $ip);
- common_log(LOG_WARNING, $msg);
- $this->clientError("Could not authenticate you.", 401, $this->format);
+ $msg = sprintf(
+ "basic auth nickname = %s",
+ $this->auth_user_nickname
+ );
+ $this->logAuthFailure($msg);
+ // TRANS: Client error thrown when authentication fails.
+ $this->clientError(_('Could not authenticate you.'), 401, $this->format);
exit;
}
}
*
* @return void
*/
-
function basicAuthProcessHeader()
{
$authHeaders = array('AUTHORIZATION',
// Decode the HTTP_AUTHORIZATION header on php-cgi server self
// on fcgid server the header name is AUTHORIZATION
-
$auth_hash = base64_decode(substr($authorization_header, 6));
list($this->auth_user_nickname,
$this->auth_user_password) = explode(':', $auth_hash);
}
}
}
+
+ /**
+ * Log an API authentication failure. Collect the proxy and IP
+ * and log them
+ *
+ * @param string $logMsg additional log message
+ */
+ function logAuthFailure($logMsg)
+ {
+ list($proxy, $ip) = common_client_ip();
+
+ $msg = sprintf(
+ 'API auth failure (proxy = %1$s, ip = %2$s) - ',
+ $proxy,
+ $ip
+ );
+
+ common_log(LOG_WARNING, $msg . $logMsg);
+ }
}