Example #1
0
 /**
  * App constructor.
  */
 public static function init()
 {
     // we'll reset this after we read our config file
     date_default_timezone_set('UTC');
     self::$config = array('system' => array());
     self::$page = array();
     self::$pager = array();
     self::$query_string = '';
     startup();
     set_include_path('include' . PATH_SEPARATOR . 'library' . PATH_SEPARATOR . 'library/langdet' . PATH_SEPARATOR . '.');
     self::$scheme = 'http';
     if (x($_SERVER, 'HTTPS') && $_SERVER['HTTPS']) {
         self::$scheme = 'https';
     } elseif (x($_SERVER, 'SERVER_PORT') && intval($_SERVER['SERVER_PORT']) == 443) {
         self::$scheme = 'https';
     }
     if (x($_SERVER, 'SERVER_NAME')) {
         self::$hostname = $_SERVER['SERVER_NAME'];
         if (x($_SERVER, 'SERVER_PORT') && $_SERVER['SERVER_PORT'] != 80 && $_SERVER['SERVER_PORT'] != 443) {
             self::$hostname .= ':' . $_SERVER['SERVER_PORT'];
         }
         /**
          * Figure out if we are running at the top of a domain
          * or in a sub-directory and adjust accordingly
          */
         $path = trim(dirname($_SERVER['SCRIPT_NAME']), '/\\');
         if (isset($path) && strlen($path) && $path != self::$path) {
             self::$path = $path;
         }
     }
     set_include_path("include/self::{$hostname}" . PATH_SEPARATOR . get_include_path());
     if (x($_SERVER, 'QUERY_STRING') && substr($_SERVER['QUERY_STRING'], 0, 2) === "q=") {
         self::$query_string = substr($_SERVER['QUERY_STRING'], 2);
         // removing trailing / - maybe a nginx problem
         if (substr(self::$query_string, 0, 1) == "/") {
             self::$query_string = substr(self::$query_string, 1);
         }
     }
     if (x($_GET, 'q')) {
         self::$cmd = trim($_GET['q'], '/\\');
     }
     // unix style "homedir"
     if (substr(self::$cmd, 0, 1) === '~') {
         self::$cmd = 'channel/' . substr(self::$cmd, 1);
     }
     /*
      * Break the URL path into C style argc/argv style arguments for our
      * modules. Given "http://example.com/module/arg1/arg2", self::$argc
      * will be 3 (integer) and self::$argv will contain:
      *   [0] => 'module'
      *   [1] => 'arg1'
      *   [2] => 'arg2'
      *
      * There will always be one argument. If provided a naked domain
      * URL, self::$argv[0] is set to "home".
      */
     self::$argv = explode('/', self::$cmd);
     self::$argc = count(self::$argv);
     if (array_key_exists('0', self::$argv) && strlen(self::$argv[0])) {
         self::$module = str_replace(".", "_", self::$argv[0]);
         self::$module = str_replace("-", "_", self::$module);
         if (strpos(self::$module, '_') === 0) {
             self::$module = substr(self::$module, 1);
         }
     } else {
         self::$argc = 1;
         self::$argv = array('home');
         self::$module = 'home';
     }
     /*
      * See if there is any page number information, and initialise
      * pagination
      */
     self::$pager['page'] = x($_GET, 'page') && intval($_GET['page']) > 0 ? intval($_GET['page']) : 1;
     self::$pager['itemspage'] = 60;
     self::$pager['start'] = self::$pager['page'] * self::$pager['itemspage'] - self::$pager['itemspage'];
     if (self::$pager['start'] < 0) {
         self::$pager['start'] = 0;
     }
     self::$pager['total'] = 0;
     /*
      * Detect mobile devices
      */
     $mobile_detect = new Mobile_Detect();
     self::$is_mobile = $mobile_detect->isMobile();
     self::$is_tablet = $mobile_detect->isTablet();
     self::head_set_icon('/images/hz-32.png');
     /*
      * register template engines
      */
     spl_autoload_register('ZotlabsAutoloader::loader');
     self::$meta = new Zotlabs\Web\HttpMeta();
     // create an instance of the smarty template engine so we can register it.
     $smarty = new Zotlabs\Render\SmartyTemplate();
     $dc = get_declared_classes();
     foreach ($dc as $k) {
         if (in_array('Zotlabs\\Render\\TemplateEngine', class_implements($k))) {
             self::register_template_engine($k);
         }
     }
 }
Example #2
0
function api_call()
{
    $p = App::$cmd;
    $type = null;
    if (strrpos($p, '.')) {
        $type = substr($p, strrpos($p, '.') + 1);
        if (strpos($type, '/') === false) {
            $p = substr($p, 0, strrpos($p, '.'));
            // recalculate App argc,argv since we just extracted the type from it
            App::$argv = explode('/', $p);
            App::$argc = count(App::$argv);
        }
    }
    if (!$type || !in_array($type, ['json', 'xml', 'rss', 'as', 'atom'])) {
        $type = 'json';
    }
    $info = \Zotlabs\Lib\Api_router::find($p);
    logger('info: ' . $p . ' type: ' . $type . ' ' . print_r($info, true));
    if ($info) {
        if ($info['auth'] === true && api_user() === false) {
            api_login($a);
        }
        load_contact_links(api_user());
        $channel = App::get_channel();
        logger('API call for ' . $channel['channel_name'] . ': ' . App::$query_string);
        logger('API parameters: ' . print_r($_REQUEST, true));
        $r = call_user_func($info['func'], $type);
        if ($r === false) {
            return;
        }
        switch ($type) {
            case "xml":
                $r = mb_convert_encoding($r, "UTF-8", mb_detect_encoding($r));
                header("Content-Type: text/xml");
                return '<?xml version="1.0" encoding="UTF-8"?>' . "\n" . $r;
                break;
            case "json":
                header("Content-Type: application/json");
                if ($r) {
                    foreach ($r as $rv) {
                        $json = json_encode($rv);
                    }
                }
                // Lookup JSONP to understand these lines. They provide cross-domain AJAX ability.
                if ($_GET['callback']) {
                    $json = $_GET['callback'] . '(' . $json . ')';
                }
                return $json;
                break;
            case "rss":
                header("Content-Type: application/rss+xml");
                return '<?xml version="1.0" encoding="UTF-8"?>' . "\n" . $r;
                break;
            case "atom":
                header("Content-Type: application/atom+xml");
                return '<?xml version="1.0" encoding="UTF-8"?>' . "\n" . $r;
                break;
            case "as":
                if ($r) {
                    foreach ($r as $rv) {
                        $json = json_encode($rv);
                    }
                }
                return $json;
                break;
        }
    }
    header("HTTP/1.1 404 Not Found");
    logger('API call not implemented: ' . App::$query_string . ' - ' . print_r($_REQUEST, true));
    $r = '<status><error>not implemented</error></status>';
    switch ($type) {
        case "xml":
            header("Content-Type: text/xml");
            return '<?xml version="1.0" encoding="UTF-8"?>' . "\n" . $r;
            break;
        case "json":
            header("Content-Type: application/json");
            return json_encode(array('error' => 'not implemented'));
            break;
        case "rss":
            header("Content-Type: application/rss+xml");
            return '<?xml version="1.0" encoding="UTF-8"?>' . "\n" . $r;
            break;
        case "atom":
            header("Content-Type: application/atom+xml");
            return '<?xml version="1.0" encoding="UTF-8"?>' . "\n" . $r;
            break;
    }
}