summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorZach Copley <zach@status.net>2009-09-25 16:58:35 -0700
committerZach Copley <zach@status.net>2009-09-25 16:58:35 -0700
commitde5ff19713a990af197330dd8e4314de465ffe76 (patch)
tree1578bbdfbbfe6afcc385537840b85ad8ca4165bf /lib
parented9ba9d945e4f50812022a7489fc8135f4e49846 (diff)
Moved basic auth stuff into its own classes
Diffstat (limited to 'lib')
-rw-r--r--lib/apiauth.php131
-rw-r--r--lib/apibareauth.php68
-rw-r--r--lib/router.php4
-rw-r--r--lib/twitterapi.php81
4 files changed, 201 insertions, 83 deletions
diff --git a/lib/apiauth.php b/lib/apiauth.php
new file mode 100644
index 000000000..501d3de10
--- /dev/null
+++ b/lib/apiauth.php
@@ -0,0 +1,131 @@
+<?php
+/**
+ * StatusNet, the distributed open-source microblogging tool
+ *
+ * Base class for API actions that require authentication
+ *
+ * PHP version 5
+ *
+ * LICENCE: This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ * @category API
+ * @package StatusNet
+ * @author Zach Copley <zach@status.net>
+ * @copyright 2009 StatusNet, Inc.
+ * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
+ * @link http://status.net/
+ */
+
+if (!defined('STATUSNET')) {
+ exit(1);
+}
+
+require_once INSTALLDIR.'/lib/twitterapi.php';
+
+class ApiAuthAction extends TwitterapiAction
+{
+ /**
+ * Does this API resource require authentication?
+ *
+ * @return boolean true
+ */
+
+ function requiresAuth()
+ {
+ return true;
+ }
+
+ function checkBasicAuthUser()
+ {
+ $this->basicAuthProcessHeader();
+
+ if (!isset($this->auth_user)) {
+ header('WWW-Authenticate: Basic realm="StatusNet API"');
+
+ // show error if the user clicks 'cancel'
+
+ $this->showBasicAuthError();
+ return false;
+
+ } else {
+ $nickname = $this->auth_user;
+ $password = $this->auth_pw;
+ $this->auth_user = common_check_user($nickname, $password);
+
+ if (empty($this->auth_user)) {
+
+ // basic authentication failed
+
+ list($proxy, $ip) = common_client_ip();
+ common_log(LOG_WARNING,
+ "Failed API auth attempt, nickname = $nickname, proxy = $proxy, ip = $ip.");
+ $this->showBasicAuthError();
+ return false;
+ }
+ }
+ return true;
+ }
+
+ function basicAuthProcessHeader()
+ {
+ if (isset($_SERVER['AUTHORIZATION']) || isset($_SERVER['HTTP_AUTHORIZATION'])) {
+ $authorization_header = isset($_SERVER['HTTP_AUTHORIZATION'])? $_SERVER['HTTP_AUTHORIZATION'] : $_SERVER['AUTHORIZATION'];
+ }
+
+ if (isset($_SERVER['PHP_AUTH_USER'])) {
+ $this->auth_user = $_SERVER['PHP_AUTH_USER'];
+ $this->auth_pw = $_SERVER['PHP_AUTH_PW'];
+ } elseif (isset($authorization_header) && strstr(substr($authorization_header, 0, 5), 'Basic')) {
+ // 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, $this->auth_pw) = explode(':', $auth_hash);
+
+ // set all to null on a empty basic auth request
+ if ($this->auth_user == "") {
+ $this->auth_user = null;
+ $this->auth_pw = null;
+ }
+ } else {
+ $this->auth_user = null;
+ $this->auth_pw = null;
+ }
+ }
+
+ function showBasicAuthError()
+ {
+ header('HTTP/1.1 401 Unauthorized');
+ $msg = 'Could not authenticate you.';
+
+ if ($this->arg('format') == 'xml') {
+ header('Content-Type: application/xml; charset=utf-8');
+ $this->startXML();
+ $this->elementStart('hash');
+ $this->element('error', null, $msg);
+ $this->element('request', null, $_SERVER['REQUEST_URI']);
+ $this->elementEnd('hash');
+ $this->endXML();
+ } elseif ($this->arg('format') == 'json') {
+ header('Content-Type: application/json; charset=utf-8');
+ $error_array = array('error' => $msg, 'request' => $_SERVER['REQUEST_URI']);
+ print(json_encode($error_array));
+ } else {
+ header('Content-type: text/plain');
+ print "$msg\n";
+ }
+ }
+
+
+} \ No newline at end of file
diff --git a/lib/apibareauth.php b/lib/apibareauth.php
new file mode 100644
index 000000000..8921cddca
--- /dev/null
+++ b/lib/apibareauth.php
@@ -0,0 +1,68 @@
+<?php
+/**
+ * StatusNet, the distributed open-source microblogging tool
+ *
+ * Base class for API actions that require "bare auth". Bare auth means
+ * authentication is required only if the action is called without an argument
+ * or query param specifying user id.
+ *
+ * PHP version 5
+ *
+ * LICENCE: This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ * @category API
+ * @package StatusNet
+ * @author Zach Copley <zach@status.net>
+ * @copyright 2009 StatusNet, Inc.
+ * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
+ * @link http://status.net/
+ */
+
+if (!defined('STATUSNET')) {
+ exit(1);
+}
+
+require_once INSTALLDIR.'/lib/apiauth.php';
+
+class ApiBareAuthAction extends ApiAuthAction
+{
+ /**
+ * Does this API resource require authentication?
+ *
+ * @return boolean true or false
+ */
+
+ function requiresAuth()
+ {
+ // If the site is "private", all API methods except statusnet/config
+ // need authentication
+
+ if (common_config('site', 'private')) {
+ return true;
+ }
+
+ // check whether a user has been specified somehow
+
+ $id = $this->arg('id');
+ $user_id = $this->arg('user_id');
+ $screen_name = $this->arg('screen_name');
+
+ if (empty($id) && empty($user_id) && empty($screen_name)) {
+ return true;
+ }
+
+ return false;
+ }
+
+} \ No newline at end of file
diff --git a/lib/router.php b/lib/router.php
index 0e5fe3a54..370fbe62b 100644
--- a/lib/router.php
+++ b/lib/router.php
@@ -263,11 +263,11 @@ class Router
// statuses API
$m->connect('api/statuses/friends_timeline.:format',
- array('action' => 'apifriendstimeline',
+ array('action' => 'ApiFriendsTimeline',
'format' => '(xml|json|rss|atom)'));
$m->connect('api/statuses/friends_timeline/:id.:format',
- array('action' => 'apifriendstimeline',
+ array('action' => 'ApiFriendsTimeline',
'id' => '[a-zA-Z0-9]+',
'format' => '(xml|json|rss|atom)'));
diff --git a/lib/twitterapi.php b/lib/twitterapi.php
index 959b0981a..5cf666668 100644
--- a/lib/twitterapi.php
+++ b/lib/twitterapi.php
@@ -1205,85 +1205,4 @@ class TwitterapiAction extends Action
}
}
- function checkBasicAuthUser()
- {
- $this->basicAuthProcessHeader();
-
- if (!isset($this->auth_user)) {
- header('WWW-Authenticate: Basic realm="StatusNet API"');
-
- // show error if the user clicks 'cancel'
-
- $this->showBasicAuthError();
- return false;
-
- } else {
- $nickname = $this->auth_user;
- $password = $this->auth_pw;
- $this->auth_user = common_check_user($nickname, $password);
-
- if (empty($this->auth_user)) {
-
- // basic authentication failed
-
- list($proxy, $ip) = common_client_ip();
- common_log(LOG_WARNING,
- "Failed API auth attempt, nickname = $nickname, proxy = $proxy, ip = $ip.");
- $this->showBasicAuthError();
- return false;
- }
- }
- return true;
- }
-
- function basicAuthProcessHeader()
- {
- if (isset($_SERVER['AUTHORIZATION']) || isset($_SERVER['HTTP_AUTHORIZATION'])) {
- $authorization_header = isset($_SERVER['HTTP_AUTHORIZATION'])? $_SERVER['HTTP_AUTHORIZATION'] : $_SERVER['AUTHORIZATION'];
- }
-
- if (isset($_SERVER['PHP_AUTH_USER'])) {
- $this->auth_user = $_SERVER['PHP_AUTH_USER'];
- $this->auth_pw = $_SERVER['PHP_AUTH_PW'];
- } elseif (isset($authorization_header) && strstr(substr($authorization_header, 0, 5), 'Basic')) {
- // 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, $this->auth_pw) = explode(':', $auth_hash);
-
- // set all to null on a empty basic auth request
- if ($this->auth_user == "") {
- $this->auth_user = null;
- $this->auth_pw = null;
- }
- } else {
- $this->auth_user = null;
- $this->auth_pw = null;
- }
- }
-
- function showBasicAuthError()
- {
- header('HTTP/1.1 401 Unauthorized');
- $msg = 'Could not authenticate you.';
-
- if ($this->arg('format') == 'xml') {
- header('Content-Type: application/xml; charset=utf-8');
- $this->startXML();
- $this->elementStart('hash');
- $this->element('error', null, $msg);
- $this->element('request', null, $_SERVER['REQUEST_URI']);
- $this->elementEnd('hash');
- $this->endXML();
- } elseif ($this->arg('format') == 'json') {
- header('Content-Type: application/json; charset=utf-8');
- $error_array = array('error' => $msg, 'request' => $_SERVER['REQUEST_URI']);
- print(json_encode($error_array));
- } else {
- header('Content-type: text/plain');
- print "$msg\n";
- }
- }
-
}