summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lib/class/access.class.php27
-rw-r--r--lib/class/api.class.php68
-rw-r--r--lib/class/update.class.php29
-rw-r--r--lib/class/xmldata.class.php44
-rw-r--r--server/stream.ajax.php2
-rw-r--r--server/xml.server.php103
6 files changed, 179 insertions, 94 deletions
diff --git a/lib/class/access.class.php b/lib/class/access.class.php
index e814ade6..379ee626 100644
--- a/lib/class/access.class.php
+++ b/lib/class/access.class.php
@@ -314,6 +314,33 @@ class Access {
} // get_type_name
+ /**
+ * session_exists
+ * This checks to see if the specified session of the specified type
+ * exists, it also provides an array of key'd data that may be required
+ * based on the type
+ */
+ public static function session_exists($data,$key,$type) {
+
+ // Switch on the type they pass
+ switch ($type) {
+ case 'api':
+
+ break;
+ case 'stream':
+
+ break;
+ case 'interface':
+
+ break;
+ default:
+ return false;
+ break;
+ } // type
+
+
+ } // session_exists
+
} //end of access class
?>
diff --git a/lib/class/api.class.php b/lib/class/api.class.php
new file mode 100644
index 00000000..fd34ff93
--- /dev/null
+++ b/lib/class/api.class.php
@@ -0,0 +1,68 @@
+<?php
+/*
+
+ Copyright (c) 2001 - 2007 Ampache.org
+ All rights reserved.
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License v2
+ as published by the Free Software Foundation.
+
+ 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 General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+*/
+
+/**
+ * API Class
+ * This handles functions relating to the API written for ampache, initially this is very focused
+ * on providing functionality for Amarok so it can integrate with Ampache
+ */
+class AmpacheApi {
+
+ /**
+ * constructor
+ * This really isn't anything to do here, so it's private
+ */
+ private function __construct() {
+
+ // Rien a faire
+
+ } // constructor
+
+
+ /**
+ * handshake
+ * This is the function that handles the verifying a new handshake
+ * this takes a timestamp, auth key, and client IP. Optionally it
+ * can take a username, if non is passed the ACL must be non-use
+ * specific
+ */
+ public static function handshake($timesamp,$passphrase,$ip,$username='') {
+
+ // First we'll filter by username and IP
+ $username = $username ? Dba::escape($username) : '-1';
+ $ip = ip2int($ip);
+
+ // Run the query and return the passphrases as we'll have to mangle them
+ // to figure out if they match what we've got
+ $sql = "SELECT * FROM `access_list` WHERE `user`='$username' AND `start` >= '$ip' AND `end` <= '$ip'";
+ $db_results = Dba::query($sql);
+
+ while ($row = Dba::fetch_assoc($db_results)) {
+
+ // Combine and MD5 this mofo
+ $md5pass = md5($timestamp . $row);
+
+ } // end while
+
+ } // handhsake
+
+} // API class
+?>
diff --git a/lib/class/update.class.php b/lib/class/update.class.php
index e7b3a03c..2db1a0e2 100644
--- a/lib/class/update.class.php
+++ b/lib/class/update.class.php
@@ -238,6 +238,12 @@ class Update {
'- Change wording on Localplay preferences.<br />';
$version[] = array('version' => '340010','description'=>$update_string);
+ $update_string = '- Adjusted Tables to new democratic play methods.<br />' .
+ '- Added api session table, will eventually recombine.<br />';
+
+ //$version[] = array('version' => '340011','description'=>$update_string);
+
+
return $version;
} // populate_version
@@ -979,5 +985,28 @@ class Update {
} // update_340010
+ /**
+ * update_340011
+ * This updates the democratic play stuff so that can handle a little more complext mojo
+ * It also adds yet another table to the db to handle the sessions for API access. Eventually
+ * should combine all of the session tables, but I'll do that later
+ */
+ public static function update_340011() {
+
+ // First add the new table for the new session stuff
+ $sql = "CREATE TABLE `session_api` ( " .
+ "`id` VARCHAR( 64 ) NOT NULL , " .
+ "`user` INT( 11 ) UNSIGNED NOT NULL , " .
+ "`agent` VARCHAR( 255 ) CHARACTER SET utf8 COLLATE utf8_unicode_ci NULL , " .
+ "`level` INT( 11 ) UNSIGNED NOT NULL DEFAULT '0', " .
+ "`expire` INT( 11 ) UNSIGNED NOT NULL , " .
+ "`ip` INT( 11 ) UNSIGNED NULL , " .
+ "PRIMARY KEY ( `id` ) " .
+ ") ENGINE = MYISAM";
+ $db_results = Dba::query($sql);
+
+
+ } // 340011
+
} // end update class
?>
diff --git a/lib/class/xmldata.class.php b/lib/class/xmldata.class.php
new file mode 100644
index 00000000..16eaeaeb
--- /dev/null
+++ b/lib/class/xmldata.class.php
@@ -0,0 +1,44 @@
+<?php
+/*
+
+ Copyright 2001 - 2007 Ampache.org
+ All Rights Reserved
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License
+ as published by the Free Software Foundation; version 2
+ of the License.
+
+ 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 General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+*/
+
+/**
+ * xmlData
+ * This class takes care of all of the xml document stuff in Ampache these
+ * are all static calls
+ */
+class xmlData {
+
+ public static $version = '340001';
+
+ /**
+ * constructor
+ * We don't use this, as its really a static class
+ */
+ private function __construct() {
+
+ // Rien a faire
+
+ } // constructor
+
+} // xmlData
+
+?>
diff --git a/server/stream.ajax.php b/server/stream.ajax.php
index 7996b676..c3f58ac4 100644
--- a/server/stream.ajax.php
+++ b/server/stream.ajax.php
@@ -37,7 +37,7 @@ switch ($_REQUEST['action']) {
break;
case 'basket':
// We need to set the basket up!
- $_SESSION['iframe']['target'] = Config::get('web_path') . '/stream.php?action=basket';
+ $_SESSION['iframe']['target'] = Config::get('web_path') . '/stream.php?action=basket&playlist_method=' . scrub_out($_REQUEST['playlist_method']);
$results['rfc3514'] = '<script type="text/javascript">reload_util()</script>';
break;
default:
diff --git a/server/xml.server.php b/server/xml.server.php
index b42b8ea4..484c874c 100644
--- a/server/xml.server.php
+++ b/server/xml.server.php
@@ -1,7 +1,7 @@
<?php
/*
- Copyright (c) 2001 - 2006 Ampache.org
+ Copyright (c) 2001 - 2007 Ampache.org
All rights reserved.
This program is free software; you can redistribute it and/or
@@ -25,110 +25,27 @@
*/
define('NO_SESSION','1');
-require_once('../lib/init.php');
+require_once '../lib/init.php';
/**
* Verify the existance of the Session they passed in we do allow them to
* login via this interface so we do have an exception for action=login
*/
-if (!session_exists($_REQUEST['sessid']) AND $_REQUEST['action'] !== 'login') { exit(); }
-
-$GLOBALS['user'] = new User($_REQUEST['user_id']);
-$action = scrub_in($_REQUEST['action']);
+if (!Access::session_exists(array(),$_REQUEST['auth'],'api') AND $_REQUEST['action'] != 'handshake') {
+ debug_event('Access Denied','Invalid Session or unthorized access attempt to API','5');
+ exit();
+}
/* Set the correct headers */
header("Content-type: text/xml; charset=utf-8");
-switch ($action) {
- /* Returns an array of artist information */
- case 'get_artists':
- $sql = "SELECT id FROM artist ORDER BY name";
- $db_results = mysql_query($sql,dbh());
-
- while ($r = mysql_fetch_assoc($db_results)) {
- $artist = new Artist($r['id']);
- $artist->format_artist();
- $results[] = array('id'=>$artist->id,'name'=>$artist->full_name);
- } // end while results
-
- $xml_doc = xml_from_array($results);
- echo $xml_doc;
- break;
- case 'get_albums':
- $sql = "SELECT id FROM album ORDER BY name";
- $db_results = mysql_query($sql,dbh());
-
- while ($r = mysql_fetch_assoc($db_results)) {
- $album = new Album($r['id']);
- $results[] = array('id'=>$r['id'],'year'=>$album->year,'name'=>$album->name);
- } // end while results
-
- $xml_doc = xml_from_array($results);
- echo $xml_doc;
- break;
- case 'get_genres':
- $sql = "SELECT id FROM genre ORDER BY name";
- $db_results = mysql_query($sql,dbh());
-
- while ($r = mysql_fetch_assoc($db_results)) {
- $genre = new Genre($r['id']);
- $results[] = array('id'=>$r['id'],'name'=>$genre->name);
- }
-
- $xml_doc = xml_from_array($results);
- echo $xml_doc;
- break;
- /* Return results of a quick search */
- case 'search':
- /* We need search string */
- $_REQUEST['s_all'] = $_REQUEST['search_string'];
- if (strlen($_REQUEST['s_all']) < 1) { break; }
- $data = run_search($_REQUEST);
- /* Unfortuantly these are song objects, which are not good for
- * xml.. turn it into an array
- */
- foreach ($data as $song) {
- $genre = $song->get_genre_name();
- $artist = $song->get_artist_name();
- $album = $song->get_album_name();
- $results[] = array('id'=>$song->id,
- 'title'=>$song->title,
- 'genre'=>$genre,
- 'artist'=>$artist,
- 'album'=>$album);
- } // end foreach song
+switch ($_REQUEST['action']) {
+ case 'handshake':
- $xml_doc = xml_from_array($results);
- echo $xml_doc;
+ // Send the data we were sent to the API class so it can be chewed on
- break;
- /* This takes a object_id/object_type and returns the correct PLAY url for it */
- case 'play_url':
- /* We need the type and id */
- $object_type = scrub_in($_REQUEST['object_type']);
- $object_id = scrub_in($_REQUEST['object_id']);
-
- switch ($object_type) {
- case 'song':
- $song = new Song($object_id);
- $url = $song->get_url($_REQUEST['sessid']);
- $results[] = $url;
- break;
- default:
- // Rien a faire
- break;
- } // end switch on object_type
-
- $xml_doc = xml_from_array($results);
- echo $xml_doc;
-
- break;
- /* This allows you to login via the xml mojo */
- case 'login':
-
-
- break;
+ break;
default:
// Rien a faire
break;