diff --git a/airtime_mvc/application/Bootstrap.php b/airtime_mvc/application/Bootstrap.php index 2c8cd839c..b3ba22263 100644 --- a/airtime_mvc/application/Bootstrap.php +++ b/airtime_mvc/application/Bootstrap.php @@ -37,7 +37,7 @@ require_once (APPLICATION_PATH."/logging/Logging.php"); Logging::setLogPath('/var/log/airtime/zendphp.log'); // We need to manually route because we can't load Zend without the database being initialized first. -if (array_key_exists("REQUEST_URI", $_SERVER) && (strpos($_SERVER["REQUEST_URI"], "/provisioning/create") !== false)) { +if (array_key_exists("REQUEST_URI", $_SERVER) && (stripos($_SERVER["REQUEST_URI"], "/provisioning/create") !== false)) { $provisioningHelper = new ProvisioningHelper($CC_CONFIG["apiKey"][0]); $provisioningHelper->createAction(); die(); diff --git a/airtime_mvc/application/common/ProvisioningHelper.php b/airtime_mvc/application/common/ProvisioningHelper.php index 48bbddc8c..580c20e52 100644 --- a/airtime_mvc/application/common/ProvisioningHelper.php +++ b/airtime_mvc/application/common/ProvisioningHelper.php @@ -10,6 +10,7 @@ class ProvisioningHelper // Parameter values private $dbuser, $dbpass, $dbname, $dbhost, $dbowner, $apikey; private $instanceId; + private $station_name, $description; public function __construct($apikey) { @@ -34,34 +35,37 @@ class ProvisioningHelper try { $this->parsePostParams(); - + //For security, the Airtime Pro provisioning system creates the database for the user. - $this->setNewDatabaseConnection(); + if ($this->dbhost && !empty($this->dbhost)) { + $this->setNewDatabaseConnection(); - //if ($this->checkDatabaseExists()) { - // throw new Exception("ERROR: Airtime database already exists"); - //} + //if ($this->checkDatabaseExists()) { + // throw new Exception("ERROR: Airtime database already exists"); + //} - if (!$this->checkDatabaseExists()) { - throw new Exception("ERROR: $this->dbname database does not exist."); - } + if (!$this->checkDatabaseExists()) { + throw new Exception("ERROR: $this->dbname database does not exist."); + } - //We really want to do this check because all the Propel-generated SQL starts with "DROP TABLE IF EXISTS". - //If we don't check, then a second call to this API endpoint would wipe all the tables! - if ($this->checkTablesExist()) { - throw new Exception("ERROR: airtime tables already exists"); + //We really want to do this check because all the Propel-generated SQL starts with "DROP TABLE IF EXISTS". + //If we don't check, then a second call to this API endpoint would wipe all the tables! + if ($this->checkTablesExist()) { + throw new Exception("ERROR: airtime tables already exists"); + } + + $this->createDatabaseTables(); + $this->initializeMusicDirsTable($this->instanceId); } //$this->createDatabase(); //All we need to do is create the database tables. - $this->createDatabaseTables(); - $this->initializeMusicDirsTable($this->instanceId); + $this->initializePrefs(); } catch (Exception $e) { http_response_code(400); - Logging::error($e->getMessage() - ); + Logging::error($e->getMessage()); echo $e->getMessage() . PHP_EOL; return; } @@ -94,6 +98,7 @@ class ProvisioningHelper // Result is either boolean FALSE (no table found) or PDOStatement Object (table found) return $result !== FALSE; } + private function parsePostParams() { $this->dbuser = $_POST['dbuser']; @@ -102,6 +107,9 @@ class ProvisioningHelper $this->dbhost = $_POST['dbhost']; $this->dbowner = $_POST['dbowner']; $this->instanceId = $_POST['instanceid']; + + $this->station_name = $_POST['station_name']; + $this->description = $_POST['description']; } /** @@ -111,9 +119,9 @@ class ProvisioningHelper private function setNewDatabaseConnection() { self::$dbh = new PDO("pgsql:host=" . $this->dbhost - . ";dbname=" . $this->dbname - . ";port=5432" . ";user=" . $this->dbuser - . ";password=" . $this->dbpass); + . ";dbname=" . $this->dbname + . ";port=5432" . ";user=" . $this->dbuser + . ";password=" . $this->dbpass); //Turn on PDO exceptions because they're off by default. //self::$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $err = self::$dbh->errorInfo(); @@ -130,8 +138,8 @@ class ProvisioningHelper { Logging::info("Creating database..."); $statement = self::$dbh->prepare("CREATE DATABASE " . pg_escape_string($this->dbname) - . " WITH ENCODING 'UTF8' TEMPLATE template0" - . " OWNER " . pg_escape_string($this->dbowner)); + . " WITH ENCODING 'UTF8' TEMPLATE template0" + . " OWNER " . pg_escape_string($this->dbowner)); if (!$statement->execute()) { throw new Exception("ERROR: Failed to create Airtime database"); } @@ -182,5 +190,16 @@ class ProvisioningHelper $musicDir->save(); } + /** + * Initialize preference values passed from the dashboard (if any exist) + */ + private function initializePrefs() { + if ($this->station_name) { + Application_Model_Preference::SetStationName($this->station_name); + } + if ($this->description) { + Application_Model_Preference::SetStationDescription($this->description); + } + } } diff --git a/airtime_mvc/application/controllers/ProvisioningController.php b/airtime_mvc/application/controllers/ProvisioningController.php index fc0c28cbb..0ecd185d2 100644 --- a/airtime_mvc/application/controllers/ProvisioningController.php +++ b/airtime_mvc/application/controllers/ProvisioningController.php @@ -18,6 +18,40 @@ class ProvisioningController extends Zend_Controller_Action * */ + /** + * Endpoint to change Airtime preferences remotely. + * Mainly for use with the dashboard right now. + */ + public function changeAction() { + $this->view->layout()->disableLayout(); + $this->_helper->viewRenderer->setNoRender(true); + + if (!RestAuth::verifyAuth(true, true, $this)) { + return; + } + + try { + // This is hacky and should be genericized + if ($_POST['station_name']) { + Application_Model_Preference::SetStationName($_POST['station_name']); + } + if ($_POST['description']) { + Application_Model_Preference::SetStationDescription($_POST['description']); + } + } catch (Exception $e) { + $this->getResponse() + ->setHttpResponseCode(400) + ->appendBody("ERROR: " . $e->getMessage()); + Logging::error($e->getMessage()); + echo $e->getMessage() . PHP_EOL; + return; + } + + $this->getResponse() + ->setHttpResponseCode(200) + ->appendBody("OK"); + } + /** * Delete the Airtime Pro station's files from Amazon S3 */ diff --git a/airtime_mvc/application/models/Preference.php b/airtime_mvc/application/models/Preference.php index aef7f0bb5..a25679826 100644 --- a/airtime_mvc/application/models/Preference.php +++ b/airtime_mvc/application/models/Preference.php @@ -326,6 +326,11 @@ class Application_Model_Preference return self::getValue("station_name"); } + public static function SetStationName($station_name) + { + self::setValue("station_name", $station_name); + } + public static function SetAutoUploadRecordedShowToSoundcloud($upload) { self::setValue("soundcloud_auto_upload_recorded_show", $upload);