diff --git a/dev/quux.php b/dev/quux.php index 526af8b..aff0e44 100644 --- a/dev/quux.php +++ b/dev/quux.php @@ -1,159 +1,165 @@ set('quux', 'Lorem ipsum dolor'); + dprint_r($cache->get('quux')); + break; + case 'YubiCloud': require_once('Auth/Yubico.php'); echo '

YubiKey

'; if (!array_key_exists('YubiCloud', $Config)) { message_die(GENERAL_ERROR, "YubiCloud authentication not configured. Add \$Config['YubiCloud']['ClientID'] and \$Config['YubiCloud']['SecretKey'] to your config."); } if (!$key = $_GET['OTP']) message_die(GENERAL_ERROR, "Please add in URL ?OTP=, then put your cursor at right of the = and press your YubiKey button"); $yubi = new Auth_Yubico($Config['YubiCloud']['ClientID'], $Config['YubiCloud']['SecreyKey']); if (!$data = $yubi->parsePasswordOTP($key)) { message_die(GENERAL_ERROR, "This is not an YubiKey OTP."); } $prefix = $data['prefix']; $auth = $yubi->verify($key); if (@PEAR::isError($auth)) { if ($auth->getMessage() == 'REPLAYED_OTP') message_die("This OTP has already been used."); message_die(HACK_ERROR, "

Authentication failed: " . $auth->getMessage() . "

Debug: " . $yubi->getLastResponse() . "

"); } else { print "

You are authenticated!

"; } break; case 'GeoPointPolarZ': require_once('includes/geo/pointPolarZ.php'); echo "

GeoPointPolarZ

"; $point = GeoPointPolarZ::fromString("(48, 30°, 3)"); printf("Secteur T%dC%d, zone %d-%d"); dprint_r($point); break; case 'index_scenes': $time[] = microtime(); require_once('includes/geo/scene.php'); require_once('includes/geo/sceneindex.php'); $cache = Cache::load(); if ($index = $cache->get('GeoSceneIndex')) { $index = unserialize($index); } else { $index = GeoSceneIndex::Load(SCENE_DIR); $cache->set('GeoSceneIndex', serialize($index)); } $time[] = microtime(); echo '

GeoSceneIndex

'; dprint_r($index); echo '

Time (ms)

'; dprint_r(1000 * ($time[1] - $time[0])); dprint_r($time); break; case 'travel': require_once('includes/travel/travel.php'); $travel = Travel::load(); dieprint_r($travel); break; case 'spherical': require_once('includes/geo/galaxy.php'); echo '

Spherical coordinates test

'; echo ''; echo ""; $objects = GeoGalaxy::get_coordinates(); foreach ($objects as $row) { echo ""; $pt = $row[2]; echo ''; echo ''; $pt->translate(500, 300, 200, 2); echo ''; echo ''; } echo '
NameTypeCartesian coordsSpherical ISpherical IIPencil coordinates
$row[0]$row[1]$row[2](', implode(', ', $pt->to_spherical()), ')(', implode(', ', $pt->to_spherical2()), ')', $pt, '
'; break; case 'travel': require_once('includes/travel/travel.php'); require_once('includes/travel/place.php'); $cache = Cache::load(); $travel = $cache->get('zed_travel'); if ($travel == '') { $travel_nocached = new Travel(); $travel_nocached->load_xml("content/travel.xml"); $cache->set('zed_travel', serialize($travel_nocached)); } else { $travel = unserialize($travel); } dieprint_r($travel); break; case 'perso.create.notify': $testperso = Perso::get(4733); $message = new Message(); $message->from = 0; $message->to = invite::who_invited(4733); $url = get_server_url() . get_url('who', $testperso->nickname); $message->text = sprintf(lang_get('InvitePersoCreated'), $testperso->name, $url); $message->send(); dieprint_r($message); break; case 'pushdata'; echo '

/api.php/app/pushdata


'; break; case 'thumbnail': $content = new Content(1); dprint_r($content); $content->generate_thumbnail(); break; case 'port': echo '

Port::from_location test

'; $locations = array("B00002", "B00002123", "B00001001", "xyz: [800, 42, 220]"); foreach ($locations as $location) { dprint_r(Port::from_location($location)); } break; case 'ext': $file = 'dev/foo.tar'; echo "

$file

"; echo "

.tar.bz2

"; echo ereg('\.tar\.bz2$', $file); echo "

.tar

"; echo ereg('\.tar$', $file); break; case 'app': echo Application::from_api_key("37d839ba-f9fc-42ca-a3e8-28053e979b90")->generate_userkey(); break; case '': dieprint_r("No case currently selected."); break; } include('controllers/footer.php'); ?> diff --git a/includes/cache/memcached.php b/includes/cache/memcached.php index 6193a16..b42adbf 100755 --- a/includes/cache/memcached.php +++ b/includes/cache/memcached.php @@ -1,112 +1,123 @@ * @copyright 2010 Sébastien Santoro aka Dereckson * @license http://www.opensource.org/licenses/bsd-license.php BSD * @version 0.1 * @link http://scherzo.dereckson.be/doc/zed * @link http://zed.dereckson.be/ * @filesource */ /** * Memcached cache * * !!! This class uses the Memcached extension AND NOT the Memcache ext !!!! * * References: * @link http://www.php.net/manual/en/book/memcached.php * @link http://memcached.org * * This class implements a singleton pattern. */ class CacheMemcached { /** * The current cache instance * * @var CacheMemcached */ static $instance = null; /** * The Memcached object * * @var Memcached */ private $memcached = null; /** * Gets the cache instance, initializing it if needed - * + * * @return Cache the cache instance, or null if nothing is cached */ - static function load () { + static function load () { //Checks extension is okay if (!extension_loaded('memcached')) { if (extension_loaded('memcache')) { message_die(GENERAL_ERROR, "Can't initialize $engine cache engine.
PHP extension memcached not loaded.
!!! This class uses the Memcached extension AND NOT the Memcache extension (this one is loaded) !!!", 'Cache'); } else { message_die(GENERAL_ERROR, "Can't initialize $engine cache engine.
PHP extension memcached not loaded.", 'Cache'); } } - + //Creates the Memcached object if needed if (self::$instance === null) { global $Config; - + self::$instance = new CacheMemcached(); self::$instance->memcached = new Memcached(); + self::$instance->memcached->setOption(Memcached::OPT_BINARY_PROTOCOL, true); self::$instance->memcached->addServer( $Config['cache']['server'], $Config['cache']['port'] ); + if (array_key_exists('SASL', $Config['cache']) && $Config['cache']['SASL']) { + if (!method_exists(self::$instance->memcached, 'setSaslAuthData')) { + message_die(GENERAL_ERROR, "Can't initialize $engine cache engine.
PHP extension memcached were compiled without SASL support.
SASL authentication support is disabled by default. To enable it, recompile the PECL memcached extension using --enable-memcached-sasl switch. This requires that libsasl2 has been installed and that libmemcached has been built with SASL support enabled.", 'Cache'); + } + self::$instance->memcached->setSaslAuthData( + $Config['cache']['username'], + $Config['cache']['password'] + ); + } + $stats = self::$instance->memcached->getStats(); } - + return self::$instance; } - + /** * Gets the specified key's data * * @param string $key the key to fetch * @return mixed the data at the specified key */ function get ($key) { return $this->memcached->get($key); } /** * Sets the specified data at the specified key * * @param string $key the key where to store the specified data * @param mixed $value the data to store */ function set ($key, $value) { return $this->memcached->set($key, $value); } /** * Deletes the specified key's data * * @param string $key the key to delete */ function delete ($key) { return $this->memcached->delete($key); } } ?> \ No newline at end of file diff --git a/includes/config.php b/includes/config.php index 0b0fde8..afb9d3f 100755 --- a/includes/config.php +++ b/includes/config.php @@ -1,272 +1,282 @@ * @copyright 2010 Sébastien Santoro aka Dereckson * @license http://www.opensource.org/licenses/bsd-license.php BSD * @version 0.1 * @link http://scherzo.dereckson.be/doc/zed * @link http://zed.dereckson.be/ * @filesource */ //////////////////////////////////////////////////////////////////////////////// /// /// /// I. SQL configuration /// /// /// //////////////////////////////////////////////////////////////////////////////// //SQL configuration $Config['sql']['product'] = 'MySQL'; //Only MySQL is currently implemented $Config['sql']['host'] = 'localhost'; $Config['sql']['username'] = 'zed'; $Config['sql']['password'] = 'zed'; $Config['sql']['database'] = 'zed'; //SQL tables $prefix = ''; define('TABLE_API_KEYS', $prefix . 'api_keys'); define('TABLE_COMMENTS', $prefix . 'comments'); define('TABLE_CONTENT_FILES', $prefix . 'content_files'); define('TABLE_CONTENT_LOCATIONS', $prefix . 'content_locations'); define('TABLE_CONTENT_ZONES', $prefix . 'content_zones'); define('TABLE_CONTENT_ZONES_LOCATIONS', $prefix . 'content_zones_locations'); define('TABLE_LOG', $prefix . 'log'); define('TABLE_LOG_SMARTLINE', $prefix . 'log_smartline'); define('TABLE_MESSAGES', $prefix . 'messages'); define('TABLE_MOTD', $prefix . 'motd'); define('TABLE_PAGES', $prefix . 'pages'); define('TABLE_PAGES_EDITS', $prefix . 'pages_edits'); define('TABLE_PERSOS', $prefix . 'persos'); define('TABLE_PERSOS_FLAGS', $prefix . 'persos_flags'); define('TABLE_PERSOS_NOTES', $prefix . 'persos_notes'); define('TABLE_PORTS', $prefix . 'ports'); define('TABLE_PROFILES', $prefix . 'profiles'); define('TABLE_PROFILES_COMMENTS', $prefix . 'profiles_comments'); define('TABLE_PROFILES_PHOTOS', $prefix . 'profiles_photos'); define('TABLE_PROFILES_TAGS', $prefix . 'profiles_tags'); define('TABLE_REGISTRY', $prefix . 'registry'); define('TABLE_REQUESTS', $prefix . 'requests'); define('TABLE_REQUESTS_REPLIES', $prefix . 'requests_replies'); define('TABLE_SESSIONS', $prefix . 'sessions'); define('TABLE_SHIPS', $prefix . 'ships'); define('TABLE_USERS', $prefix . 'users'); define('TABLE_USERS_INVITES', $prefix . 'users_invites'); define('TABLE_USERS_AUTH', $prefix . 'users_auth'); //Geo tables define('TABLE_BODIES', $prefix . 'geo_bodies'); define('TABLE_LOCATIONS', $prefix . 'geo_locations'); //Well... it's a view define('TABLE_PLACES', $prefix . 'geo_places'); //////////////////////////////////////////////////////////////////////////////// /// /// /// II. Site configuration /// /// /// //////////////////////////////////////////////////////////////////////////////// //Default theme $Config['DefaultTheme'] = "Zed"; //Dates date_default_timezone_set("UTC"); //Secret key, used for some verification hashes in URLs or forms. $Config['SecretKey'] = 'Lorem ipsum dolor'; //When reading files, buffer size define('BUFFER_SIZE', 4096); //////////////////////////////////////////////////////////////////////////////// /// /// /// III. Script URLs /// /// /// //////////////////////////////////////////////////////////////////////////////// /* * Apache httpd, without mod_rewrite: * * Subdirectory: * - $Config['SiteURL'] = 'http://zed.dereckson.be/hypership/index.php'; * - $Config['BaseURL'] = '/hypership/index.php'; * * Root directory: * - $Config['SiteURL'] = 'http://zed.dereckson.be/index.php'; * - $Config['BaseURL'] = '/index.php'; * * Apache httpd, with mod_rewrite: * * Subdirectory: * - $Config['SiteURL'] = 'http://zed.dereckson.be/hypership'; * - $Config['BaseURL'] = '/hypership'; * * In .htaccess or your vhost definition: * RewriteEngine On * RewriteBase /hypership/ * RewriteCond %{REQUEST_FILENAME} !-f * RewriteCond %{REQUEST_FILENAME} !-d * RewriteRule . /hypership/index.php [L] * * Root directory: * - $Config['SiteURL'] = 'http://zed.dereckson.be'; * - $Config['BaseURL'] = ''; * * In .htaccess or your vhost definition: * RewriteEngine On * RewriteBase / * RewriteCond %{REQUEST_FILENAME} !-f * RewriteCond %{REQUEST_FILENAME} !-d * RewriteRule . /index.php [L] * * nginx: * * Use same config.php settings than Apache httpd, with mod_rewrite. * * In your server block: * location / { * #Serves static files if they exists, with one month cache * if (-f $request_filename) { * expires 30d; * break; * } * * #Sends all non existing file or directory requests to index.php * if (!-e request_filename) { * rewrite ^(.+)$ /index.php last; * #Or if you use a subdirectory: * #rewrite ^(.+)$ /hypership/index.php last; * } * } * * location ~ \.php$ { * #Your instructions to pass query to your FastCGI process, like: * fastcgi_pass 127.0.0.1:9000; * fastcgi_param SCRIPT_FILENAME /var/www/zed$fastcgi_script_name; * include fastcgi_params; * } * * * If you don't want to specify the server domain, you can use get_server_url: * $Config['SiteURL'] = get_server_url() . '/hypership'; * $Config['SiteURL'] = get_server_url(); * * * * !!! No trailing slash !!! * */ $Config['SiteURL'] = get_server_url(); $Config['BaseURL'] = ''; //AJAX callbacks URL $Config['DoURL'] = $Config['SiteURL'] . "/do.php"; //////////////////////////////////////////////////////////////////////////////// /// /// /// IV. Static content /// /// /// //////////////////////////////////////////////////////////////////////////////// //Where the static content is located? //Static content = 4 directories: js, css, img and content //On default installation, those directories are at site root. //To improve site performance, you can use a CDN for that. // //Recommanded setting: $Config['StaticContentURL'] = $Config['SiteURL']; //Or if Zed is the site root: $Config['StaticContentURL'] = ''; //With CoralCDN: $Config['StaticContentURL'] = . '.nyud.net'; // $Config['StaticContentURL'] = ''; //$Config['StaticContentURL'] = get_server_url() . '.nyud.net'; //Scenes define('SCENE_DIR', 'content/scenes'); define('SCENE_URL', $Config['StaticContentURL'] . '/' . SCENE_DIR); //Stories define('STORIES_DIR', "content/stories"); //Profile's photos define('PHOTOS_DIR', 'content/users/_photos'); define('PHOTOS_URL', $Config['StaticContentURL'] . '/' . PHOTOS_DIR); //ImageMagick paths //Be careful on Windows platform convert could match the NTFS convert command. $Config['ImageMagick']['convert'] = 'convert'; $Config['ImageMagick']['mogrify'] = 'mogrify'; $Config['ImageMagick']['composite'] = 'composite'; $Config['ImageMagick']['identify'] = 'identify'; //////////////////////////////////////////////////////////////////////////////// /// /// /// V. Caching /// /// /// //////////////////////////////////////////////////////////////////////////////// /* * Some data (Smarty, OpenID and sessions) are cached in the cache directory. * * Security tip: you can move this cache directory outside the webserver tree. */ define('CACHE_DIR', 'cache'); /* * Furthermore, you can also enable a cache engine, like memcached, to store * data from heavy database queries, or frequently accessed stuff. * * To use memcached: - * - $Config['cache']['engine'] = 'memcached'; - * - $Config['cache']['server'] = 'localhost'; - * - $Config['cache']['port'] = 11211; + * - $Config['cache']['engine'] = 'memcached'; + * - $Config['cache']['server'] = 'localhost'; + * - $Config['cache']['port'] = 11211; + * + * For SASL authentication, add also: + * - $Config['cache']['SASL'] = true; + * - $Config['cache']['username'] = 'username'; + * - $Config['cache']['password'] = 'password'; * * To disable cache: * - $Config['cache']['engine'] = 'void'; * (or don't write nothing at all) */ -$Config['cache']['engine'] = 'void'; +$Config['cache']['engine'] = 'memcached'; +$Config['cache']['server'] = 'localhost'; +$Config['cache']['port'] = 11211; +$Config['cache']['SASL'] = true; +$Config['cache']['username'] = 'zed'; +$Config['cache']['password'] = 'zed'; //////////////////////////////////////////////////////////////////////////////// /// /// /// VI. Sessions and authentication code /// /// /// //////////////////////////////////////////////////////////////////////////////// //If you want to use a common table of sessions / user handling //with several websites, specify a different resource id for each site. $Config['ResourceID'] = 21; //Enable OpenID authentication //$Config['OpenID'] = true; //Enable YubiKey authentication //API 12940 //For YubiCloud API key - create yours at https://upgrade.yubico.com/getapikey/ //$Config['YubiCloud']['ClientID'] = 12345; //$Config['YubiCloud']['SecretKey'] = 'Base64SecretKeyHere'; //PHP variables ini_set('session.serialize_handler', 'wddx'); ini_set('session.save_path', CACHE_DIR . '/sessions'); ini_set('session.gc_maxlifetime', 345600); //4 days, for week-end story pause and continue url //////////////////////////////////////////////////////////////////////////////// /// /// /// VII. Builder /// /// /// //////////////////////////////////////////////////////////////////////////////// //Zed can invoke a slighty modified version of HOTGLUE to build zones. $Config['builder']['hotglue']['enable'] = true; $Config['builder']['hotglue']['URL'] = '/apps/hotglue/index.php'; ?>