<?php
/**
  * Ahead WebSoft Technologies Pvt Ltd.
  * @copyright  Copyright 2006-2026 Ahead WebSoft Technologies Pvt Ltd.
  * @license    https://www.socialengine.com/policies
*/
class Install_Bootstrap extends Zend_Application_Bootstrap_Bootstrap
{
    protected function _initMisc()
    {
        if (function_exists('date_default_timezone_set')) {
            date_default_timezone_set('UTC');
        }
        if (function_exists('mb_internal_encoding')) {
            mb_internal_encoding("UTF-8");
        }
    }

    protected function _initAutoloader()
    {
        $autoloader = new Zend_Application_Module_Autoloader(array(
            'namespace' => 'Install',
            'basePath' => APPLICATION_PATH . '/install',
        ));

        Zend_Registry::set('Autoloader', $autoloader);

        return $autoloader;
    }

    protected function _initLog()
    {
        $log = new Zend_Log();

        // Non-production
        if (APPLICATION_ENV !== 'production') {
            $log->addWriter(new Zend_Log_Writer_Firebug());
        }

        $logAdapter = 'file';
        $logAdapterFile = APPLICATION_PATH . '/application/settings/log.php';
        if (file_exists($logAdapterFile)) {
            $info = require($logAdapterFile);
            if (is_array($info)) {
                try {
                    if (!class_exists($info['class'], false)) {
                        $path = APPLICATION_PATH . '/application/libraries/' . str_replace('_', '/', $info['class']) . '.php';
                        if (!file_exists($path)) {
                            throw new Exception('Log class does not exist: ' . $info['class']);
                        }
                        require_once($path);
                    }

                    $object = new ReflectionClass($info['class']);
                    $log->addWriter($object->newInstance($info['config']));
                    $logAdapter = 'custom';
                } catch (Exception $e) {
                    $logAdapter = 'file';
                }
            }
        }

        if ($logAdapter != 'custom') {
            // Production
            try {
                $log->addWriter(new Zend_Log_Writer_Stream(APPLICATION_PATH . '/temporary/log/install.log'));
            } catch (Exception $e) {
                // Check directory
                if (!@is_dir(APPLICATION_PATH . '/temporary/log') &&
                    @mkdir(APPLICATION_PATH . '/temporary/log', 0777, true)
                ) {
                    $log->addWriter(new Zend_Log_Writer_Stream(APPLICATION_PATH . '/temporary/log/install.log'));
                } else {
                    // Silence ...
                    if (APPLICATION_ENV !== 'production') {
                        $log->log($e->__toString(), Zend_Log::CRIT);
                    } else {
                        // Make sure logging doesn't cause exceptions
                        $log->addWriter(new Zend_Log_Writer_Null());
                    }
                }
            }
        }

        Zend_Registry::set('Zend_Log', $log);
        Engine_Api::registerErrorHandlers();

        if ('production' != APPLICATION_ENV) {
            Engine_Exception::setLog($log);
        }

        return $log;
    }

    protected function _initCache()
    {
        if (is_writable(APPLICATION_PATH . '/temporary/cache') || (
                !@is_dir(APPLICATION_PATH . '/temporary/cache') &&
                @mkdir(APPLICATION_PATH . '/temporary/cache', 0777, true)
            )) {
            try {
                $cache = Zend_Cache::factory('Core', 'File', array(
                    'automatic_serialization' => true,
                ), array(
                    'cache_dir' => APPLICATION_PATH . '/temporary/cache',
                    'file_name_prefix' => 'EngineInstall',
                ));

                Zend_Registry::set('Cache', $cache);

                return $cache;
            } catch (Exception $e) {
            }
        }
    }

    protected function _initMemoryManager()
    {
        try {
            $memoryManager = Zend_Memory::factory('File', array(
                'cache_dir' => APPLICATION_PATH . '/temporary/cache',
                'file_name_prefix' => 'EngineInstallMemory',
            ));
            $memoryManager->setMemoryLimit(24 * 1024 * 1024);

            Zend_Registry::set('MemoryManager', $memoryManager);

            return $memoryManager;
        } catch (Exception $e) {
        }
    }

    protected function _initFrontController()
    {
        $front = Zend_Controller_Front::getInstance();

        $front->addControllerDirectory(APPLICATION_PATH . '/install/controllers');

        // Hack
        if (empty($_SERVER['SCRIPT_FILENAME'])) {
            $_SERVER['SCRIPT_FILENAME'] = dirname(dirname(__FILE__)) . $_SERVER['PHP_SELF'];
        }

        return $front;
    }

    protected function _initRouter()
    {
        $front = $this->getContainer()->frontcontroller;
        $router = $front->getRouter();
        //$router = new Zend_Controller_Router_Rewrite();
        $router->addRoute('install', new Zend_Controller_Router_Route('install/:action', array(
            'controller' => 'install',
            'action' => 'sanity',
        ), array(
            'action' => 'sanity|ftp-info|ftp-perms|db-info|db-sanity|db-create|account|complete',
        )));
        $router->addRoute('manage', new Zend_Controller_Router_Route('manage/:action', array(
            'controller' => 'manage',
            'action' => 'index',
        ), array(
            'action' => 'index|ftp|upload|browse',
        )));
        $router->addRoute('sdk', new Zend_Controller_Router_Route('sdk/:action', array(
            'controller' => 'sdk',
            'action' => 'index',
        ), array(
            'action' => 'index|create|build|manage|delete',
        )));
        $router->addRoute('login', new Zend_Controller_Router_Route_Static('login', array(
            'controller' => 'auth',
            'action' => 'login',
        )));
        $router->addRoute('logout', new Zend_Controller_Router_Route_Static('logout', array(
            'controller' => 'auth',
            'action' => 'logout',
        )));
        return $router;
    }

    protected function _initSession()
    {
        $name = 'en4_install';
        Zend_Session::setOptions(array(
            'name' => $name,
            'cookie_path' => substr($_SERVER['SCRIPT_NAME'], 0, strrpos($_SERVER['SCRIPT_NAME'], '/')+1),
            'cookie_lifetime' => 0, //86400,
            'gc_maxlifetime' => 86400,
            'remember_me_seconds' => 86400,
            'cookie_httponly' => false,
        ));
        session_name($name);

        // Check for bad session config
        if (function_exists('ini_get') &&
            in_array(strtolower(ini_get('session.save_handler')), array('user', 'users', 'files'))) {
            $flag = true;
            if ('files'  !== ini_get('session.save_handler') && function_exists('ini_set')) {
                $flag = false !== ini_set('session.save_handler', 'files');
            }

            if (function_exists('ini_set') && $flag &&
                false !== ini_set('session.save_path', APPLICATION_PATH . '/temporary/session/')) {
                if (!is_writable(APPLICATION_PATH . '/temporary/session/')) {
                    throw new Exception('Please set full permissions on temporary/session (chmod 0777).');
                }
            } else {
                /*
                throw new Exception('Your session configuration is incorrect and ' .
                    'could not be automatically corrected. Please set ' .
                    'session.save_handler=files and session.save_path=/tmp (or your ' .
                    'temporary directory on non-Linux OSes.');
                */
            }
        }

        // Session hack for fancy upload
        if (isset($_POST[session_name()])) {
            Zend_Session::setId($_POST[session_name()]);
        } elseif (isset($_COOKIE[session_name()])) {
            Zend_Session::setId($_COOKIE[session_name()]);
        }

        // Start
        try {
            Zend_Session::start();
        } catch (Exception $e) { // This will generally happen when weird data is saved during the install process
            if (Zend_Session::isStarted()) {
                Zend_Session::destroy();
            }
            throw $e;
        }

        // Session binding
        $fixed = true;
        $namespace = new Zend_Session_Namespace('ZendSession');
        if (empty($namespace->ip) /* || empty($namespace->ua)*/) {
            $namespace->ip = $_SERVER['REMOTE_ADDR'];
            $namespace->ua = @$_SERVER['HTTP_USER_AGENT'];
        } elseif ($namespace->ip != $_SERVER['REMOTE_ADDR'] /* || $namespace->ua != $_SERVER['HTTP_USER_AGENT']*/) {
            // $fixed = false;
        }

        // Occaisonally regenerate the id if requesting with the original user agent
        /*
        if( empty($namespace->count) ) {
          $namespace->count = 1;
        } else if( $namespace->count < 10 ) {
          $namespace->count++;
        } else if( $namespace->ua == $_SERVER['HTTP_USER_AGENT'] ) {
          Zend_Session::regenerateId();
        }
        */

        if (!$fixed) {
            Zend_Session::destroy();
            header('Location: ' . $_SERVER['REQUEST_URI']);
            exit();
        }
    }

    protected function _initLayout()
    {
        // Create layout
        $layout = Zend_Layout::startMvc();

        // Set options
        $layout->setViewBasePath(APPLICATION_PATH . "/install/layouts", 'Install_Layout_View')
            ->setViewSuffix('tpl')
            ->setLayout('default');

        return $layout;
    }

    protected function _initView()
    {
        $view = new Zend_View();
        $view->setEncoding('utf-8');

        $viewRenderer = Zend_Controller_Action_HelperBroker::getStaticHelper('ViewRenderer');
        $viewRenderer->setView($view);
        $viewRenderer->setViewSuffix('tpl');

        $view->addHelperPath(APPLICATION_PATH . '/application/libraries/Engine/View/Helper', 'Engine_View_Helper');
        $view->addHelperPath(APPLICATION_PATH . '/install/views/helpers', 'Install_View_Helper');

        Zend_Registry::set('Zend_View', $view);

        return $view;
    }

    protected function _initTranslate()
    {
        // If in development, log untranslated messages
        $params = array(
            'scan' => Zend_Translate_Adapter::LOCALE_FILENAME,
            'logUntranslated' => true
        );

        $log = new Zend_Log();
        if (APPLICATION_ENV == 'development') {
            $log = new Zend_Log();
            $log->addWriter(new Zend_Log_Writer_Firebug());
        } else {
            $log->addWriter(new Zend_Log_Writer_Null());
        }
        $params['log'] = $log;

        $translate = new Zend_Translate(
            'Csv',
            APPLICATION_PATH.'/install/languages',
            null,
            $params
        );

        Zend_Registry::set('Zend_Translate', $translate);
        Zend_Validate_Abstract::setDefaultTranslator($translate);
        Engine_Sanity::setDefaultTranslator($translate);

        Zend_Registry::set('Locale', new Zend_Locale());

        return $translate;
    }

    protected function _initDb()
    {
        if (file_exists(APPLICATION_PATH . '/application/settings/database.php')) {
            $config = include APPLICATION_PATH . '/application/settings/database.php';
            if (!empty($config['adapter'])) {
                try {
                    $db = Zend_Db::factory($config['adapter'], $config['params']);
                    $db->getServerVersion(); // Forces the connection open
                } catch (Exception $e) {
                    $this->getContainer()->log->log($e, Zend_Log::WARN);
                    return;
                }
                Zend_Registry::set('Zend_Db', $db);

                // set DB to UTC timezone for this session
                switch ($config['adapter']) {
                    case 'mysqli':
                    case 'mysql':
                    case 'pdo_mysql': {
                        $db->query("SET time_zone = '+0:00'");
                        break;
                    }

                    case 'postgresql': {
                        $db->query("SET time_zone = '+0:00'");
                        break;
                    }

                    default: {
                        // do nothing
                    }
                }

                // attempt to disable strict mode
                try {
                    $db->query("SET SQL_MODE = ''");
                } catch (Exception $e) {
                }

                Engine_Db_Table::setDefaultAdapter($db);
                Engine_Db_Table::setTablePrefix($config['tablePrefix']);
                return $db;
            }
        }
    }

    protected function _initAuth()
    {
        // Check if installed
        Zend_Registry::set('Engine/Installed', $this->_checkInstalled());

        // Check auth
        $auth = Zend_Auth::getInstance();

        if (defined('_ENGINE_NO_AUTH') && _ENGINE_NO_AUTH) {
            $auth->getStorage()->write(1);
        }

        Zend_Registry::set('Zend_Auth', $auth);

        return $auth;
    }

    protected function _initPackageManager()
    {
        if ($this->getContainer()->auth->hasIdentity()) {
            $packageManager = new Engine_Package_Manager(array(
                'basePath' => APPLICATION_PATH,
            ));
            Zend_Registry::set('Engine_Package_Manager', $packageManager);
            return $packageManager;
        }
    }

    protected function _initNavigationMain()
    {
        $navigation = new Zend_Navigation(array(
            array(
                'label' => 'Manage Packages',
                'route' => 'manage',
            ),
            array(
                'label' => 'Developer SDK',
                //'route' => 'sdk',
                'route' => 'default',
                'controller' => 'sdk',
            ),
//             array(
//                 'label' => 'Import Tools',
//                 //'route' => 'import',
//                 'route' => 'default',
//                 'controller' => 'import',
//             ),
            array(
                'label' => 'Other Tools',
                //'route' => 'tools',
                'route' => 'default',
                'controller' => 'tools',
            ),
            array(
                'label' => 'Logout',
                'route' => 'logout',
            ),
        ));

        Zend_Registry::set('Install_Navigation_Main', $navigation);
        $layout = $this->getContainer()->layout;
        //$layout = new Zend_Layout();
        $layout->mainNavigation = $navigation;

        return $navigation;
    }

    /**
     * Checks to see if SocialEngine is installed
     *
     * @return bool
     */
    private function _checkInstalled()
    {
        if (file_exists(APPLICATION_PATH . '/application/settings/database.php') === false) {
            return false;
        }
        $db = Zend_Registry::get('Zend_Db');
        try {
            $db->getServerVersion();
        } catch (Exception $e) {
            // can't connect to db, assume we're installed, so auth doesn't get disabled when connection breaks
            return true;
        }

        try {
            $userTable = new Engine_Db_Table(array(
                'db' => $db,
                'name' => 'users',
            ));
            // check for table existence
            $userTable->info();
            return true;
        } catch (Exception $e) {
            return false;
        }
    }
}
