<?php
/**
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */

/**
 * The default configuration settings
 *
 * Put any site specific configuration in a config/local.php file, this way
 * your configuration won't be lost when upgrading shindig. If your site don't
 * support any services just use empty string as the service name. i.e.
 *  'messages_service' => ''
 *
 * in local.php you only have to specificy the fields you want to overwrite
 * with other values, for example on a production system you would probably have:
 * $shindigConfig = array(
 * 	'debug' => false,
 * 	'allow_plaintext_token' => false,
 * 	'token_cipher_key' => 'MySecretKey',
 * 	'token_hmac_key' => 'MyOtherSecret',
 * 	'private_key_phrase' => 'MyCertificatePassword',
 * 	'person_service' => 'MyPeopleService',
 * 	'activity_service' => 'MyActivitiesService',
 * 	'app_data_service' => 'MyAppDataService',
 * 	'messages_service' => 'MyMessagesService',
 * 	'oauth_lookup_service' => 'MyOAuthLookupService'
 * 	'xrds_location' => 'http://www.mycontainer.com/xrds',
 * 	'check_file_exists' => false
 * );
 *
 */
return array(
  // Show debug backtrace's. Disable this on a production site
  'debug' => true,
  // do real file_exist checks? Turning this off can be a big performance gain on prod servers but also risky & less verbose errors
  'check_file_exists' => true,

  // Allow plain text security tokens, this is only here to allow the sample files to work. Disable on a production site
  'allow_plaintext_token' => true,

  // Is a valid security token required to render a gadget? The token is required for doing signed preloads, but disallowing this
  // can also help prevent external parties using your rendering server (only for the paranoid :)
  'render_token_required' => false,

  // Normally we would only rewrite the gadget's html if it has the <Optional feature="content-rewrite"> set, however with this you can
  // force the content to always be rewritten
  'rewrite_by_default' => false,

  // Should we sanitize (remove scripts) from certain views? Right now this is useless, but once service sided templating and OSML is done
  // this could be useful to force (fast) html only gadgets on the profile and/or home view. Set this to false or to an array of view names like: array('profile', 'home')
  'sanitize_views' => false,

  // Compress the inlined javascript, saves upto 50% of the document size
  'compress_javascript' => true,

  // Default refresh interval for proxy/makeRequest's if none is specified in the query
  'default_refresh_interval' => 1209587,

  // The URL Prefix under which shindig lives ie if you have http://myhost.com/shindig/php set web_prefix to /shindig/php
  'web_prefix' => '',
  // If you changed the web prefix, add the prefix to these too
  'default_js_prefix' => '/gadgets/js/',
  'default_iframe_prefix' => '/gadgets/ifr?',

 'servlet_map' => array(
   '/container' => 'apache\shindig\gadgets\servlet\ContentFilesServlet',
   '/samplecontainer' => 'apache\shindig\gadgets\servlet\ContentFilesServlet',
   '/gadgets/resources' => 'apache\shindig\gadgets\servlet\ResourcesFilesServlet',
   '/gadgets/js' => 'apache\shindig\gadgets\servlet\JsServlet',
   '/gadgets/proxy' => 'apache\shindig\gadgets\servlet\ProxyServlet',
   '/gadgets/makeRequest' => 'apache\shindig\gadgets\servlet\MakeRequestServlet',
   '/gadgets/ifr' => 'apache\shindig\gadgets\servlet\GadgetRenderingServlet',
   '/gadgets/metadata' => 'apache\shindig\gadgets\servlet\MetadataServlet',
   '/gadgets/oauthcallback' => 'apache\shindig\gadgets\servlet\OAuthCallbackServlet',
   '/gadgets/api/rpc' => 'apache\shindig\social\servlet\JsonRpcServlet',
   '/gadgets/api/rest' => 'apache\shindig\social\servlet\DataServiceServlet',
   '/social/rest' => 'apache\shindig\social\servlet\DataServiceServlet',
   '/social/rpc' => 'apache\shindig\social\servlet\CompatibilityJsonRpcServlet',
   '/rpc' => 'apache\shindig\social\servlet\JsonRpcServlet',
   '/public.crt' => 'apache\shindig\gadgets\servlet\CertServlet',
   '/public.cer' => 'apache\shindig\gadgets\servlet\CertServlet',
   '/' => 'apache\shindig\gadgets\servlet\ContentFilesServlet',
 ),

  // The X-XRDS-Location value for your implementing container, see http://code.google.com/p/partuza/source/browse/trunk/Library/XRDS.php for an example
  'xrds_location' => '',

  // Allow anonymous (READ) access to the profile information? (aka REST and JSON-RPC interfaces)
  // setting this to false means you have to be authenticated through OAuth to read the data
  'allow_anonymous_token' => true,

  // The encryption keys for encrypting the security token, and the expiration of it. Make sure these match the keys used in your container/site
  'token_cipher_key' => 'INSECURE_DEFAULT_KEY',
  'token_hmac_key' => 'INSECURE_DEFAULT_KEY',
  'token_max_age' => 60 * 60,

  // Ability to customize the style thats injected into the gadget document. Don't forget to put the link/etc colors in shindig/config/container.js too!
  'gadget_css' => 'body,td,div,span,p{font-family:arial,sans-serif;} a {color:#0000cc;}a:visited {color:#551a8b;}a:active {color:#ff0000;}body{margin: 0px;padding: 0px;background-color:white;}',

  // P3P privacy policy to use for the iframe document
  'P3P' => 'CP="CAO PSA OUR"',

  // The locations of the various required components on disk. If you did a normal svn checkout there's no need to change these
  'base_path' => realpath(dirname(__FILE__) . '/..') . '/',
  'features_path' => array(
    realpath(dirname(__FILE__) . '/../../features/src/main/javascript/features') . '/',
    realpath(dirname(__FILE__) . '/../../extras/src/main/javascript/features-extras') . '/',
  ),
  'container_path' => realpath(dirname(__FILE__) . '/../../config') . '/',
  'javascript_path' => realpath(dirname(__FILE__) . '/../../content') . '/',
  'resources_path' => realpath(dirname(__FILE__) . '/../external/resources') . '/',

  // The OAuth SSL certificates to use, and the pass phrase for the private key
  'private_key_file' => realpath(dirname(__FILE__) . '/../certs') . '/private.key',
  'public_key_file' => realpath(dirname(__FILE__) . '/../certs') . '/public.crt',
  'private_key_phrase' => 'partuza',

  // the path to the json db file, used only if your using the JsonDbOpensocialService example/demo service
  'jsondb_path' => realpath(dirname(__FILE__) . '/../../content/sampledata') . '/canonicaldb.json',

  // Force these libraries to be external (included through <script src="..."> tags), this way they could be cached by the browser
  // these libraries will be included regardless of the features the gadget requests
  // example: 'dynamic-height:views' includes the features dynamic-height and views
  'forcedJsLibs' => '',

  // Force these js libraries to be appended to each gadget regardless if the gadget requested them or not
  // This can be useful to overwrite existing methods of other javascript packages
  'forcedAppendedJsLibs' => array(),

  // After checking the internal __autoload function, shindig can also call the 'extension_autoloader' function to load an
  // unknown custom class, this is particuarly useful for when intergrating shindig into an existing framework that also depends on autoloading
  'extension_autoloader' => false,

  // Configurable classes. Change these to the class name to use, and make sure the auto-loader can find them
  'blacklist_class' => 'apache\shindig\gadgets\sample\BasicGadgetBlacklist',
  'remote_content' => 'apache\shindig\common\sample\BasicRemoteContent',
  'remote_content_fetcher' => 'apache\shindig\common\sample\BasicRemoteContentFetcher',
  'security_token_signer' => 'apache\shindig\common\sample\BasicSecurityTokenDecoder',
  'security_token' => 'apache\shindig\common\sample\BasicSecurityToken',
  'oauth_lookup_service' => 'apache\shindig\common\sample\BasicOAuthLookupService',
  // The OAuth Store is used to store the (gadgets/)oauth proxy credentials it obtained on behalf of the user/gadget combo
  'oauth_store' => 'apache\shindig\gadgets\oauth\BasicOAuthStore',
  'gadget_oauth_token_store' => 'apache\shindig\gadgets\oauth\BasicGadgetOAuthTokenStore',

  // handler for ApiServlet
  'service_handler' => array(
    'people' => 'apache\shindig\social\service\PersonHandler',
    'activities' => 'apache\shindig\social\service\ActivityHandler',
    'appdata' => 'apache\shindig\social\service\AppDataHandler',
    'groups' => 'apache\shindig\social\service\GroupHandler',
    'messages' => 'apache\shindig\social\service\MessagesHandler',
    'cache'  => 'apache\shindig\social\service\InvalidateHandler',
    'system' => 'apache\shindig\social\service\SystemHandler',
    'albums' => 'apache\shindig\social\service\AlbumHandler',
    'mediaitems' => 'apache\shindig\social\service\MediaItemHandler',
    'http' => 'apache\shindig\social\service\HttpHandler',
  ),

  // class is the name of the concrete input converter class
  // targetField is the name of the field where the decoded array will be inserted
  // into the params array or null if you want to overwrite params with the decoded
  // array or false if you do not want to add the decoded params
  'service_input_converter' => array(
    'people' => array('class' => 'apache\shindig\social\converters\InputPeopleConverter', 'targetField' => false),
    'activities' => array('class' => 'apache\shindig\social\converters\InputActivitiesConverter', 'targetField' => 'activity'),
    'appdata' => array('class' => 'apache\shindig\social\converters\InputAppDataConverter', 'targetField' => 'data'),
    'messages' => array('class' => 'apache\shindig\social\converters\InputMessagesConverter', 'targetField' => 'entity'),
    'cache'  => array('class' => 'apache\shindig\social\converters\InputInvalidateConverter', 'targetField' => null),
    'albums' => array('class' => 'apache\shindig\social\converters\InputAlbumsConverter', 'targetField' => 'album'),
    'mediaitems' => array('class' => 'apache\shindig\social\converters\InputMediaItemsConverter', 'targetField' => 'mediaItem'),
  ),

  // available gadget renderer with the class as key and the needed attributes in the
  // view's content block to choose this renderer. If constraint's value is a string
  // the attribute value has to match this string, if it's a boolean the attribute
  // just has to be available or not available
  'gadget_renderer' => array(
    'apache\shindig\gadgets\render\GadgetHtmlRenderer' => array('type' => 'HTML', 'href' => false),
    'apache\shindig\gadgets\render\GadgetHrefRenderer' => array('type' => 'HTML', 'href' => true),
    'apache\shindig\gadgets\render\GadgetUrlRenderer'  => array('type' => 'URL'),
  ),

  'gadget_class' => 'apache\shindig\gadgets\Gadget',
  'gadget_context_class' => 'apache\shindig\gadgets\GadgetContext',
  'gadget_factory_class' => 'apache\shindig\gadgets\GadgetFactory',
  'gadget_spec_parser' => 'apache\shindig\gadgets\GadgetSpecParser',
  'gadget_spec_class' => 'apache\shindig\gadgets\GadgetSpec',
  'substitution_class' => 'apache\shindig\gadgets\Substitutions',
  'proxy_handler' => 'apache\shindig\gadgets\ProxyHandler',
  'makerequest_handler' => 'apache\shindig\gadgets\MakeRequestHandler',
  'makerequest_class' => 'apache\shindig\gadgets\MakeRequest',
  'container_config_class' => 'apache\shindig\gadgets\ContainerConfig',

  // Caching back-end's to use. Shindig ships with CacheStorageFile, CacheStorageApc and CacheStorageMemcache support
  // The data cache is primarily used for remote content (proxied files, gadget spec, etc)
  // and the feature_cache is used to cache the parsed features xml structure and javascript
  // On a production system you probably want to use CacheStorageApc for features, and CacheStorageMemcache for the data cache
  'data_cache' => 'apache\shindig\common\sample\CacheStorageFile',
  'feature_cache' => 'apache\shindig\common\sample\CacheStorageFile',

  // RESTful API data service classes to use
  // See http://code.google.com/p/partuza/source/browse/#svn/trunk/Shindig for a MySql powered example
  'person_service' => 'apache\shindig\social\sample\JsonDbOpensocialService',
  'activity_service' => 'apache\shindig\social\sample\JsonDbOpensocialService',
  'app_data_service' => 'apache\shindig\social\sample\JsonDbOpensocialService',
  'group_service' => 'apache\shindig\social\sample\JsonDbOpensocialService',
  'messages_service' => 'apache\shindig\social\sample\JsonDbOpensocialService',
  'invalidate_service' => 'apache\shindig\social\sample\DefaultInvalidateService',
  'album_service' => 'apache\shindig\social\sample\JsonDbOpensocialService',
  'media_item_service' => 'apache\shindig\social\sample\JsonDbOpensocialService',

  // Also scan these directories when looking for <Class>.php files. You can include multiple paths by seperating them with a ,
  // To enable classes in the extras package you have to add this class path
  // 'extension_class_paths' => '../extras/src/main/php/extras',
  'extension_class_paths' => '',

  'userpref_param_prefix' => 'up_',
  'libs_param_name' => 'libs',

  // If you use CacheStorageMemcache as caching backend, change these to the memcache server settings
  'cache_host' => 'localhost',
  'cache_port' => 11211,
  // When using CacheStorageMemcache, should we use pconnect? There are some reports that apache/mpm + memcache_pconnect can lead to segfaults
  'cache_memcache_pconnect' => true,
  'cache_time' => 24 * 60 * 60,
  // If you use CacheStorageFile as caching backend, this is the directory where it stores the temporary files
  'cache_root' => sys_get_temp_dir() . '/shindig',

  // connection timeout setting for all curl requests, set this time something low if you want errors reported
  // quicker to the end user, and high (between 10 and 20) if your on a slow connection
  'curl_connection_timeout' => '10',
  'curl_request_timeout' => '10',

  // If your development server is behind a proxy, enter the proxy details here in 'proxy.host.com:port' format.
  'proxy' => '',

  // If your server is behind a reverse proxy, set the real hostname here so that OAuth signatures match up, for example:
  // 'http_host' => 'modules.partuza.nl'
  'http_host' => false,

  // Container id, used for security token
  'container_id' => 'default'
);
