You are here

kaltura.install.inc in Kaltura 6.2

Contains functions for installation of Kaltura module.

File

includes/kaltura.install.inc
View source
<?php

/**
 * @file
 * Contains functions for installation of Kaltura module.
 */
define('KALTURA_DEFAULT_URL', 'http://www.kaltura.com/');
define('KALTURA_SAAS_DEFAULT_URL', 'http://www.kaltura.com/');
define('KALTURA_SAAS_TERMS_URL', 'http://corp.kaltura.com/terms_of_use');
define('KALTURA_INSTALL_BACKBUTTON', 'Back');
define('KALTURA_INSTALL_FWDBUTTON', 'Continue');
define('KALTURA_INSTALL_SKIPREGBUTTON', 'Skip Registration');
define('KALTURA_INSTALL_STEPS', 4);

// this should be removed when _old_registration() is deleted
define('KALTURACE_ACCEPTS_REGISTRATION', FALSE);

/**
 * Build registration form.
 *
 * @see http://apis.kaltura.org/kalturaJsClient/kaltura-register.html
 * @see http://www.kaltura.org/guidelines-kaltura-cms-extensions-development
 * @see http://drupal.org/node/1026426
 */
function kaltura_installation_form(&$form_state = NULL) {
  global $base_url;
  drupal_add_css(drupal_get_path('module', 'kaltura') . '/style/kaltura.css');
  $step = isset($form_state['values']) ? (int) $form_state['storage']['step'] : 0;
  $form_state['storage']['step'] = $step + 1;
  $form['indicator'] = array(
    '#value' => t('Step @step of @steps', array(
      '@step' => $form_state['storage']['step'],
      '@steps' => KALTURA_INSTALL_STEPS,
    )),
    '#prefix' => '<p>',
    '#suffix' => '</p>',
  );
  $next = array(
    '#type' => 'submit',
    '#value' => KALTURA_INSTALL_FWDBUTTON,
  );
  $prev = array(
    '#type' => 'submit',
    '#value' => KALTURA_INSTALL_BACKBUTTON,
  );
  switch ($form_state['storage']['step']) {
    case 1:
      $desc_items = array(
        t('If you wish to use Kaltura\'s hosted service at Kaltura.com, leave the default of <code>http://www.kaltura.com/</code>'),
        t('If you have a Kaltura On-Prem or CE installation ready, enter the base URL of that Kaltura server.'),
      );
      $form['kaltura_server_url'] = array(
        '#type' => 'textfield',
        '#title' => t('Kaltura Server URL'),
        '#default_value' => isset($form_state['storage']['kaltura_server_url']) ? $form_state['storage']['kaltura_server_url'] : KALTURA_SAAS_DEFAULT_URL,
        '#description' => t('Enter the base URL of your Kaltura server.') . theme('item_list', $desc_items),
      );

      //$form['prev'] = $prev;
      $form['next'] = $next;
      break;
    case 2:
      $targs = array(
        '!kaltura_url' => $form_state['storage']['kaltura_server_url'],
      );
      $form['intro'] = array(
        '#value' => t('Do you have an existing account at !kaltura_url?', $targs),
      );
      $form['login_register'] = array(
        '#type' => 'radios',
        '#options' => array(
          'register' => t('Register a new !kaltura_url account', $targs),
          'login' => t('Log into existing !kaltura_url account', $targs),
        ),
        '#default_value' => isset($form_state['storage']['login_register']) ? $form_state['storage']['login_register'] : 'register',
      );
      $form['prev'] = $prev;
      $form['next'] = $next;
      break;
    case 3:
      switch ($form_state['storage']['login_register']) {
        case 'register':
          $form['admin_name'] = array(
            '#type' => 'textfield',
            '#default_value' => isset($form_state['storage']['']) ? $form_state['storage'][''] : '',
            '#title' => 'Your Name',
            '#description' => '',
          );
          $form['organisation'] = array(
            '#type' => 'textfield',
            '#default_value' => isset($form_state['storage']['']) ? $form_state['storage'][''] : '',
            '#title' => 'Your Organisation',
            '#description' => '',
          );
          $form['admin_email'] = array(
            '#type' => 'textfield',
            '#default_value' => isset($form_state['storage']['']) ? $form_state['storage'][''] : '',
            '#title' => 'Email',
            '#description' => '',
          );
          $form['cms_password'] = array(
            '#type' => 'password',
            '#title' => t('Kaltura Password'),
            '#description' => t('This will be the password for your new Kaltura account.'),
          );
          $form['phone'] = array(
            '#type' => 'textfield',
            '#default_value' => isset($form_state['storage']['']) ? $form_state['storage'][''] : '',
            '#title' => 'Phone',
            '#description' => '',
          );
          $form['partner_site_name'] = array(
            '#type' => 'textfield',
            '#title' => t('Website Name'),
            '#default_value' => isset($form_state['storage']['partner_site_name']) ? $form_state['storage']['partner_site_name'] : variable_get('site_name', ''),
            '#size' => 60,
            '#maxlength' => 256,
          );
          $form['website'] = array(
            '#type' => 'textfield',
            '#default_value' => isset($form_state['storage']['']) ? $form_state['storage'][''] : $base_url,
            '#title' => 'Website URL',
            '#description' => '',
          );
          $form['notification_url'] = array(
            '#type' => 'value',
            '#value' => url('kaltura/notification_handler', array(
              'absolute' => TRUE,
            )),
          );
          $kcategories = new KalturaContentCategories();

          // we use the name, not the key, because one of the keys is 0
          foreach ($kcategories->categories as $category) {
            $categories[$category] = $category;
          }
          $form['site_content'] = array(
            '#type' => 'checkboxes',
            '#default_value' => isset($form_state['storage']['content_categories']) ? $form_state['storage']['content_categories'] : array(),
            '#title' => 'Content Categories',
            '#description' => 'Check all that apply.',
            '#options' => $categories,
            '#attributes' => array(
              'class' => 'kaltura-install-website-content',
            ),
          );
          $form['description'] = array(
            '#type' => 'textarea',
            '#default_value' => isset($form_state['storage']['']) ? $form_state['storage'][''] : '',
            '#title' => 'How do you plan to use Kaltura Platform?',
            '#description' => '',
            '#required' => TRUE,
          );
          $form['adult_content'] = array(
            '#type' => 'checkboxes',
            '#default_value' => isset($form_state['storage']['adult_content']) ? $form_state['storage']['adult_content'] : array(),
            '#title' => 'Adult Content',
            '#options' => array(
              'yes' => t('This site will include adult content.'),
            ),
          );
          $terms_options = array(
            'agree' => t('I agree to the !terms_of_use', array(
              '!terms_of_use' => l('Kaltura Terms of Use', KALTURA_SAAS_TERMS_URL),
            )),
          );
          if ($form_state['storage']['kaltura_server_url'] == KALTURA_SAAS_DEFAULT_URL) {
            $form['terms_of_use'] = array(
              '#type' => 'checkboxes',
              '#default_value' => isset($form_state['storage']['terms_of_use']) ? $form_state['storage']['terms_of_use'] : array(),
              '#title' => 'Terms of Use',
              '#description' => '',
              '#options' => $terms_options,
            );
          }
          break;
        case 'login':
          $form['kaltura_partner_id'] = array(
            '#type' => 'textfield',
            '#title' => t('Kaltura Partner ID'),
            '#description' => t('Visible under Account » Server Settings » Partner Info in Kaltura console.'),
            '#default_value' => $form_state['storage']['kaltura_partner_id'],
          );
          $form['kaltura_login_email'] = array(
            '#type' => 'textfield',
            '#title' => t('Kaltura Partner Login'),
            '#description' => t('The email address you use to log into Kaltura, visible under Account » Account Overview » Login Info in Kaltura console.'),
            '#default_value' => $form_state['storage']['kaltura_login_email'],
          );
          $form['kaltura_login_password'] = array(
            '#type' => 'password',
            '#title' => t('Kaltura Password'),
            '#default_value' => $form_state['storage']['kaltura_login_password'],
          );
          $form['notification_url'] = array(
            '#type' => 'value',
            '#value' => url('kaltura/notification_handler', array(
              'absolute' => TRUE,
            )),
          );
          break;
      }
      $form['prev'] = $prev;
      $form['next'] = $next;
      break;
    case 4:
      $form['prev'] = $prev;
      $form['next'] = $next;
  }
  return $form;
}
function kaltura_installation_form_validate($form, &$form_state) {
  if ($form_state['clicked_button']['#value'] == KALTURA_INSTALL_BACKBUTTON) {
    $form_state['storage']['step'] -= 2;
    return;
  }

  // drupal_set_message(t('Validation called for step @step.', array('@step' => $form_state['storage']['step'])));
  switch ($form_state['storage']['step']) {
    case 1:

      // check that the supplied URL is valid
      if (!valid_url($form_state['values']['kaltura_server_url'])) {
        $targs = array(
          '%kaltura_server_url' => $form_state['values']['kaltura_server_url'],
        );
        watchdog('kaltura', 'Install error: %kaltura_server_url is not a valid URL.', $targs, WATCHDOG_ERROR);
        form_set_error('kaltura_server_url', '%kaltura_server_url does not appear to be a valid URL.', $targs);
        return;
      }

      // check that the supplied URL is a live Kaltura server
      $config = KalturaHelpers::getServiceConfiguration();
      $config->serviceUrl = $form_state['values']['kaltura_server_url'];
      $config->curlTimeout = 30;
      $client = new KalturaClient($config);
      try {
        if ($ping = $client->system
          ->ping()) {
          $targs = array(
            '%kaltura_server_url' => $form_state['values']['kaltura_server_url'],
          );
          $tmessage = 'Confirmed connection to %kaltura_server_url';
          drupal_set_message(t($tmessage, $targs));
          watchdog('kaltura', $tmessage, $targs, WATCHDOG_NOTICE);
          return;
        }
      } catch (Exception $ex) {
        $targs = array(
          '!file' => $ex
            ->getFile(),
          '!line' => $ex
            ->getLine(),
          '%message' => $ex
            ->getMessage(),
          '!code' => $ex
            ->getCode(),
          '%kaltura_server_url' => $form_state['values']['kaltura_server_url'],
        );
        $tmessage = 'Kaltura ping to %kaltura_server_url failed with Kaltura exception: %message (in !file @ line !line).';
        form_set_error('kaltura_server_url', t($tmessage, $targs));
        watchdog('kaltura', $tmessage, $targs, WATCHDOG_ERROR);
      }
      break;
    case 2:

      // radio boxes ... if they get this wrong, they get a prize.
      break;
    case 3:
      switch ($form_state['storage']['login_register']) {
        case 'register':
          if ($form_state['storage']['kaltura_server_url'] == KALTURA_SAAS_SERVER_URL) {
            if (!isset($form_state['values']['terms_of_use'])) {
              form_set_error('terms_of_use', 'You must agree to the Kaltura Terms of Use to register with Kaltura SaaS.');
            }
          }
          break;
        case 'login':
          $vc = TRUE;

          // whether to attempt client validation as well

          /* Kaltura client will prepend slash, so let's trim it here */
          $form['storage']['kaltura_url'] = trim($form_state['storage']['kaltura_server_url'], ' /');
          if (!valid_url($form_state['storage']['kaltura_server_url'], TRUE)) {
            form_set_error('kaltura_server_url', t('Kaltura URL must be a valid URL.'));
            $vc = FALSE;
          }
          if (empty($form_state['values']['kaltura_partner_id'])) {
            form_set_error('kaltura_partner_id', t('Kaltura Partner ID must be provided.'));
            $vc = FALSE;
          }
          if (!valid_email_address($form_state['values']['kaltura_login_email'])) {
            form_set_error('kaltura_login_password', t('You must provide a valid Kaltura login email.'));
            $vc = FALSE;
          }
          if (empty($form_state['values']['kaltura_login_password'])) {
            form_set_error('kaltura_login_password', t('You must enter a Kaltura login password.'));
            $vc = FALSE;
          }
          if ($vc) {

            // client failure here (eg bad pass) throws a kaltura exception
            try {

              // test access credentials
              $config = Kalturahelpers::getServiceConfiguration();

              // we're still in validate, so the changed values aren't
              // committed to $form_state['storage'] yet
              $config->partnerId = $form_state['values']['kaltura_partner_id'];
              $config->serviceUrl = $form_state['storage']['kaltura_server_url'];
              $client = new KalturaClient($config);
              $result = $client->partner
                ->getSecrets($form_state['values']['kaltura_partner_id'], $form_state['values']['kaltura_login_email'], $form_state['values']['kaltura_login_password']);
              $form_state['storage']['result'] = $result;
              drupal_set_message(t('Kaltura credentials verified against !kaltura_url', array(
                '!kaltura_url' => $form_state['storage']['kaltura_server_url'],
              )));
              $form['storage']['secret'] = $result->secret;
              $form['storage']['adminSecret'] = $result->adminSecret;
            } catch (Exception $ex) {
              form_set_error('', t('Kaltura credentials failed login: %message', array(
                '%message' => $ex
                  ->getMessage(),
                '%file' => $ex
                  ->getFile(),
                '%line' => $ex
                  ->getLine(),
                '%code' => $ex
                  ->getCode(),
              )));

              //if (module_exists('devel')) {

              //  dpm($ex->getTrace(), 'Exception stack trace');

              //}
            }
          }
      }
      break;
  }
}
function kaltura_installation_form_submit($form, &$form_state) {
  global $base_url;
  $form_state['storage'] = array_merge($form_state['storage'], $form_state['values']);
  switch ($form_state['storage']['step']) {
    case 3:
      switch ($form_state['storage']['login_register']) {
        case 'login':

          // import an existing partner (was kaltura_import_ce())
          $config = Kalturahelpers::getServiceConfiguration();
          $config->partnerId = $form_state['storage']['kaltura_partner_id'];
          $config->serviceUrl = $form_state['storage']['kaltura_server_url'];
          $client = new KalturaClient($config);
          try {
            $result = $client->partner
              ->getSecrets($form_state['storage']['kaltura_partner_id'], $form_state['storage']['kaltura_login_email'], $form_state['storage']['kaltura_login_password']);
            variable_set('kaltura_partner_id', $result->id);
            variable_set('kaltura_subp_id', $result->id . "00");
            variable_set('kaltura_secret', $result->secret);
            variable_set('kaltura_admin_secret', $result->adminSecret);
            variable_set('kaltura_local_registration', 1);
            variable_set('kaltura_server_url', $form_state['storage']['kaltura_server_url']);
            variable_set('kaltura_partner_cms_email', $form_state['storage']['kaltura_login_email']);
            variable_set('kaltura_partner_cms_password', $form_state['storage']['kaltura_login_password']);
            variable_set('kaltura_partner_url2', $form_state['storage']['partner_url2']);
            variable_set('kaltura_notification_type', 0);
            kaltura_update_kaltura_partner(2, $partner->notificationUrl);

            // kaltura_create_widgets_for_partner($partner->id, $secret);
            drupal_set_message('Congratulations!  You have successfully installed the Kaltura Module and connected to your Kaltura server.');
            drupal_goto('admin/settings/kaltura/general');
          } catch (Exception $ex) {
            drupal_set_message(t('Kaltura client exception: @message', array(
              '@message' => $ex
                ->getMessage(),
            )), 'error');
          }
        case 'register':
          $partner = new KalturaPartner();
          $partner->name = $form_state['storage']['partner_site_name'];
          $partner->website = $form_state['storage']['website'];

          // would be nice to respect clean URLs here too.
          // $partner->notificationUrl = url($form_state['storage']['partner_url2'], array('query' => array('q' => 'kaltura/notification_handler'))) ;
          $partner->notificationUrl = url('kaltura/notification_handler', array(
            'absolute' => TRUE,
          ));
          $partner->adminName = $form_state['storage']['admin_name'];
          $partner->adminEmail = $form_state['storage']['admin_email'];
          $partner->description = $form_state['storage']['description'];
          $partner->commercialUse = 'non-commercial_use';

          // odd that this is hard-coded, must ask ZB
          $partner->type = 102;

          // likewise, what is this?
          $partner->appearInSearch = 1;
          $content_categories = new KalturaContentCategories();
          foreach ($form_state['storage']['site_content'] as $k => $category) {
            if ($category) {
              $categories[] = $k;
            }
          }
          $partner->contentCategories = !empty($categories) ? implode(',', $categories) : 'N/A';

          // in old form this was: $partner->adultContent = ($_REQUEST['kaltura_adult_content'] == 1)? true: false;
          // but when testing, I always found that (regardless of submitted value), the Kaltura server then
          // listed the registered account as FALSE for this value.
          $partner->adultContent = $form_state['storage']['adult_content']['yes'] ? TRUE : FALSE;
          $config = KalturaHelpers::getServiceConfiguration();
          $config->serviceUrl = $form_state['storage']['kaltura_server_url'];

          // also [#1018042]
          $config->curlTimeout = 60;
          $client = new KalturaClient($config);
          watchdog('kaltura', 'Registering Kaltura partner: <pre>!partner</pre>', array(
            '!partner' => print_r($partner, 1),
          ));
          try {
            $res = $client->partner
              ->register($partner, $form_state['storage']['cms_password']);
            if ($res->id) {
              variable_set('kaltura_partner_id', $res->id);
              variable_set('kaltura_subp_id', $res->id . '00');
              variable_set('kaltura_secret', $res->secret);
              variable_set('kaltura_admin_secret', $res->adminSecret);
              variable_set('kaltura_local_registration', 1);
              variable_set('kaltura_server_url', $form_state['storage']['kaltura_server_url']);
              variable_set('kaltura_partner_cms_email', $res->adminEmail);
              variable_set('kaltura_partner_cms_password', $res->cmsPassword);
              variable_set('kaltura_partner_url2', $form_state['storage']['partner_url2']);
              variable_set('kaltura_notification_type', 0);
              variable_set('kaltura_content_categories', $res->categories);
              kaltura_update_kaltura_partner(2, $partner->notificationUrl);
              drupal_set_message('Congratulations! You have successfully installed the Kaltura Video Module and registered for the Kaltura Partner Program.');
              drupal_goto('admin/settings/kaltura/general');
            }
            else {
              form_set_error('', t('Error registering for the Kaltura Partner Program: @message', array(
                '@message' => $res['error'][0]['desc'],
              )));
              drupal_set_message(t('Error registering for the Kaltura Partner Program: @message', array(
                '@message' => $res['error'][0]['desc'],
              )), 'error');
            }
          } catch (Exception $ex) {
            if (stristr($ex
              ->getMessage(), 'timed out after')) {
              form_set_error('', t('Registration attempt with Kaltura server timed out. You may wish to try again, or !register_manually.', array(
                '!register_manually' => l('register manually', 'http://corp.kaltura.com/about/signup'),
              )));
            }
            else {
              form_set_error('', t('Registration error: @message', array(
                '@message' => $ex
                  ->getMessage(),
              )), 'error');

              //if (module_exists('devel')) {

              //  dpm($ex->getTrace(), 'Exception stack trace');

              //}
            }
            watchdog('kaltura', 'Registration error: @message', array(
              '@message' => $ex
                ->getMessage(),
            ));
            watchdog('kaltura', 'Backtrace for failed registration: <pre>!trace</pre>', array(
              '!trace' => print_r($ex
                ->getTrace(), 1),
            ));

            // If we re-display the form here, we will lose $form['storage'].
            // Redirect back to step 0 to avoid confusion.
            drupal_goto('admin/settings/kaltura/install');
          }
          break;
      }
      break;
  }
}

/* ================================================================================ */

/**
 * Retrieve partner's details from Kaltura server.
 *
 * @param string Partner ID
 * @param string Kaltura partner login email
 * @param string Kaltura partner login password
 * @return array Kaltura Partner details (ordered)
 *
 * @TODO The returned array is an ordered array - a keyed array might
 *       be easier to work with?
 */
function kaltura_get_partner_details($partner_id, $cms_email, $cms_password) {

  /* @TODO $session_user is not actually used below. Does calling this
   * function have any effect? */
  $session_user = KalturaHelpers::getSessionUser();
  $config = KalturaHelpers::getServiceConfiguration();
  $config->partnerId = $partner_id;
  $kaltura_client = new KalturaClient($config);
  try {
    $result = $kaltura_client->partner
      ->getsecrets($partner_id, $cms_email, $cms_password);
  } catch (Exception $ex) {
    drupal_set_message(t('Kaltura client exception: @message', array(
      '@message' => $ex
        ->getMessage(),
    )), 'error');
    $result['error'] = $ex
      ->getMessage();
  }
  if ($result->id) {
    return array(
      $result->id,
      $result->id . '00',
      $result->notificationUrl,
      $result->secret,
      $result->adminSecret,
    );
  }
  else {
    return array(
      FALSE,
      $result['error'],
    );
  }
}