Reverted geoffm's accidental commit to /open

git-svn-id: svn://svn.silverstripe.com/silverstripe/open/modules/sapphire/trunk@50107 467b73ca-7a2a-4603-9d3b-597d59a354a9
This commit is contained in:
Matt Peel 2008-02-25 02:10:37 +00:00
parent bf3c09bec6
commit 7d13ba7fb8
162 changed files with 4769 additions and 11124 deletions

View File

@ -12,10 +12,11 @@
* <code>
* Authenticator::register_authenticator('OpenIDAuthenticator');
* </code>
*
* @package sapphire
* @subpackage core
*/
/**
* Add pear parser to include path
*/

View File

@ -1,10 +1,26 @@
<?php
/**
* @package sapphire
* @subpackage integration
*/
/**
* RSSFeed class
*
* This class is used to create an RSS feed.
* @package sapphire
* @subpackage integration
*/
class RSSFeed extends ViewableData {
/**
* Casting information for this object's methods.
* Let's us use $Title.XML in templates
*/
public static $casting = array(
"Title" => "Varchar",
"Description" => "Varchar",
);
/**
* Holds the feed entries
@ -49,7 +65,7 @@ class RSSFeed extends ViewableData {
protected $descriptionField;
/**
Name of the author field of feed entries
* Name of the author field of feed entries
*
* @var string
*/
@ -185,9 +201,10 @@ class RSSFeed extends ViewableData {
* This class is used for entries of an RSS feed.
*
* @see RSSFeed
* @package sapphire
* @subpackage integration
*/
class RSSFeed_Entry extends ViewableData {
/**
* The object that represents the item, it contains all the data.
*
@ -210,7 +227,7 @@ class RSSFeed_Entry extends ViewableData {
protected $descriptionField;
/**
Name of the author field of feed entries
* Name of the author field of feed entries
*
* @var string
*/

View File

@ -1,8 +1,16 @@
<?php
/**
* @package sapphire
* @subpackage integration
*/
/**
* RestfulService class allows you to consume various RESTful APIs.
* Through this you could connect and aggregate data of various web services.
* For more info visit wiki documentation - http://doc.silverstripe.com/doku.php?id=restfulservice
* @package sapphire
* @subpackage integration
*/
class RestfulService extends ViewableData {
protected $baseURL;
@ -12,6 +20,11 @@ class RestfulService extends ViewableData {
protected $checkErrors;
protected $cache_expire;
/**
* Creates a new restful service.
* @param string $base Base URL of the web service eg: api.example.com
* @param int $expiry Set the cache expiry interva. Defaults to 1 hour (3600 seconds)
*/
function __construct($base, $expiry=3600){
$this->baseURL = $base;
$this->cache_expire = $expiry;
@ -19,7 +32,7 @@ class RestfulService extends ViewableData {
/**
* Sets the Query string parameters to send a request.
* @param params An array passed with necessary parameters.
* @param array $params An array passed with necessary parameters.
*/
function setQueryString($params=NULL){
$this->queryString = http_build_query($params,'','&');
@ -31,59 +44,66 @@ class RestfulService extends ViewableData {
/**
* Connects to the RESTful service and gets its response.
* TODO implement authentication via cURL for
* @todo implement authentication via cURL for
*/
function connect(){
$url = $this->constructURL(); // url for the request
$url = $this->constructURL(); //url for the request
// check for file exists in cache
// set the cache directory
$cachedir = TEMP_FOLDER; // default silverstripe-cache
//check for file exists in cache
//set the cache directory
$cachedir=TEMP_FOLDER; //default silverstrip-cache
$cache_file = md5($url); // encoded name of cache file
$cache_path = $cachedir . "/$cache_file";
$cache_file = md5($url); //encoded name of cache file
$cache_path = $cachedir."/$cache_file";
if((@file_exists("$cache_path") && ((@filemtime($cache_path) + $this->cache_expire) > (time())))){
if(( @file_exists("$cache_path") && ((@filemtime($cache_path) + $this->cache_expire) > ( time() )))){
$this->rawXML = file_get_contents($cache_path);
} else {
// not available in cache fetch from server
}
else {//not available in cache fetch from server
$ch = curl_init();
$timeout = 5;
$useragent = "SilverStripe/2.2";
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_USERAGENT, $useragent);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
$this->rawXML = curl_exec($ch);
curl_close($ch);
// save the response in cache
$fp = @fopen($cache_path,"w+");
@fwrite($fp,$this->rawXML);
@fclose($fp);
}
// Try using file_get_contents if cURL is not installed in your system.
// $this->rawXML = file_get_contents($url);
//Try using file_get_contents if cURL is not installed in your system.
//$this->rawXML = file_get_contents($url);
// results returned - from cache / live
//results returned - from cache / live
if($this->rawXML != ""){
//save the response in cache
$fp = @fopen($cache_path,"w+");
@fwrite($fp,$this->rawXML);
@fclose($fp);
if($this->checkErrors == true) {
return $this->errorCatch($this->rawXML);
} else {
}
else {
return $this->rawXML;
}
} else {
user_error("Invalid Response (maybe your calling to wrong URL or server unavailable)", E_USER_ERROR);
}
}
else {
user_error("Invalid Response (maybe your calling to wrong URL or server unavailable)", E_USER_ERROR);
}
}
/**
* Gets attributes as an array, of a particular type of element.
* @params xml - the source xml to parse, this could be the original response received.
* @params collection - parent node which wraps the elements, if available
* @params element - element we need to extract the attributes.
* Example : <photo id="2636" owner="123" secret="ab128" server="2">
* returns id, owner,secret and sever attribute values of all such photo elements.
* @param string $xml The source xml to parse, this could be the original response received.
* @param string $collection The name of parent node which wraps the elements, if available
* @param string $element The element we need to extract the attributes.
*/
function getAttributes($xml, $collection=NULL, $element=NULL){
@ -111,10 +131,10 @@ class RestfulService extends ViewableData {
/**
* Gets an attribute of a particular element.
* @params xml - the source xml to parse, this could be the original response received.
* @params collection - parent node which wraps the element, if available
* @params element - element we need to extract the attribute
* @params attr - name of the attribute
* @param string $xml The source xml to parse, this could be the original response received.
* @param string $collection The name of the parent node which wraps the element, if available
* @param string $element The element we need to extract the attribute
* @param string $attr The name of the attribute
*/
function getAttribute($xml, $collection=NULL, $element=NULL, $attr){
@ -136,9 +156,9 @@ class RestfulService extends ViewableData {
/**
* Gets set of node values as an array.
* When you get to the depth in the hierachchy use node_child_subchild syntax to get the value.
* @params xml - the source xml to parse, this could be the original response received.
* @params collection - parent node which wraps the elements, if available
* @params element - element we need to extract the node values.
* @param string $xml The the source xml to parse, this could be the original response received.
* @param string $collection The name of parent node which wraps the elements, if available
* @param string $element The element we need to extract the node values.
*/
function getValues($xml, $collection=NULL, $element=NULL){
@ -162,13 +182,24 @@ class RestfulService extends ViewableData {
}
protected function getRecurseValues($xml,&$data,$parent=""){
$conv_value = "";
$child_count = 0;
foreach($xml as $key=>$value)
{
$child_count++;
$k = ($parent == "") ? (string)$key : $parent . "_" . (string)$key;
if($this->getRecurseValues($value,$data,$k) == 0) // no childern, aka "leaf node"
$data[$k] = Convert::raw2xml($value);
if($this->getRecurseValues($value,$data,$k) == 0){ // no childern, aka "leaf node"
$conv_value = Convert::raw2xml($value);
}
//Review the fix for similar node names overriding it's predecessor
if(array_key_exists($k, $data) == true) {
$data[$k] = $data[$k] . ",". $conv_value;
}
else {
$data[$k] = $conv_value;
}
}
return $child_count;
@ -176,9 +207,9 @@ class RestfulService extends ViewableData {
/**
* Gets a single node value.
* @params xml - the source xml to parse, this could be the original response received.
* @params collection - parent node which wraps the elements, if available
* @params element - element we need to extract the node value.
* @param string $xml The source xml to parse, this could be the original response received.
* @param string $collection The name of parent node which wraps the elements, if available
* @param string $element The element we need to extract the node value.
*/
function getValue($xml, $collection=NULL, $element=NULL){
@ -193,6 +224,11 @@ class RestfulService extends ViewableData {
return Convert::raw2xml($childElements);
}
/**
* Searches for a node in document tree and returns it value.
* @param string $xml source xml to parse, this could be the original response received.
* @param string $node Node to search for
*/
function searchValue($xml, $node=NULL){
$xml = new SimpleXMLElement($xml);
$childElements = $xml->xpath($node);
@ -201,6 +237,11 @@ class RestfulService extends ViewableData {
return Convert::raw2xml($childElements[0]);
}
/**
* Searches for a node in document tree and returns its attributes.
* @param string $xml the source xml to parse, this could be the original response received.
* @param string $node Node to search for
*/
function searchAttributes($xml, $node=NULL){
$xml = new SimpleXMLElement($xml);
$output = new DataObjectSet();
@ -216,12 +257,10 @@ class RestfulService extends ViewableData {
$output->push(new ArrayData($data));
}
//Debug::show($attr_value);
return $output;
}
}
?>
?>

View File

@ -1,5 +1,15 @@
<?php
/**
* @package sapphire
* @subpackage integration
*/
/**
* Soap server class
* @package sapphire
* @subpackage integration
*/
class SapphireSoapServer extends Controller {
static $methods = array();
static $xsd_types = array(

View File

@ -1,26 +1,22 @@
<?php
/****************************************************
SIMPLEPIE
A PHP-Based RSS and Atom Feed Framework
Takes the hard work out of managing a complete RSS/Atom solution.
Version: "Lemon Meringue"
Updated: 3 November 2006
Copyright: 2004-2006 Ryan Parman, Geoffrey Sneddon
http://simplepie.org
*****************************************************
LICENSE:
GNU Lesser General Public License 2.1 (LGPL)
http://creativecommons.org/licenses/LGPL/2.1/
*****************************************************
Please submit all bug reports and feature requests to the SimplePie forums.
http://simplepie.org/support/
****************************************************/
/**
* @package sapphire
* @subpackage integration
*/
/**
* A PHP-Based RSS and Atom Feed Framework
* Takes the hard work out of managing a complete RSS/Atom solution.
* Version: "Lemon Meringue"
* Updated: 3 November 2006
* Copyright: 2004-2006 Ryan Parman, Geoffrey Sneddon
* http://simplepie.org
* LICENSE: GNU Lesser General Public License 2.1 (LGPL)
* Please submit all bug reports and feature requests to the SimplePie forums. http://simplepie.org/support/
* @package sapphire
* @subpackage integration
*/
class SimplePie
{
// SimplePie Info
@ -1172,6 +1168,10 @@ EOT;
}
}
/**
* @package sapphire
* @subpackage integration
*/
class SimplePie_Item
{
var $data;
@ -1681,6 +1681,10 @@ class SimplePie_Item
}
}
/**
* @package sapphire
* @subpackage integration
*/
class SimplePie_Author
{
var $name;
@ -1732,6 +1736,10 @@ class SimplePie_Author
}
}
/**
* @package sapphire
* @subpackage integration
*/
class SimplePie_Enclosure
{
var $link;
@ -2119,6 +2127,10 @@ class SimplePie_Enclosure
}
}
/**
* @package sapphire
* @subpackage integration
*/
class SimplePie_File
{
var $url;
@ -2377,6 +2389,10 @@ class SimplePie_File
}
}
/**
* @package sapphire
* @subpackage integration
*/
class SimplePie_Cache
{
var $location;
@ -2444,6 +2460,10 @@ class SimplePie_Cache
}
}
/**
* @package sapphire
* @subpackage integration
*/
class SimplePie_Misc
{
function absolutize_url($relative, $base)
@ -3554,6 +3574,10 @@ class SimplePie_Misc
}
}
/**
* @package sapphire
* @subpackage integration
*/
class SimplePie_Locator
{
var $useragent;
@ -3758,6 +3782,10 @@ class SimplePie_Locator
}
}
/**
* @package sapphire
* @subpackage integration
*/
class SimplePie_Parser
{
var $encoding;
@ -4390,6 +4418,10 @@ class SimplePie_Parser
}
}
/**
* @package sapphire
* @subpackage integration
*/
class SimplePie_Sanitize
{
// Private vars

View File

@ -1,867 +1,870 @@
<?php
/**
* Spyc -- A Simple PHP YAML Class
* @version 0.2.(5) -- 2006-12-31
* @author Chris Wanstrath <chris@ozmm.org>
* @author Vlad Andersen <vlad@oneiros.ru>
* @link http://spyc.sourceforge.net/
* @copyright Copyright 2005-2006 Chris Wanstrath
* @license http://www.opensource.org/licenses/mit-license.php MIT License
* @package Spyc
/**
* Spyc -- A Simple PHP YAML Class
* @version 0.2.(5) -- 2006-12-31
* @author Chris Wanstrath <chris@ozmm.org>
* @author Vlad Andersen <vlad@oneiros.ru>
* @link http://spyc.sourceforge.net/
* @copyright Copyright 2005-2006 Chris Wanstrath
* @license http://www.opensource.org/licenses/mit-license.php MIT License
* @package sapphire
* @subpackage misc
*/
/**
* A node, used by Spyc for parsing YAML.
* @package sapphire
* @subpackage misc
*/
class YAMLNode {
/**#@+
* @access public
* @var string
*/
public $parent;
public $id;
/**#@-*/
/**
* @access public
* @var mixed
*/
public $data;
/**
* @access public
* @var int
*/
public $indent;
/**
* @access public
* @var bool
*/
public $children = false;
/**
* A node, used by Spyc for parsing YAML.
* @package Spyc
* The constructor assigns the node a unique ID.
* @access public
* @return void
*/
class YAMLNode {
/**#@+
* @access public
* @var string
*/
public $parent;
public $id;
/**#@+*/
/**
* @access public
* @var mixed
*/
public $data;
/**
* @access public
* @var int
*/
public $indent;
/**
* @access public
* @var bool
*/
public $children = false;
public function YAMLNode($nodeId) {
$this->id = $nodeId;
}
}
/**
* The constructor assigns the node a unique ID.
* @access public
* @return void
*/
public function YAMLNode($nodeId) {
$this->id = $nodeId;
}
/**
* The Simple PHP YAML Class.
*
* This class can be used to read a YAML file and convert its contents
* into a PHP array. It currently supports a very limited subsection of
* the YAML spec.
*
* Usage:
* <code>
* $parser = new Spyc;
* $array = $parser->load($file);
* </code>
* @package sapphire
* @subpackage misc
*/
class Spyc {
/**
* Load YAML into a PHP array statically
*
* The load method, when supplied with a YAML stream (string or file),
* will do its best to convert YAML in a file into a PHP array. Pretty
* simple.
* Usage:
* <code>
* $array = Spyc::YAMLLoad('lucky.yaml');
* print_r($array);
* </code>
* @access public
* @return array
* @param string $input Path of YAML file or string containing YAML
*/
public static function YAMLLoad($input) {
$spyc = new Spyc;
return $spyc->load($input);
}
/**
* The Simple PHP YAML Class.
* Dump YAML from PHP array statically
*
* This class can be used to read a YAML file and convert its contents
* into a PHP array. It currently supports a very limited subsection of
* the YAML spec.
* The dump method, when supplied with an array, will do its best
* to convert the array into friendly YAML. Pretty simple. Feel free to
* save the returned string as nothing.yaml and pass it around.
*
* Usage:
* <code>
* Oh, and you can decide how big the indent is and what the wordwrap
* for folding is. Pretty cool -- just pass in 'false' for either if
* you want to use the default.
*
* Indent's default is 2 spaces, wordwrap's default is 40 characters. And
* you can turn off wordwrap by passing in 0.
*
* @access public
* @return string
* @param array $array PHP array
* @param int $indent Pass in false to use the default, which is 2
* @param int $wordwrap Pass in 0 for no wordwrap, false for default (40)
*/
public static function YAMLDump($array,$indent = false,$wordwrap = false) {
$spyc = new Spyc;
return $spyc->dump($array,$indent,$wordwrap);
}
/**
* Load YAML into a PHP array from an instantiated object
*
* The load method, when supplied with a YAML stream (string or file path),
* will do its best to convert the YAML into a PHP array. Pretty simple.
* Usage:
* <code>
* $parser = new Spyc;
* $array = $parser->load($file);
* </code>
* @package Spyc
* $array = $parser->load('lucky.yaml');
* print_r($array);
* </code>
* @access public
* @return array
* @param string $input Path of YAML file or string containing YAML
*/
class Spyc {
/**
* Load YAML into a PHP array statically
*
* The load method, when supplied with a YAML stream (string or file),
* will do its best to convert YAML in a file into a PHP array. Pretty
* simple.
* Usage:
* <code>
* $array = Spyc::YAMLLoad('lucky.yaml');
* print_r($array);
* </code>
* @access public
* @return array
* @param string $input Path of YAML file or string containing YAML
*/
public static function YAMLLoad($input) {
$spyc = new Spyc;
return $spyc->load($input);
public function load($input) {
// See what type of input we're talking about
// If it's not a file, assume it's a string
if (!empty($input) && (strpos($input, "\n") === false)
&& file_exists($input)) {
$yaml = file($input);
} else {
$yaml = explode("\n",$input);
}
// Initiate some objects and values
$base = new YAMLNode (1);
$base->indent = 0;
$this->_lastIndent = 0;
$this->_lastNode = $base->id;
$this->_inBlock = false;
$this->_isInline = false;
$this->_nodeId = 2;
/**
* Dump YAML from PHP array statically
*
* The dump method, when supplied with an array, will do its best
* to convert the array into friendly YAML. Pretty simple. Feel free to
* save the returned string as nothing.yaml and pass it around.
*
* Oh, and you can decide how big the indent is and what the wordwrap
* for folding is. Pretty cool -- just pass in 'false' for either if
* you want to use the default.
*
* Indent's default is 2 spaces, wordwrap's default is 40 characters. And
* you can turn off wordwrap by passing in 0.
*
* @access public
* @return string
* @param array $array PHP array
* @param int $indent Pass in false to use the default, which is 2
* @param int $wordwrap Pass in 0 for no wordwrap, false for default (40)
*/
public static function YAMLDump($array,$indent = false,$wordwrap = false) {
$spyc = new Spyc;
return $spyc->dump($array,$indent,$wordwrap);
}
foreach ($yaml as $linenum => $line) {
$ifchk = trim($line);
/**
* Load YAML into a PHP array from an instantiated object
*
* The load method, when supplied with a YAML stream (string or file path),
* will do its best to convert the YAML into a PHP array. Pretty simple.
* Usage:
* <code>
* $parser = new Spyc;
* $array = $parser->load('lucky.yaml');
* print_r($array);
* </code>
* @access public
* @return array
* @param string $input Path of YAML file or string containing YAML
*/
public function load($input) {
// See what type of input we're talking about
// If it's not a file, assume it's a string
if (!empty($input) && (strpos($input, "\n") === false)
&& file_exists($input)) {
$yaml = file($input);
} else {
$yaml = explode("\n",$input);
// If the line starts with a tab (instead of a space), throw a fit.
if (preg_match('/^(\t)+(\w+)/', $line)) {
$err = 'ERROR: Line '. ($linenum + 1) .' in your input YAML begins'.
' with a tab. YAML only recognizes spaces. Please reformat.';
die($err);
}
// Initiate some objects and values
$base = new YAMLNode (1);
$base->indent = 0;
$this->_lastIndent = 0;
$this->_lastNode = $base->id;
$this->_inBlock = false;
$this->_isInline = false;
$this->_nodeId = 2;
foreach ($yaml as $linenum => $line) {
$ifchk = trim($line);
if ($this->_inBlock === false && empty($ifchk)) {
continue;
} elseif ($this->_inBlock == true && empty($ifchk)) {
$last =& $this->_allNodes[$this->_lastNode];
$last->data[key($last->data)] .= "\n";
} elseif ($ifchk{0} != '#' && substr($ifchk,0,3) != '---') {
// Create a new node and get its indent
$node = new YAMLNode ($this->_nodeId);
$this->_nodeId++;
$node->indent = $this->_getIndent($line);
// If the line starts with a tab (instead of a space), throw a fit.
if (preg_match('/^(\t)+(\w+)/', $line)) {
$err = 'ERROR: Line '. ($linenum + 1) .' in your input YAML begins'.
' with a tab. YAML only recognizes spaces. Please reformat.';
die($err);
}
if ($this->_inBlock === false && empty($ifchk)) {
continue;
} elseif ($this->_inBlock == true && empty($ifchk)) {
$last =& $this->_allNodes[$this->_lastNode];
$last->data[key($last->data)] .= "\n";
} elseif ($ifchk{0} != '#' && substr($ifchk,0,3) != '---') {
// Create a new node and get its indent
$node = new YAMLNode ($this->_nodeId);
$this->_nodeId++;
$node->indent = $this->_getIndent($line);
// Check where the node lies in the hierarchy
if ($this->_lastIndent == $node->indent) {
// If we're in a block, add the text to the parent's data
if ($this->_inBlock === true) {
$parent =& $this->_allNodes[$this->_lastNode];
$parent->data[key($parent->data)] .= trim($line).$this->_blockEnd;
} else {
// The current node's parent is the same as the previous node's
if (isset($this->_allNodes[$this->_lastNode])) {
$node->parent = $this->_allNodes[$this->_lastNode]->parent;
}
// Check where the node lies in the hierarchy
if ($this->_lastIndent == $node->indent) {
// If we're in a block, add the text to the parent's data
if ($this->_inBlock === true) {
$parent =& $this->_allNodes[$this->_lastNode];
$parent->data[key($parent->data)] .= trim($line).$this->_blockEnd;
} else {
// The current node's parent is the same as the previous node's
if (isset($this->_allNodes[$this->_lastNode])) {
$node->parent = $this->_allNodes[$this->_lastNode]->parent;
}
} elseif ($this->_lastIndent < $node->indent) {
if ($this->_inBlock === true) {
$parent =& $this->_allNodes[$this->_lastNode];
$parent->data[key($parent->data)] .= trim($line).$this->_blockEnd;
} elseif ($this->_inBlock === false) {
// The current node's parent is the previous node
$node->parent = $this->_lastNode;
}
} elseif ($this->_lastIndent < $node->indent) {
if ($this->_inBlock === true) {
$parent =& $this->_allNodes[$this->_lastNode];
$parent->data[key($parent->data)] .= trim($line).$this->_blockEnd;
} elseif ($this->_inBlock === false) {
// The current node's parent is the previous node
$node->parent = $this->_lastNode;
// If the value of the last node's data was > or | we need to
// start blocking i.e. taking in all lines as a text value until
// we drop our indent.
$parent =& $this->_allNodes[$node->parent];
$this->_allNodes[$node->parent]->children = true;
if (is_array($parent->data)) {
// if (isset ($parent->data[key($parent->data)]))
$chk = $parent->data[key($parent->data)];
if ($chk === '>') {
$this->_inBlock = true;
$this->_blockEnd = ' ';
$parent->data[key($parent->data)] =
str_replace('>','',$parent->data[key($parent->data)]);
$parent->data[key($parent->data)] .= trim($line).' ';
$this->_allNodes[$node->parent]->children = false;
$this->_lastIndent = $node->indent;
} elseif ($chk === '|') {
$this->_inBlock = true;
$this->_blockEnd = "\n";
$parent->data[key($parent->data)] =
str_replace('|','',$parent->data[key($parent->data)]);
$parent->data[key($parent->data)] .= trim($line)."\n";
$this->_allNodes[$node->parent]->children = false;
$this->_lastIndent = $node->indent;
}
}
}
} elseif ($this->_lastIndent > $node->indent) {
// Any block we had going is dead now
if ($this->_inBlock === true) {
$this->_inBlock = false;
if ($this->_blockEnd = "\n") {
$last =& $this->_allNodes[$this->_lastNode];
$last->data[key($last->data)] =
trim($last->data[key($last->data)]);
}
}
// We don't know the parent of the node so we have to find it
// foreach ($this->_allNodes as $n) {
foreach ($this->_indentSort[$node->indent] as $n) {
if ($n->indent == $node->indent) {
$node->parent = $n->parent;
// If the value of the last node's data was > or | we need to
// start blocking i.e. taking in all lines as a text value until
// we drop our indent.
$parent =& $this->_allNodes[$node->parent];
$this->_allNodes[$node->parent]->children = true;
if (is_array($parent->data)) {
// if (isset ($parent->data[key($parent->data)]))
$chk = $parent->data[key($parent->data)];
if ($chk === '>') {
$this->_inBlock = true;
$this->_blockEnd = ' ';
$parent->data[key($parent->data)] =
str_replace('>','',$parent->data[key($parent->data)]);
$parent->data[key($parent->data)] .= trim($line).' ';
$this->_allNodes[$node->parent]->children = false;
$this->_lastIndent = $node->indent;
} elseif ($chk === '|') {
$this->_inBlock = true;
$this->_blockEnd = "\n";
$parent->data[key($parent->data)] =
str_replace('|','',$parent->data[key($parent->data)]);
$parent->data[key($parent->data)] .= trim($line)."\n";
$this->_allNodes[$node->parent]->children = false;
$this->_lastIndent = $node->indent;
}
}
}
} elseif ($this->_lastIndent > $node->indent) {
// Any block we had going is dead now
if ($this->_inBlock === true) {
$this->_inBlock = false;
if ($this->_blockEnd = "\n") {
$last =& $this->_allNodes[$this->_lastNode];
$last->data[key($last->data)] =
trim($last->data[key($last->data)]);
}
}
if ($this->_inBlock === false) {
// Set these properties with information from our current node
$this->_lastIndent = $node->indent;
// Set the last node
$this->_lastNode = $node->id;
// Parse the YAML line and return its data
$node->data = $this->_parseLine($line);
// Add the node to the master list
$this->_allNodes[$node->id] = $node;
// Add a reference to the parent list
$this->_allParent[intval($node->parent)][] = $node->id;
// Add a reference to the node in an indent array
$this->_indentSort[$node->indent][] =& $this->_allNodes[$node->id];
// Add a reference to the node in a References array if this node
// has a YAML reference in it.
if (
( (is_array($node->data)) &&
isset($node->data[key($node->data)]) &&
(!is_array($node->data[key($node->data)])) )
&&
( (preg_match('/^&([^ ]+)/',$node->data[key($node->data)]))
||
(preg_match('/^\*([^ ]+)/',$node->data[key($node->data)])) )
) {
$this->_haveRefs[] =& $this->_allNodes[$node->id];
} elseif (
( (is_array($node->data)) &&
isset($node->data[key($node->data)]) &&
(is_array($node->data[key($node->data)])) )
) {
// Incomplete reference making code. Ugly, needs cleaned up.
foreach ($node->data[key($node->data)] as $d) {
if ( !is_array($d) &&
( (preg_match('/^&([^ ]+)/',$d))
||
(preg_match('/^\*([^ ]+)/',$d)) )
) {
$this->_haveRefs[] =& $this->_allNodes[$node->id];
}
// We don't know the parent of the node so we have to find it
// foreach ($this->_allNodes as $n) {
foreach ($this->_indentSort[$node->indent] as $n) {
if ($n->indent == $node->indent) {
$node->parent = $n->parent;
}
}
}
if ($this->_inBlock === false) {
// Set these properties with information from our current node
$this->_lastIndent = $node->indent;
// Set the last node
$this->_lastNode = $node->id;
// Parse the YAML line and return its data
$node->data = $this->_parseLine($line);
// Add the node to the master list
$this->_allNodes[$node->id] = $node;
// Add a reference to the parent list
$this->_allParent[intval($node->parent)][] = $node->id;
// Add a reference to the node in an indent array
$this->_indentSort[$node->indent][] =& $this->_allNodes[$node->id];
// Add a reference to the node in a References array if this node
// has a YAML reference in it.
if (
( (is_array($node->data)) &&
isset($node->data[key($node->data)]) &&
(!is_array($node->data[key($node->data)])) )
&&
( (preg_match('/^&([^ ]+)/',$node->data[key($node->data)]))
||
(preg_match('/^\*([^ ]+)/',$node->data[key($node->data)])) )
) {
$this->_haveRefs[] =& $this->_allNodes[$node->id];
} elseif (
( (is_array($node->data)) &&
isset($node->data[key($node->data)]) &&
(is_array($node->data[key($node->data)])) )
) {
// Incomplete reference making code. Ugly, needs cleaned up.
foreach ($node->data[key($node->data)] as $d) {
if ( !is_array($d) &&
( (preg_match('/^&([^ ]+)/',$d))
||
(preg_match('/^\*([^ ]+)/',$d)) )
) {
$this->_haveRefs[] =& $this->_allNodes[$node->id];
}
}
}
}
}
unset($node);
}
unset($node);
// Here we travel through node-space and pick out references (& and *)
$this->_linkReferences();
// Here we travel through node-space and pick out references (& and *)
$this->_linkReferences();
// Build the PHP array out of node-space
$trunk = $this->_buildArray();
return $trunk;
// Build the PHP array out of node-space
$trunk = $this->_buildArray();
return $trunk;
}
/**
* Dump PHP array to YAML
*
* The dump method, when supplied with an array, will do its best
* to convert the array into friendly YAML. Pretty simple. Feel free to
* save the returned string as tasteful.yaml and pass it around.
*
* Oh, and you can decide how big the indent is and what the wordwrap
* for folding is. Pretty cool -- just pass in 'false' for either if
* you want to use the default.
*
* Indent's default is 2 spaces, wordwrap's default is 40 characters. And
* you can turn off wordwrap by passing in 0.
*
* @access public
* @return string
* @param array $array PHP array
* @param int $indent Pass in false to use the default, which is 2
* @param int $wordwrap Pass in 0 for no wordwrap, false for default (40)
*/
public function dump($array,$indent = false,$wordwrap = false) {
// Dumps to some very clean YAML. We'll have to add some more features
// and options soon. And better support for folding.
// New features and options.
if ($indent === false or !is_numeric($indent)) {
$this->_dumpIndent = 2;
} else {
$this->_dumpIndent = $indent;
}
/**
* Dump PHP array to YAML
*
* The dump method, when supplied with an array, will do its best
* to convert the array into friendly YAML. Pretty simple. Feel free to
* save the returned string as tasteful.yaml and pass it around.
*
* Oh, and you can decide how big the indent is and what the wordwrap
* for folding is. Pretty cool -- just pass in 'false' for either if
* you want to use the default.
*
* Indent's default is 2 spaces, wordwrap's default is 40 characters. And
* you can turn off wordwrap by passing in 0.
*
* @access public
* @return string
* @param array $array PHP array
* @param int $indent Pass in false to use the default, which is 2
* @param int $wordwrap Pass in 0 for no wordwrap, false for default (40)
*/
public function dump($array,$indent = false,$wordwrap = false) {
// Dumps to some very clean YAML. We'll have to add some more features
// and options soon. And better support for folding.
if ($wordwrap === false or !is_numeric($wordwrap)) {
$this->_dumpWordWrap = 40;
} else {
$this->_dumpWordWrap = $wordwrap;
}
// New features and options.
if ($indent === false or !is_numeric($indent)) {
$this->_dumpIndent = 2;
} else {
$this->_dumpIndent = $indent;
}
// New YAML document
$string = "---\n";
if ($wordwrap === false or !is_numeric($wordwrap)) {
$this->_dumpWordWrap = 40;
} else {
$this->_dumpWordWrap = $wordwrap;
}
// Start at the base of the array and move through it.
foreach ($array as $key => $value) {
$string .= $this->_yamlize($key,$value,0);
}
return $string;
}
// New YAML document
$string = "---\n";
/**** Private Properties ****/
// Start at the base of the array and move through it.
/**#@+
* @access private
* @var mixed
*/
private $_haveRefs;
private $_allNodes;
private $_allParent;
private $_lastIndent;
private $_lastNode;
private $_inBlock;
private $_isInline;
private $_dumpIndent;
private $_dumpWordWrap;
/**#@-*/
/**** Public Properties ****/
/**#@+
* @access public
* @var mixed
*/
public $_nodeId;
/**#@-*/
/**** Private Methods ****/
/**
* Attempts to convert a key / value array item to YAML
* @access private
* @return string
* @param $key The name of the key
* @param $value The value of the item
* @param $indent The indent of the current node
*/
private function _yamlize($key,$value,$indent) {
if (is_array($value)) {
// It has children. What to do?
// Make it the right kind of item
$string = $this->_dumpNode($key,NULL,$indent);
// Add the indent
$indent += $this->_dumpIndent;
// Yamlize the array
$string .= $this->_yamlizeArray($value,$indent);
} elseif (!is_array($value)) {
// It doesn't have children. Yip.
$string = $this->_dumpNode($key,$value,$indent);
}
return $string;
}
/**
* Attempts to convert an array to YAML
* @access private
* @return string
* @param $array The array you want to convert
* @param $indent The indent of the current level
*/
private function _yamlizeArray($array,$indent) {
if (is_array($array)) {
$string = '';
foreach ($array as $key => $value) {
$string .= $this->_yamlize($key,$value,0);
$string .= $this->_yamlize($key,$value,$indent);
}
return $string;
}
/**** Private Properties ****/
/**#@+
* @access private
* @var mixed
*/
private $_haveRefs;
private $_allNodes;
private $_allParent;
private $_lastIndent;
private $_lastNode;
private $_inBlock;
private $_isInline;
private $_dumpIndent;
private $_dumpWordWrap;
/**#@+*/
/**** Public Properties ****/
/**#@+
* @access public
* @var mixed
*/
public $_nodeId;
/**#@+*/
/**** Private Methods ****/
/**
* Attempts to convert a key / value array item to YAML
* @access private
* @return string
* @param $key The name of the key
* @param $value The value of the item
* @param $indent The indent of the current node
*/
private function _yamlize($key,$value,$indent) {
if (is_array($value)) {
// It has children. What to do?
// Make it the right kind of item
$string = $this->_dumpNode($key,NULL,$indent);
// Add the indent
$indent += $this->_dumpIndent;
// Yamlize the array
$string .= $this->_yamlizeArray($value,$indent);
} elseif (!is_array($value)) {
// It doesn't have children. Yip.
$string = $this->_dumpNode($key,$value,$indent);
}
return $string;
}
/**
* Attempts to convert an array to YAML
* @access private
* @return string
* @param $array The array you want to convert
* @param $indent The indent of the current level
*/
private function _yamlizeArray($array,$indent) {
if (is_array($array)) {
$string = '';
foreach ($array as $key => $value) {
$string .= $this->_yamlize($key,$value,$indent);
}
return $string;
} else {
return false;
}
}
/**
* Returns YAML from a key and a value
* @access private
* @return string
* @param $key The name of the key
* @param $value The value of the item
* @param $indent The indent of the current node
*/
private function _dumpNode($key,$value,$indent) {
// do some folding here, for blocks
if (strpos($value,"\n") !== false || strpos($value,": ") !== false || strpos($value,"- ") !== false) {
$value = $this->_doLiteralBlock($value,$indent);
} else {
$value = $this->_doFolding($value,$indent);
}
if (is_bool($value)) {
$value = ($value) ? "true" : "false";
}
$spaces = str_repeat(' ',$indent);
if (is_int($key)) {
// It's a sequence
$string = $spaces.'- '.$value."\n";
} else {
// It's mapped
$string = $spaces.$key.': '.$value."\n";
}
return $string;
}
/**
* Creates a literal block for dumping
* @access private
* @return string
* @param $value
* @param $indent int The value of the indent
*/
private function _doLiteralBlock($value,$indent) {
$exploded = explode("\n",$value);
$newValue = '|';
$indent += $this->_dumpIndent;
$spaces = str_repeat(' ',$indent);
foreach ($exploded as $line) {
$newValue .= "\n" . $spaces . trim($line);
}
return $newValue;
}
/**
* Folds a string of text, if necessary
* @access private
* @return string
* @param $value The string you wish to fold
*/
private function _doFolding($value,$indent) {
// Don't do anything if wordwrap is set to 0
if ($this->_dumpWordWrap === 0) {
return $value;
}
if (strlen($value) > $this->_dumpWordWrap) {
$indent += $this->_dumpIndent;
$indent = str_repeat(' ',$indent);
$wrapped = wordwrap($value,$this->_dumpWordWrap,"\n$indent");
$value = ">\n".$indent.$wrapped;
}
return $value;
}
/* Methods used in loading */
/**
* Finds and returns the indentation of a YAML line
* @access private
* @return int
* @param string $line A line from the YAML file
*/
private function _getIndent($line) {
preg_match('/^\s{1,}/',$line,$match);
if (!empty($match[0])) {
$indent = substr_count($match[0],' ');
} else {
$indent = 0;
}
return $indent;
}
/**
* Parses YAML code and returns an array for a node
* @access private
* @return array
* @param string $line A line from the YAML file
*/
private function _parseLine($line) {
$line = trim($line);
$array = array();
if (preg_match('/^-(.*):$/',$line)) {
// It's a mapped sequence
$key = trim(substr(substr($line,1),0,-1));
$array[$key] = '';
} elseif ($line[0] == '-' && substr($line,0,3) != '---') {
// It's a list item but not a new stream
if (strlen($line) > 1) {
$value = trim(substr($line,1));
// Set the type of the value. Int, string, etc
$value = $this->_toType($value);
$array[] = $value;
} else {
$array[] = array();
}
} elseif (preg_match('/^(.+):/',$line,$key)) {
// It's a key/value pair most likely
// If the key is in double quotes pull it out
if (preg_match('/^(["\'](.*)["\'](\s)*:)/',$line,$matches)) {
$value = trim(str_replace($matches[1],'',$line));
$key = $matches[2];
} else {
// Do some guesswork as to the key and the value
$explode = explode(':',$line);
$key = trim($explode[0]);
array_shift($explode);
$value = trim(implode(':',$explode));
}
// Set the type of the value. Int, string, etc
$value = $this->_toType($value);
if (empty($key)) {
$array[] = $value;
} else {
$array[$key] = $value;
}
}
return $array;
}
/**
* Finds the type of the passed value, returns the value as the new type.
* @access private
* @param string $value
* @return mixed
*/
private function _toType($value) {
if (preg_match('/^("(.*)"|\'(.*)\')/',$value,$matches)) {
$value = (string)preg_replace('/(\'\'|\\\\\')/',"'",end($matches));
$value = preg_replace('/\\\\"/','"',$value);
} elseif (preg_match('/^\\[(.+)\\]$/',$value,$matches)) {
// Inline Sequence
// Take out strings sequences and mappings
$explode = $this->_inlineEscape($matches[1]);
// Propogate value array
$value = array();
foreach ($explode as $v) {
$value[] = $this->_toType($v);
}
} elseif (strpos($value,': ')!==false && !preg_match('/^{(.+)/',$value)) {
// It's a map
$array = explode(': ',$value);
$key = trim($array[0]);
array_shift($array);
$value = trim(implode(': ',$array));
$value = $this->_toType($value);
$value = array($key => $value);
} elseif (preg_match("/{(.+)}$/",$value,$matches)) {
// Inline Mapping
// Take out strings sequences and mappings
$explode = $this->_inlineEscape($matches[1]);
// Propogate value array
$array = array();
foreach ($explode as $v) {
$array = $array + $this->_toType($v);
}
$value = $array;
} elseif (strtolower($value) == 'null' or $value == '' or $value == '~') {
$value = NULL;
} elseif (preg_match ('/^[0-9]+$/', $value)) {
$value = (int)$value;
} elseif (in_array(strtolower($value),
array('true', 'on', '+', 'yes', 'y'))) {
$value = TRUE;
} elseif (in_array(strtolower($value),
array('false', 'off', '-', 'no', 'n'))) {
$value = FALSE;
} elseif (is_numeric($value)) {
$value = (float)$value;
} else {
// Just a normal string, right?
$value = trim(preg_replace('/#(.+)$/','',$value));
}
return $value;
}
/**
* Used in inlines to check for more inlines or quoted strings
* @access private
* @return array
*/
private function _inlineEscape($inline) {
// There's gotta be a cleaner way to do this...
// While pure sequences seem to be nesting just fine,
// pure mappings and mappings with sequences inside can't go very
// deep. This needs to be fixed.
$saved_strings = array();
// Check for strings
$regex = '/(?:(")|(?:\'))((?(1)[^"]+|[^\']+))(?(1)"|\')/';
if (preg_match_all($regex,$inline,$strings)) {
$saved_strings = $strings[0];
$inline = preg_replace($regex,'YAMLString',$inline);
}
unset($regex);
// Check for sequences
if (preg_match_all('/\[(.+)\]/U',$inline,$seqs)) {
$inline = preg_replace('/\[(.+)\]/U','YAMLSeq',$inline);
$seqs = $seqs[0];
}
// Check for mappings
if (preg_match_all('/{(.+)}/U',$inline,$maps)) {
$inline = preg_replace('/{(.+)}/U','YAMLMap',$inline);
$maps = $maps[0];
}
$explode = explode(', ',$inline);
// Re-add the sequences
if (!empty($seqs)) {
$i = 0;
foreach ($explode as $key => $value) {
if (strpos($value,'YAMLSeq') !== false) {
$explode[$key] = str_replace('YAMLSeq',$seqs[$i],$value);
++$i;
}
}
}
// Re-add the mappings
if (!empty($maps)) {
$i = 0;
foreach ($explode as $key => $value) {
if (strpos($value,'YAMLMap') !== false) {
$explode[$key] = str_replace('YAMLMap',$maps[$i],$value);
++$i;
}
}
}
// Re-add the strings
if (!empty($saved_strings)) {
$i = 0;
foreach ($explode as $key => $value) {
while (strpos($value,'YAMLString') !== false) {
$explode[$key] = preg_replace('/YAMLString/',$saved_strings[$i],$value, 1);
++$i;
$value = $explode[$key];
}
}
}
return $explode;
}
/**
* Builds the PHP array from all the YAML nodes we've gathered
* @access private
* @return array
*/
private function _buildArray() {
$trunk = array();
if (!isset($this->_indentSort[0])) {
return $trunk;
}
foreach ($this->_indentSort[0] as $n) {
if (empty($n->parent)) {
$this->_nodeArrayizeData($n);
// Check for references and copy the needed data to complete them.
$this->_makeReferences($n);
// Merge our data with the big array we're building
$trunk = $this->_array_kmerge($trunk,$n->data);
}
}
return $trunk;
}
/**
* Traverses node-space and sets references (& and *) accordingly
* @access private
* @return bool
*/
private function _linkReferences() {
if (is_array($this->_haveRefs)) {
foreach ($this->_haveRefs as $node) {
if (!empty($node->data)) {
$key = key($node->data);
// If it's an array, don't check.
if (is_array($node->data[$key])) {
foreach ($node->data[$key] as $k => $v) {
$this->_linkRef($node,$key,$k,$v);
}
} else {
$this->_linkRef($node,$key);
}
}
}
}
return true;
}
function _linkRef(&$n,$key,$k = NULL,$v = NULL) {
if (empty($k) && empty($v)) {
// Look for &refs
if (preg_match('/^&([^ ]+)/',$n->data[$key],$matches)) {
// Flag the node so we know it's a reference
$this->_allNodes[$n->id]->ref = substr($matches[0],1);
$this->_allNodes[$n->id]->data[$key] =
substr($n->data[$key],strlen($matches[0])+1);
// Look for *refs
} elseif (preg_match('/^\*([^ ]+)/',$n->data[$key],$matches)) {
$ref = substr($matches[0],1);
// Flag the node as having a reference
$this->_allNodes[$n->id]->refKey = $ref;
}
} elseif (!empty($k) && !empty($v)) {
if (preg_match('/^&([^ ]+)/',$v,$matches)) {
// Flag the node so we know it's a reference
$this->_allNodes[$n->id]->ref = substr($matches[0],1);
$this->_allNodes[$n->id]->data[$key][$k] =
substr($v,strlen($matches[0])+1);
// Look for *refs
} elseif (preg_match('/^\*([^ ]+)/',$v,$matches)) {
$ref = substr($matches[0],1);
// Flag the node as having a reference
$this->_allNodes[$n->id]->refKey = $ref;
}
}
}
/**
* Finds the children of a node and aids in the building of the PHP array
* @access private
* @param int $nid The id of the node whose children we're gathering
* @return array
*/
private function _gatherChildren($nid) {
$return = array();
$node =& $this->_allNodes[$nid];
if (is_array ($this->_allParent[$node->id])) {
foreach ($this->_allParent[$node->id] as $nodeZ) {
$z =& $this->_allNodes[$nodeZ];
// We found a child
$this->_nodeArrayizeData($z);
// Check for references
$this->_makeReferences($z);
// Merge with the big array we're returning
// The big array being all the data of the children of our parent node
$return = $this->_array_kmerge($return,$z->data);
}
}
return $return;
}
/**
* Turns a node's data and its children's data into a PHP array
*
* @access private
* @param array $node The node which you want to arrayize
* @return boolean
*/
private function _nodeArrayizeData(&$node) {
if (is_array($node->data) && $node->children == true) {
// This node has children, so we need to find them
$childs = $this->_gatherChildren($node->id);
// We've gathered all our children's data and are ready to use it
$key = key($node->data);
$key = empty($key) ? 0 : $key;
// If it's an array, add to it of course
if (isset ($node->data[$key])) {
if (is_array($node->data[$key])) {
$node->data[$key] = $this->_array_kmerge($node->data[$key],$childs);
} else {
$node->data[$key] = $childs;
}
} else {
$node->data[$key] = $childs;
}
} elseif (!is_array($node->data) && $node->children == true) {
// Same as above, find the children of this node
$childs = $this->_gatherChildren($node->id);
$node->data = array();
$node->data[] = $childs;
}
// We edited $node by reference, so just return true
return true;
}
/**
* Traverses node-space and copies references to / from this object.
* @access private
* @param object $z A node whose references we wish to make real
* @return bool
*/
private function _makeReferences(&$z) {
// It is a reference
if (isset($z->ref)) {
$key = key($z->data);
// Copy the data to this object for easy retrieval later
$this->ref[$z->ref] =& $z->data[$key];
// It has a reference
} elseif (isset($z->refKey)) {
if (isset($this->ref[$z->refKey])) {
$key = key($z->data);
// Copy the data from this object to make the node a real reference
$z->data[$key] =& $this->ref[$z->refKey];
}
}
return true;
}
/**
* Merges arrays and maintains numeric keys.
*
* An ever-so-slightly modified version of the array_kmerge() function posted
* to php.net by mail at nospam dot iaindooley dot com on 2004-04-08.
*
* http://us3.php.net/manual/en/function.array-merge.php#41394
*
* @access private
* @param array $arr1
* @param array $arr2
* @return array
*/
private function _array_kmerge($arr1,$arr2) {
if(!is_array($arr1)) $arr1 = array();
if(!is_array($arr2)) $arr2 = array();
$keys = array_merge(array_keys($arr1),array_keys($arr2));
$vals = array_merge(array_values($arr1),array_values($arr2));
$ret = array();
foreach($keys as $key) {
list($unused,$val) = each($vals);
if (isset($ret[$key]) and is_int($key)) $ret[] = $val; else $ret[$key] = $val;
}
return $ret;
} else {
return false;
}
}
/**
* Returns YAML from a key and a value
* @access private
* @return string
* @param $key The name of the key
* @param $value The value of the item
* @param $indent The indent of the current node
*/
private function _dumpNode($key,$value,$indent) {
// do some folding here, for blocks
if (strpos($value,"\n") !== false || strpos($value,": ") !== false || strpos($value,"- ") !== false) {
$value = $this->_doLiteralBlock($value,$indent);
} else {
$value = $this->_doFolding($value,$indent);
}
if (is_bool($value)) {
$value = ($value) ? "true" : "false";
}
$spaces = str_repeat(' ',$indent);
if (is_int($key)) {
// It's a sequence
$string = $spaces.'- '.$value."\n";
} else {
// It's mapped
$string = $spaces.$key.': '.$value."\n";
}
return $string;
}
/**
* Creates a literal block for dumping
* @access private
* @return string
* @param $value
* @param $indent int The value of the indent
*/
private function _doLiteralBlock($value,$indent) {
$exploded = explode("\n",$value);
$newValue = '|';
$indent += $this->_dumpIndent;
$spaces = str_repeat(' ',$indent);
foreach ($exploded as $line) {
$newValue .= "\n" . $spaces . trim($line);
}
return $newValue;
}
/**
* Folds a string of text, if necessary
* @access private
* @return string
* @param $value The string you wish to fold
*/
private function _doFolding($value,$indent) {
// Don't do anything if wordwrap is set to 0
if ($this->_dumpWordWrap === 0) {
return $value;
}
if (strlen($value) > $this->_dumpWordWrap) {
$indent += $this->_dumpIndent;
$indent = str_repeat(' ',$indent);
$wrapped = wordwrap($value,$this->_dumpWordWrap,"\n$indent");
$value = ">\n".$indent.$wrapped;
}
return $value;
}
/* Methods used in loading */
/**
* Finds and returns the indentation of a YAML line
* @access private
* @return int
* @param string $line A line from the YAML file
*/
private function _getIndent($line) {
preg_match('/^\s{1,}/',$line,$match);
if (!empty($match[0])) {
$indent = substr_count($match[0],' ');
} else {
$indent = 0;
}
return $indent;
}
/**
* Parses YAML code and returns an array for a node
* @access private
* @return array
* @param string $line A line from the YAML file
*/
private function _parseLine($line) {
$line = trim($line);
$array = array();
if (preg_match('/^-(.*):$/',$line)) {
// It's a mapped sequence
$key = trim(substr(substr($line,1),0,-1));
$array[$key] = '';
} elseif ($line[0] == '-' && substr($line,0,3) != '---') {
// It's a list item but not a new stream
if (strlen($line) > 1) {
$value = trim(substr($line,1));
// Set the type of the value. Int, string, etc
$value = $this->_toType($value);
$array[] = $value;
} else {
$array[] = array();
}
} elseif (preg_match('/^(.+):/',$line,$key)) {
// It's a key/value pair most likely
// If the key is in double quotes pull it out
if (preg_match('/^(["\'](.*)["\'](\s)*:)/',$line,$matches)) {
$value = trim(str_replace($matches[1],'',$line));
$key = $matches[2];
} else {
// Do some guesswork as to the key and the value
$explode = explode(':',$line);
$key = trim($explode[0]);
array_shift($explode);
$value = trim(implode(':',$explode));
}
// Set the type of the value. Int, string, etc
$value = $this->_toType($value);
if (empty($key)) {
$array[] = $value;
} else {
$array[$key] = $value;
}
}
return $array;
}
/**
* Finds the type of the passed value, returns the value as the new type.
* @access private
* @param string $value
* @return mixed
*/
private function _toType($value) {
if (preg_match('/^("(.*)"|\'(.*)\')/',$value,$matches)) {
$value = (string)preg_replace('/(\'\'|\\\\\')/',"'",end($matches));
$value = preg_replace('/\\\\"/','"',$value);
} elseif (preg_match('/^\\[(.+)\\]$/',$value,$matches)) {
// Inline Sequence
// Take out strings sequences and mappings
$explode = $this->_inlineEscape($matches[1]);
// Propogate value array
$value = array();
foreach ($explode as $v) {
$value[] = $this->_toType($v);
}
} elseif (strpos($value,': ')!==false && !preg_match('/^{(.+)/',$value)) {
// It's a map
$array = explode(': ',$value);
$key = trim($array[0]);
array_shift($array);
$value = trim(implode(': ',$array));
$value = $this->_toType($value);
$value = array($key => $value);
} elseif (preg_match("/{(.+)}$/",$value,$matches)) {
// Inline Mapping
// Take out strings sequences and mappings
$explode = $this->_inlineEscape($matches[1]);
// Propogate value array
$array = array();
foreach ($explode as $v) {
$array = $array + $this->_toType($v);
}
$value = $array;
} elseif (strtolower($value) == 'null' or $value == '' or $value == '~') {
$value = NULL;
} elseif (preg_match ('/^[0-9]+$/', $value)) {
$value = (int)$value;
} elseif (in_array(strtolower($value),
array('true', 'on', '+', 'yes', 'y'))) {
$value = TRUE;
} elseif (in_array(strtolower($value),
array('false', 'off', '-', 'no', 'n'))) {
$value = FALSE;
} elseif (is_numeric($value)) {
$value = (float)$value;
} else {
// Just a normal string, right?
$value = trim(preg_replace('/#(.+)$/','',$value));
}
return $value;
}
/**
* Used in inlines to check for more inlines or quoted strings
* @access private
* @return array
*/
private function _inlineEscape($inline) {
// There's gotta be a cleaner way to do this...
// While pure sequences seem to be nesting just fine,
// pure mappings and mappings with sequences inside can't go very
// deep. This needs to be fixed.
$saved_strings = array();
// Check for strings
$regex = '/(?:(")|(?:\'))((?(1)[^"]+|[^\']+))(?(1)"|\')/';
if (preg_match_all($regex,$inline,$strings)) {
$saved_strings = $strings[0];
$inline = preg_replace($regex,'YAMLString',$inline);
}
unset($regex);
// Check for sequences
if (preg_match_all('/\[(.+)\]/U',$inline,$seqs)) {
$inline = preg_replace('/\[(.+)\]/U','YAMLSeq',$inline);
$seqs = $seqs[0];
}
// Check for mappings
if (preg_match_all('/{(.+)}/U',$inline,$maps)) {
$inline = preg_replace('/{(.+)}/U','YAMLMap',$inline);
$maps = $maps[0];
}
$explode = explode(', ',$inline);
// Re-add the sequences
if (!empty($seqs)) {
$i = 0;
foreach ($explode as $key => $value) {
if (strpos($value,'YAMLSeq') !== false) {
$explode[$key] = str_replace('YAMLSeq',$seqs[$i],$value);
++$i;
}
}
}
// Re-add the mappings
if (!empty($maps)) {
$i = 0;
foreach ($explode as $key => $value) {
if (strpos($value,'YAMLMap') !== false) {
$explode[$key] = str_replace('YAMLMap',$maps[$i],$value);
++$i;
}
}
}
// Re-add the strings
if (!empty($saved_strings)) {
$i = 0;
foreach ($explode as $key => $value) {
while (strpos($value,'YAMLString') !== false) {
$explode[$key] = preg_replace('/YAMLString/',$saved_strings[$i],$value, 1);
++$i;
$value = $explode[$key];
}
}
}
return $explode;
}
/**
* Builds the PHP array from all the YAML nodes we've gathered
* @access private
* @return array
*/
private function _buildArray() {
$trunk = array();
if (!isset($this->_indentSort[0])) {
return $trunk;
}
foreach ($this->_indentSort[0] as $n) {
if (empty($n->parent)) {
$this->_nodeArrayizeData($n);
// Check for references and copy the needed data to complete them.
$this->_makeReferences($n);
// Merge our data with the big array we're building
$trunk = $this->_array_kmerge($trunk,$n->data);
}
}
return $trunk;
}
/**
* Traverses node-space and sets references (& and *) accordingly
* @access private
* @return bool
*/
private function _linkReferences() {
if (is_array($this->_haveRefs)) {
foreach ($this->_haveRefs as $node) {
if (!empty($node->data)) {
$key = key($node->data);
// If it's an array, don't check.
if (is_array($node->data[$key])) {
foreach ($node->data[$key] as $k => $v) {
$this->_linkRef($node,$key,$k,$v);
}
} else {
$this->_linkRef($node,$key);
}
}
}
}
return true;
}
function _linkRef(&$n,$key,$k = NULL,$v = NULL) {
if (empty($k) && empty($v)) {
// Look for &refs
if (preg_match('/^&([^ ]+)/',$n->data[$key],$matches)) {
// Flag the node so we know it's a reference
$this->_allNodes[$n->id]->ref = substr($matches[0],1);
$this->_allNodes[$n->id]->data[$key] =
substr($n->data[$key],strlen($matches[0])+1);
// Look for *refs
} elseif (preg_match('/^\*([^ ]+)/',$n->data[$key],$matches)) {
$ref = substr($matches[0],1);
// Flag the node as having a reference
$this->_allNodes[$n->id]->refKey = $ref;
}
} elseif (!empty($k) && !empty($v)) {
if (preg_match('/^&([^ ]+)/',$v,$matches)) {
// Flag the node so we know it's a reference
$this->_allNodes[$n->id]->ref = substr($matches[0],1);
$this->_allNodes[$n->id]->data[$key][$k] =
substr($v,strlen($matches[0])+1);
// Look for *refs
} elseif (preg_match('/^\*([^ ]+)/',$v,$matches)) {
$ref = substr($matches[0],1);
// Flag the node as having a reference
$this->_allNodes[$n->id]->refKey = $ref;
}
}
}
/**
* Finds the children of a node and aids in the building of the PHP array
* @access private
* @param int $nid The id of the node whose children we're gathering
* @return array
*/
private function _gatherChildren($nid) {
$return = array();
$node =& $this->_allNodes[$nid];
if (is_array ($this->_allParent[$node->id])) {
foreach ($this->_allParent[$node->id] as $nodeZ) {
$z =& $this->_allNodes[$nodeZ];
// We found a child
$this->_nodeArrayizeData($z);
// Check for references
$this->_makeReferences($z);
// Merge with the big array we're returning
// The big array being all the data of the children of our parent node
$return = $this->_array_kmerge($return,$z->data);
}
}
return $return;
}
/**
* Turns a node's data and its children's data into a PHP array
*
* @access private
* @param array $node The node which you want to arrayize
* @return boolean
*/
private function _nodeArrayizeData(&$node) {
if (is_array($node->data) && $node->children == true) {
// This node has children, so we need to find them
$childs = $this->_gatherChildren($node->id);
// We've gathered all our children's data and are ready to use it
$key = key($node->data);
$key = empty($key) ? 0 : $key;
// If it's an array, add to it of course
if (isset ($node->data[$key])) {
if (is_array($node->data[$key])) {
$node->data[$key] = $this->_array_kmerge($node->data[$key],$childs);
} else {
$node->data[$key] = $childs;
}
} else {
$node->data[$key] = $childs;
}
} elseif (!is_array($node->data) && $node->children == true) {
// Same as above, find the children of this node
$childs = $this->_gatherChildren($node->id);
$node->data = array();
$node->data[] = $childs;
}
// We edited $node by reference, so just return true
return true;
}
/**
* Traverses node-space and copies references to / from this object.
* @access private
* @param object $z A node whose references we wish to make real
* @return bool
*/
private function _makeReferences(&$z) {
// It is a reference
if (isset($z->ref)) {
$key = key($z->data);
// Copy the data to this object for easy retrieval later
$this->ref[$z->ref] =& $z->data[$key];
// It has a reference
} elseif (isset($z->refKey)) {
if (isset($this->ref[$z->refKey])) {
$key = key($z->data);
// Copy the data from this object to make the node a real reference
$z->data[$key] =& $this->ref[$z->refKey];
}
}
return true;
}
/**
* Merges arrays and maintains numeric keys.
*
* An ever-so-slightly modified version of the array_kmerge() function posted
* to php.net by mail at nospam dot iaindooley dot com on 2004-04-08.
*
* http://us3.php.net/manual/en/function.array-merge.php
*
* @access private
* @param array $arr1
* @param array $arr2
* @return array
*/
private function _array_kmerge($arr1,$arr2) {
if(!is_array($arr1)) $arr1 = array();
if(!is_array($arr2)) $arr2 = array();
$keys = array_merge(array_keys($arr1),array_keys($arr2));
$vals = array_merge(array_values($arr1),array_values($arr2));
$ret = array();
foreach($keys as $key) {
list($unused,$val) = each($vals);
if (isset($ret[$key]) and is_int($key)) $ret[] = $val; else $ret[$key] = $val;
}
return $ret;
}
}
?>

View File

@ -1,13 +1,24 @@
#!/usr/bin/php5
<?php
/**
* Main file that handles every page request.
* File similar to main.php designed for command-line scripts
*
* This file lets you execute Sapphire requests from the command-line. The URL is passed as the first argument to the scripts.
*
* @package sapphire
* @subpackage core
*/
$_SERVER['HTTP_HOST'] = $_SERVER['argv'][2];
if(isset($_SERVER['argv'][2])) $_SERVER['HTTP_HOST'] = $_SERVER['argv'][2];
$_SERVER['SCRIPT_FILENAME'] = __FILE__;
chdir(dirname($_SERVER['SCRIPT_FILENAME']));
/**
* Include Sapphire's core code
*/
require_once("core/Core.php");
header("Content-type: text/html; charset=\"utf-8\"");
@ -20,13 +31,18 @@ if(function_exists('mb_http_output')) {
if( preg_match( '/(test\.totallydigital\.co\.nz|dev\.totallydigital\.co\.nz\/test)(.*)/', $_SERVER['SCRIPT_FILENAME'], $nameMatch ) ) {
$_SERVER['SCRIPT_NAME'] = $nameMatch[2];
$_SERVER['HTTP_HOST'] = $nameMatch[1];
} elseif( preg_match( '/dev\.totallydigital\.co\.nz(.*)/', $_SERVER['SCRIPT_FILENAME'], $nameMatch ) )
$envType = 'test';
} elseif( preg_match( '/dev\.totallydigital\.co\.nz(.*)/', $_SERVER['SCRIPT_FILENAME'], $nameMatch ) ) {
$_SERVER['SCRIPT_NAME'] = $nameMatch[1];
elseif( preg_match( '/\/sites\/[^\/]+\/www(.*)/', $_SERVER['SCRIPT_FILENAME'], $nameMatch ) )
$envType = 'dev';
} elseif( preg_match( '/\/sites\/[^\/]+\/www(.*)/', $_SERVER['SCRIPT_FILENAME'], $nameMatch ) ) {
$_SERVER['SCRIPT_NAME'] = $nameMatch[1];
elseif( preg_match( '/\/sites\/[^\/]+(.*)/', $_SERVER['SCRIPT_FILENAME'], $nameMatch ) )
$envType = 'live';
} elseif( preg_match( '/\/sites\/[^\/]+(.*)/', $_SERVER['SCRIPT_FILENAME'], $nameMatch ) ) {
$_SERVER['SCRIPT_NAME'] = $nameMatch[1];
elseif(!isset($_SERVER['SCRIPT_NAME'])) {
} elseif(isset($_SERVER['SCRIPT_NAME'])) {
$envType = 'live';
} else {
echo "Error: could not determine server configuration {$_SERVER['SCRIPT_FILENAME']}\n";
exit();
}
@ -37,8 +53,7 @@ if($_REQUEST && get_magic_quotes_gpc()) {
stripslashes_recursively($_REQUEST);
}
if($_REQUEST['trace']) apd_set_pprof_trace();
if(isset($_REQUEST['trace'])) apd_set_pprof_trace();
require_once("core/ManifestBuilder.php");
require_once("core/ClassInfo.php");
@ -57,13 +72,33 @@ foreach($envFiles as $envFile) {
}
}
// Find the URL of this script
if(isset($_FILE_TO_URL_MAPPING)) {
$fullPath = $testPath = $_SERVER['SCRIPT_FILENAME'];
while($testPath && $testPath != "/") {
if(isset($_FILE_TO_URL_MAPPING[$testPath])) {
$url = $_FILE_TO_URL_MAPPING[$testPath] . substr($fullPath,strlen($testPath));
$_SERVER['HTTP_HOST'] = parse_url($url, PHP_URL_HOST);
$_SERVER['SCRIPT_NAME'] = parse_url($url, PHP_URL_PATH);
$_SERVER['REQUEST_PORT'] = parse_url($url, PHP_URL_PORT);
break;
}
$testPath = dirname($testPath);
}
}
if(ManifestBuilder::staleManifest()){
ManifestBuilder::compileManifest();
}
require_once(MANIFEST_FILE);
if($_GET['debugmanifest']) Debug::show(file_get_contents(MANIFEST_FILE));
if(isset($_GET['debugmanifest'])) Debug::show(file_get_contents(MANIFEST_FILE));
if(!isset(Director::$environment_type)) Director::set_environment_type($envType);
// Default director
Director::addRules(10, array(
@ -86,9 +121,14 @@ DB::connect($databaseConfig);
// Get the request URL
// $baseURL = dirname(dirname($_SERVER[SCRIPT_NAME]));
$url = $_GET['url'];
$url = $_SERVER['argv'][1];
if(isset($_SERVER['argv'][2])) {
parse_str($_SERVER['argv'][2], $_GET);
$_REQUEST = $_GET;
print_r($_GET);
}
// Direct away - this is the "main" function, that hands control to the apporopriate controllerx
Director::direct($url);

View File

@ -1,7 +1,15 @@
<?php
/**
* Base class invoked from CLI rather than the webserver (Cron jobs, handling email bounces)
*/
* @package sapphire
* @subpackage cron
*/
/**
* Base class invoked from CLI rather than the webserver (Cron jobs, handling email bounces)
* @package sapphire
* @subpackage cron
*/
abstract class CliController extends Controller {
function init() {
$this->disableBasicAuth();

View File

@ -1,7 +1,14 @@
<?php
/**
* @package sapphire
* @subpackage cron
*/
/**
* Classes that must be run daily extend this class
* @package sapphire
* @subpackage cron
*/
class DailyTask extends ScheduledTask {

View File

@ -1,6 +1,14 @@
<?php
/**
* Executed a task monthly
* @package sapphire
* @subpackage cron
*/
/**
* Classes that must be run monthly extend this class
* @package sapphire
* @subpackage cron
*/
class MonthlyTask extends ScheduledTask {

View File

@ -1,5 +1,15 @@
<?php
/**
* @package sapphire
* @subpackage cron
*/
/**
* Abstract task representing scheudled tasks
* @package sapphire
* @subpackage cron
*/
abstract class ScheduledTask extends CliController {
// this class exists as a logical extension
}

View File

@ -1,4 +1,15 @@
<?php
/**
* @package sapphire
* @subpackage cron
*/
/**
* Classes that must be run weekly extend this class
* @package sapphire
* @subpackage cron
*/
class WeeklyTask extends ScheduledTask {
}

View File

@ -1,22 +1,43 @@
<?php
/**
* Lets you wrap a bunch of array data into a ViewableData object.
* This is useful when you want to pass data to a template in the "SilverStripe 1" way of giving a
* big data array.
* @package sapphire
* @subpackage view
*/
/**
* Lets you wrap a bunch of array data into a {@link ViewableData} object.
*
* Usage:
* <code>
* new ArrayData(array(
* "ClassName" => "Page",
* "AddAction" => "Add a new Page page",
* ));
* </code>
*
* @package sapphire
* @subpackage view
*/
class ArrayData extends ViewableData {
protected $array;
/**
* @param object|array $array Either an object with simple properties or an associative array.
* Converts object-properties to indices of an associative array.
*/
public function __construct($array) {
$this->array = $array;
if(is_object($array)) {
$this->array = self::object_to_array($array);
} elseif(is_array($array) && ArrayLib::is_associative($array)) {
$this->array = $array;
} else {
$this->array = $array;
user_error(
"ArrayData::__construct: Parameter needs to be an object or associative array",
E_USER_WARNING
);
}
}
public function getField($f) {
@ -31,6 +52,24 @@ class ArrayData extends ViewableData {
return isset($this->array[$f]);
}
/**
* Converts an object with simple properties to
* an associative array.
*
* @todo Allow for recursive creation of DataObjectSets when property value is an object/array
*
* @param obj $obj
* @return array
*/
static function object_to_array($obj) {
$arr = array();
foreach($obj as $k=>$v) {
$arr[$k] = $v;
}
return $arr;
}
}
?>

View File

@ -1,5 +1,15 @@
<?php
/**
* @package sapphire
* @subpackage misc
*/
/**
* Library of static methods for manipulating arrays.
* @package sapphire
* @subpackage misc
*/
class ArrayLib extends Object {
static function invert($arr) {
if (! $arr) return false;
@ -57,6 +67,47 @@ class ArrayLib extends Object {
return $arr;
}
/**
* Determines if an array is associative by checking
* for existing keys via array_key_exists().
* @see http://nz.php.net/manual/en/function.is-array.php#76188
*
* @param array $arr
* @return boolean
*/
static function is_associative($arr) {
if(is_array($arr) && ! empty($arr)) {
for($iterator = count($arr) - 1; $iterator; $iterator--) {
if (!array_key_exists($iterator, $arr)) return true;
}
return !array_key_exists(0, $arr);
}
return false;
}
/**
* Recursively searches an array $haystack for the value(s) $needle.
* Assumes that all values in $needle (if $needle is an array) are at
* the SAME level, not spread across multiple dimensions of the $haystack.
*
* @param mixed $needle
* @param array $haystack
* @param boolean $strict
* @return boolean
*/
static function in_array_recursive($needle, $haystack, $strict = false) {
if(!is_array($haystack)) return false; // Not an array, we've gone as far as we can down this branch
if(in_array($needle, $haystack, $strict)) return true; // Is it in this level of the array?
else {
foreach($haystack as $obj) { // It's not, loop over the rest of this array
if(self::in_array_recursive($needle, $obj, $strict)) return true;
}
}
return false; // Never found $needle :(
}
}
?>

View File

@ -1,8 +1,17 @@
<?php
/**
* @package sapphire
* @subpackage core
*/
/**
* Provides introspection information about the class tree.
* It's a cached wrapper around the built-in class functions. Sapphire uses class introspection heavily
* and without the caching it creates an unfortunate performance hit.
*
* @package sapphire
* @subpackage core
*/
class ClassInfo {
/**
@ -10,7 +19,7 @@ class ClassInfo {
*/
static function ready() {
global $_ALL_CLASSES;
return $_ALL_CLASSES && isset($_ALL_CLASSES['hastable']) && $_ALL_CLASSES['hastable'];
return $_ALL_CLASSES && $_ALL_CLASSES['hastable'];
}
static function allClasses() {
global $_ALL_CLASSES;
@ -102,30 +111,12 @@ class ClassInfo {
}
/**
* Return all the class names implementing the given interface.
* Note: this method is slow; if that becomes a problem you may need to reimplement this to cache results in
* the manifest.
* @return array A self-keyed array of class names
* @return array A self-keyed array of class names. Note that this is only available with Silverstripe
* classes and not built-in PHP classes.
*/
protected static $implementors_of = array();
static function implementorsOf($interfaceName) {
if(array_key_exists($interfaceName, self::$implementors_of)) return self::$implementors_of[$interfaceName];
$matchingClasses = array();
$classes = self::allClasses();
foreach($classes as $potentialClass) {
if(class_exists($potentialClass)) {
$refl = new ReflectionClass($potentialClass);
if($refl->implementsInterface($interfaceName)) {
$matchingClasses[$potentialClass] = $potentialClass;
}
}
}
self::$implementors_of[$interfaceName] = $matchingClasses;
return $matchingClasses;
global $_ALL_CLASSES;
return (isset($_ALL_CLASSES['implementors'][$interfaceName])) ? $_ALL_CLASSES['implementors'][$interfaceName] : false;
}
}
?>

View File

@ -1,5 +1,10 @@
<?php
/**
* @package sapphire
* @subpackage misc
*/
/**
* Library of conversion functions, implemented as static methods.
*
@ -14,6 +19,13 @@
*
* html: HTML source suitable for use in a page or email
* text: Plain-text content, suitable for display to a user as-is, or insertion in a plaintext email.
*
* Objects of type {@link ViewableData} can have an "escaping type",
* which determines if they are automatically escaped before output by {@link SSViewer}.
*
* @usedby ViewableData::XML_val()
* @package sapphire
* @subpackage misc
*/
class Convert extends Object {
// Convert raw to other formats
@ -59,7 +71,7 @@ class Convert extends Object {
return $val;
} else {
return str_replace(array('"',"\n","\r", "'"), array('\"','\n','\r', "\'"), $val);
return str_replace(array("\\", '"',"\n","\r", "'"), array("\\\\", '\"','\n','\r', "\\'"), $val);
}
}
@ -279,27 +291,40 @@ class Convert extends Object {
*
* @param $val the string you wish to convert
* @return the HTML version of the string
* @deprecated
*/
static function raw2html($val) {
user_error("Convert::raw2html is deprecated. Used Convert::raw2xml instead", E_USER_WARNING);
user_error("Convert::raw2html is deprecated. Used Convert::raw2xml instead", E_USER_NOTICE);
return self::raw2xml($val);
}
/**
* @deprecated
*/
static function html2plain($val){
user_error("html2plain is deprecated. Use xml2raw instead.", E_USER_WARNING);
user_error("html2plain is deprecated. Use xml2raw instead.", E_USER_NOTICE);
return self::html2raw($val);
}
/**
* @deprecated
*/
static function html2text($val, $preserveLinks = false) {
user_error("html2text is deprecated. Use xml2raw instead.", E_USER_WARNING);
user_error("html2text is deprecated. Use xml2raw instead.", E_USER_NOTICE);
return self::html2raw($val);
}
/**
* @deprecated
*/
static function raw2reserveNL($val){
user_error("Convert::raw2reserveNL is deprecated. Used Convert::raw2xml instead", E_USER_WARNING);
user_error("Convert::raw2reserveNL is deprecated. Used Convert::raw2xml instead", E_USER_NOTICE);
return self::raw2xml($val);
}
/**
* @deprecated
*/
static function raw2attr($val) {
user_error("raw2attr is deprecated. Use raw2att instead.", E_USER_WARNING);
return self::raw2att($val);

View File

@ -1,5 +1,15 @@
<?php
/**
* @package sapphire
* @subpackage misc
*/
/**
* A set of static methods for manipulating cookies.
* @package sapphire
* @subpackage misc
*/
class Cookie extends Object {
/**
* Set a cookie variable

View File

@ -1,4 +1,11 @@
<?php
/**
* This file contains several methods that control the core behaviour of Sapphire.
*
* @package sapphire
* @subpackage core
*/
/**
* Returns the temporary folder that sapphire/silverstripe should use for its cache files
* This is loaded into the TEMP_FOLDER define on start up

View File

@ -1,16 +1,31 @@
<?php
/**
* Class of static methods to support debugging.
* @package sapphire
* @subpackage core
*/
/**
* Supports debugging and core error handling via static methods.
*
* @package sapphire
* @subpackage core
*/
class Debug {
/**
* @var $mail_server string Custom mailserver for sending debug mails.
* @var $custom_smtp_server string Custom mailserver for sending mails.
*/
protected static $custom_smtp_server = '';
/**
* @var $send_errors_to string Email address to send error notifications
*/
protected static $send_errors_to;
/**
* @var $send_warnings_to string Email address to send warning notifications
*/
protected static $send_warnings_to;
/**
@ -33,6 +48,10 @@ class Debug {
}
}
/**
* Emails the contents of the output buffer
*/
static function mailBuffer( $email, $subject ) {
mail( $email, $subject, ob_get_contents() );
ob_end_clean();
@ -48,26 +67,34 @@ class Debug {
}
static function text($val) {
if(is_object($val) && $val->hasMethod('debug')) {
return $val->debug();
} else {
if(is_array($val)) {
$result = "<ul>\n";
foreach($val as $k => $v) {
$result .= "<li>$k = " . Debug::text($v) . "</li>\n";
}
$val = $result . "</ul>\n";
} else if (is_object($val)) {
$val = var_export($val, true);
if(is_object($val)) {
if(method_exists($val, 'hasMethod')) {
$hasDebugMethod = $val->hasMethod('debug');
} else {
if(true || !Director::is_ajax()) {
$val = "<pre style=\"font-family: Courier new\">" . htmlentities($val) . "</pre>\n";
}
$hasDebugMethod = method_exists($val, 'debug');
}
if($hasDebugMethod) {
return $val->debug();
}
return $val;
}
if(is_array($val)) {
$result = "<ul>\n";
foreach($val as $k => $v) {
$result .= "<li>$k = " . Debug::text($v) . "</li>\n";
}
$val = $result . "</ul>\n";
} else if (is_object($val)) {
$val = var_export($val, true);
} else {
if(true || !Director::is_ajax()) {
$val = "<pre style=\"font-family: Courier new\">" . htmlentities($val) . "</pre>\n";
}
}
return $val;
}
/**
@ -85,23 +112,27 @@ class Debug {
/**
* Load an error handler
*
* @todo why does this delegate to loadFatalErrorHandler?
*/
static function loadErrorHandlers() {
Debug::loadFatalErrorHandler();
}
/**
* @todo can this be moved into loadErrorHandlers?
*/
static function loadFatalErrorHandler() {
set_error_handler('errorHandler', E_ALL & ~E_NOTICE);
set_error_handler('errorHandler', (E_ALL ^ E_NOTICE) ^ E_USER_NOTICE);
set_exception_handler('exceptionHandler');
}
static function warningHandler($errno, $errstr, $errfile, $errline, $errcontext) {
if(error_reporting() == 0) return;
if(self::$send_warnings_to) self::emailError(self::$send_warnings_to, $errno, $errstr, $errfile, $errline, $errcontext, "Warning");
if(Director::isDev()) {
if(error_reporting() != 0) { // otherwise the error was suppressed with @
self::showError($errno, $errstr, $errfile, $errline, $errcontext);
die();
}
self::showError($errno, $errstr, $errfile, $errline, $errcontext);
}
}
@ -120,14 +151,13 @@ class Debug {
header("HTTP/1.0 500 Internal server error");
if(Director::is_ajax()) {
echo "ERROR:There has been an error";
echo "There has been an error";
} else {
if(file_exists('../assets/error-500.html')) {
echo "ERROR:";
include('../assets/error-500.html');
} else {
echo "ERROR:<h1>Error</h1><p>The website server has not been able to respond to your request.</p>\n";
echo "<h1>Error</h1><p>The website server has not been able to respond to your request.</p>\n";
}
}
}
@ -144,6 +174,7 @@ class Debug {
echo "<p style=\"color: white; background-color: red; margin: 0\">FATAL ERROR: $errstr<br />\n At line $errline in $errfile<br />\n<br />\n</p>\n";
Debug::backtrace();
//Debug::show(debug_backtrace());
echo "<h2>Context</h2>\n";
Debug::show($errcontext);
@ -169,7 +200,10 @@ class Debug {
if(self::$custom_smtp_server) {
ini_set("SMTP", self::$custom_smtp_server);
}
mail($emailAddress, "$errorType on $_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]", $data, "Content-type: text/html\nFrom: errors@silverstripe.com");
$relfile = Director::makeRelative($errfile);
if($relfile[0] == '/') $relfile = substr($relfile,1);
mail($emailAddress, "$errorType at $relfile line $errline (http://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI])", $data, "Content-type: text/html\nFrom: errors@silverstripe.com");
}
/**
@ -214,9 +248,10 @@ class Debug {
/**
* Deprecated. Send live errors and warnings to the given address.
* Use send_errors_to() instead.
* @deprecated Use send_errors_to() instead.
*/
static function sendLiveErrorsTo($emailAddress) {
user_error('Debug::sendLiveErrorsTo() is deprecated. Use Debug::send_errors_to() instead.', E_USER_NOTICE);
if(!Director::isDev()) self::send_errors_to($emailAddress, true);
}
@ -235,11 +270,11 @@ class Debug {
$bt = debug_backtrace();
// Ingore functions that are plumbing of the error handler
$ignoredFunctions = array('Debug::emailError','Debug::warningHandler','Debug::fatalHandler','errorHandler','Debug::showError','Debug::backtrace');
$ignoredFunctions = array('Debug::emailError','Debug::warningHandler','Debug::fatalHandler','errorHandler','Debug::showError','Debug::backtrace', 'exceptionHandler');
while( $bt && in_array(self::full_func_name($bt[0]), $ignoredFunctions) ) {
array_shift($bt);
}
$result = "";
foreach($bt as $item) {
if(Director::is_ajax() && !$ignoreAjax) {
@ -252,9 +287,12 @@ class Debug {
$result .= "</p>\n";
}
}
if($returnVal) return $result;
else echo $result;
if ($returnVal) {
return $result;
} else {
echo $result;
}
}
/**
@ -267,7 +305,16 @@ class Debug {
if(isset($item['function'])) $funcName .= $item['function'];
if($showArgs && isset($item['args'])) {
@$funcName .= "(" . implode(",", (array)$item['args']) .")";
$args = array();
foreach($item['args'] as $arg) {
if(!is_object($arg) || method_exists($arg, '__toString')) {
$args[] = (string) $arg;
} else {
$args[] = get_class($arg);
}
}
$funcName .= "(" . implode(",", $args) .")";
}
return $funcName;
@ -319,6 +366,16 @@ class Debug {
}
}
function exceptionHandler($exception) {
$errno = E_USER_ERROR;
$type = get_class($exception);
$message = "Uncaught " . $type . ": " . $exception->getMessage();
$file = $exception->getFile();
$line = $exception->getLine();
$context = $exception->getTrace();
Debug::fatalHandler($errno, $message, $file, $line, $context);
}
function errorHandler($errno, $errstr, $errfile, $errline, $errcontext) {
switch($errno) {
case E_ERROR:

View File

@ -1,10 +1,27 @@
<?php
define('X_MAILER', 'SilverStripe Mailer - version 2006.06.21 (Sent from "'.$_SERVER['SERVER_NAME'].'")');
/**
* @package sapphire
* @subpackage email
*/
if(isset($_SERVER['SERVER_NAME'])) {
/**
* X-Mailer header value on emails sent
*/
define('X_MAILER', 'SilverStripe Mailer - version 2006.06.21 (Sent from "'.$_SERVER['SERVER_NAME'].'")');
} else {
/**
* @ignore
*/
define('X_MAILER', 'SilverStripe Mailer - version 2006.06.21');
}
// Note: The constant 'BOUNCE_EMAIL' should be defined as a valid email address for where bounces should be returned to.
/**
* Class to support sending emails.
* @package sapphire
* @subpackage email
*/
class Email extends ViewableData {
protected $from, $to, $subject, $body, $plaintext_body, $cc, $bcc;
@ -126,13 +143,21 @@ class Email extends ViewableData {
"From" => $this->from,
"Subject" => $this->subject,
"Body" => $this->body,
"BaseURL" => $this->BaseURL()
"BaseURL" => $this->BaseURL(),
"IsEmail" => true,
));
} else {
return $this;
}
}
/**
* Used by SSViewer templates to detect if we're rendering an email template rather than a page template
*/
public function IsEmail() {
return true;
}
/**
* Load all the template variables into the internal variables, including
* the template into body. Called before send() or debugSend()
@ -350,6 +375,11 @@ class Email extends ViewableData {
}
}
/**
* Implements an email template that can be populated.
* @package sapphire
* @subpackage email
*/
class Email_Template extends Email {
public function __construct() {
}
@ -410,13 +440,13 @@ function htmlEmail($to, $from, $subject, $htmlContent, $attachedFiles = false, $
// Make the plain text part
$headers["Content-Type"] = "text/plain; charset=\"iso-8859-15\"";
$headers["Content-Type"] = "text/plain; charset=\"utf-8\"";
$headers["Content-Transfer-Encoding"] = $plainEncoding ? $plainEncoding : "quoted-printable";
$plainPart = processHeaders($headers, ($plainEncoding == "base64") ? chunk_split(base64_encode($plainContent),60) : wordwrap($plainContent,120));
// Make the HTML part
$headers["Content-Type"] = "text/html; charset=\"iso-8859-15\"";
$headers["Content-Type"] = "text/html; charset=\"utf-8\"";
// Add basic wrapper tags if the body tag hasn't been given
@ -424,7 +454,7 @@ function htmlEmail($to, $from, $subject, $htmlContent, $attachedFiles = false, $
$htmlContent =
"<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\">\n" .
"<HTML><HEAD>\n" .
"<META http-equiv=Content-Type content=\"text/html; charset=iso-8859-15\">\n" .
"<META http-equiv=Content-Type content=\"text/html; charset=utf-8\">\n" .
"<STYLE type=3Dtext/css></STYLE>\n\n".
"</HEAD>\n" .
"<BODY bgColor=#ffffff>\n" .
@ -528,7 +558,7 @@ function plaintextEmail($to, $from, $subject, $plainContent, $attachedFiles, $cu
// Make the plain text part
$headers["Content-Type"] = "text/plain; charset=\"iso-8859-15\"";
$headers["Content-Type"] = "text/plain; charset=\"utf-8\"";
$headers["Content-Transfer-Encoding"] = $plainEncoding ? $plainEncoding : "quoted-printable";
$plainContent = ($plainEncoding == "base64") ? chunk_split(base64_encode($plainContent),60) : QuotedPrintable_encode($plainContent);
@ -633,7 +663,7 @@ function wrapImagesInline($htmlContent) {
// Make the HTML part
$headers["Content-Type"] = "text/html; charset=\"iso-8859-15\"";
$headers["Content-Type"] = "text/html; charset=\"utf-8\"";
$headers["Content-Transfer-Encoding"] = "quoted-printable";
$multiparts[] = processHeaders($headers, QuotedPrintable_encode($replacedContent));
@ -757,7 +787,7 @@ function getMimeType($filename) {
function loadMimeTypes() {
$mimetypePathCustom = '/etc/mime.types';
$mimetypePathGeneric = Director::baseFolder() . '/sapphire/email/mime.types';
$mimeTypes = file_exists($mimetypePathCustom) ? file($mimetypePathCustom) : file($mimetypePathGeneric);
$mimeTypes = file_exists($mimetypePathGeneric) ? file($mimetypePathGeneric) : file($mimetypePathCustom);
foreach($mimeTypes as $typeSpec) {
if(($typeSpec = trim($typeSpec)) && substr($typeSpec,0,1) != "#") {
$parts = split("[ \t\r\n]+", $typeSpec);
@ -777,8 +807,10 @@ function loadMimeTypes() {
}
/**
* Base class that email bounce handlers extend
*/
* Base class that email bounce handlers extend
* @package sapphire
* @subpackage email
*/
class Email_BounceHandler extends Controller {
function init() {
@ -893,6 +925,11 @@ class Email_BounceHandler extends Controller {
}
/**
* Database record for recording a bounced email
* @package sapphire
* @subpackage email
*/
class Email_BounceRecord extends DataObject {
static $db = array(
'BounceEmail' => 'Varchar',
@ -908,6 +945,8 @@ class Email_BounceRecord extends DataObject {
/**
* This class is responsible for ensuring that members who are on it receive NO email
* communication at all. any correspondance is caught before the email is sent.
* @package sapphire
* @subpackage email
*/
class Email_BlackList extends DataObject{
static $db = array(

View File

@ -1,10 +1,17 @@
<?php
/**
* @package sapphire
* @subpackage core
*/
/**
* Add extension that can be added to an object with Object::add_extension().
* For DataObject extensions, use DataObjectDecorator
*
* @package sapphire
* @subpackage core
*/
abstract class Extension extends Object {
/**
* The DataObject that owns this decorator.

View File

@ -1,8 +1,16 @@
<?php
/**
* @package sapphire
* @subpackage misc
*/
/**
* A class with HTTP-related helpers.
* Like Debug, this is more a bundle of methods than a class ;-)
*
* @package sapphire
* @subpackage misc
*/
class HTTP {
@ -35,6 +43,7 @@ class HTTP {
* Turn all relative URLs in the content to absolute URLs
*/
static function absoluteURLs($html) {
$html = str_replace('$CurrentPageURL', $_SERVER['REQUEST_URI'], $html);
return HTTP::urlRewriter($html, '(substr($URL,0,1) == "/") ? ( Director::protocolAndHost() . $URL ) : ( (ereg("^[A-Za-z]+:", $URL)) ? $URL : Director::absoluteBaseURL() . $URL )' );
}

View File

@ -1,36 +1,41 @@
<?php
/**
* ManifestBuilder
*
* @package sapphire
* @subpackage core
*/
/**
* Name of the manifest file
*/
define("MANIFEST_FILE", TEMP_FOLDER . "/manifest" . str_replace(array("/",":", "\\"),"_", $_SERVER['SCRIPT_FILENAME']));
/**
* The ManifestBuilder class generates the manifest file and keeps it fresh.
*
* The manifest file is a PHP include that contains global variables that
* represent the collected contents of the application:
* - all classes
* - all templates
* - all classes ({@link __autoload()})
* - all templates ({@link SSViewer})
* - all _config.php files
*
* Traversing the filesystem to collect this information on everypage.
* This information is cached so that it need not be regenerated on every
* pageview.
*/
/**
* Define a constant for the name of the manifest file
*/
define("MANIFEST_FILE", TEMP_FOLDER . "/manifest" . str_replace(array("/",":", "\\"),"_", $_SERVER['SCRIPT_FILENAME']));
/**
* ManifestBuilder
*
* {@link ManifestBuilder::compileManifest()} is called by {@link main.php}
* whenever {@link ManifestBuilder::staleManifest()} returns true.
*
* The ManifestBuilder class generates the manifest file and keeps it fresh.
* @see main.php, __autoload(), SSViewer, Requirements::themedCSS()
* @package sapphire
* @subpackage core
*/
class ManifestBuilder {
static $restrict_to_modules = array();
static $extendsArray = array();
static $classArray = array();
static $implementsArray = array();
/**
* @var array $ignore_files Full filenames (without directory-path) which
@ -50,12 +55,12 @@ class ManifestBuilder {
* should be ignored by the manifest.
*/
public static $ignore_folders = array(
'mysql',
'assets',
'shortstat',
'mysql',
'assets',
'shortstat',
'HTML',
);
/**
* Returns true if the manifest file should be regenerated
@ -88,9 +93,11 @@ class ManifestBuilder {
// locate and include the exclude files
$topLevel = scandir($baseDir);
foreach($topLevel as $file) {
if($file[0] == '.') continue
$fullPath = $baseDir . '/' . $file;
if(is_dir($fullPath . '/') && file_exists($fullPath . '/_exclude.php'))
if(@is_dir($fullPath . '/') && file_exists($fullPath . '/_exclude.php'))
require_once($fullPath . '/_exclude.php');
}
@ -108,9 +115,10 @@ class ManifestBuilder {
// have an _manifest_exclude file
$topLevel = scandir($baseDir);
foreach($topLevel as $filename) {
if(is_dir("$baseDir/$filename") &&
file_exists("$baseDir/$filename/_config.php") &&
!file_exists("$baseDir/$filename/_manifest_exclude")) {
if($filename[0] == '.') continue;
if(@is_dir("$baseDir/$filename") &&
file_exists("$baseDir/$filename/_config.php") &&
!file_exists("$baseDir/$filename/_manifest_exclude")) {
ManifestBuilder::getClassManifest("$baseDir/$filename",
$classManifest);
}
@ -130,8 +138,9 @@ class ManifestBuilder {
global $databaseConfig;
$topLevel = scandir($baseDir);
foreach($topLevel as $filename) {
if(is_dir("$baseDir/$filename/") &&
file_exists("$baseDir/$filename/_config.php") &&
if($filename[0] == '.') continue;
if(@is_dir("$baseDir/$filename/") &&
file_exists("$baseDir/$filename/_config.php") &&
!file_exists("$baseDir/$filename/_manifest_exclude")) {
$manifest .= "require_once(\"$baseDir/$filename/_config.php\");\n";
// Include this so that we're set up for connecting to the database
@ -150,12 +159,12 @@ class ManifestBuilder {
// Only include directories if they have an _config.php file
$topLevel = scandir($baseDir);
foreach($topLevel as $filename) {
if(substr($filename,0,1) == '.') continue;
if($filename != 'themes' && is_dir("$baseDir/$filename") && file_exists("$baseDir/$filename/_config.php")) {
if($filename[0] == '.') continue;
if($filename != 'themes' && @is_dir("$baseDir/$filename") && file_exists("$baseDir/$filename/_config.php")) {
ManifestBuilder::getTemplateManifest($baseDir, $filename, $templateManifest, $cssManifest);
}
}
// Get themes
if(file_exists("$baseDir/themes")) {
$themeDirs = scandir("$baseDir/themes");
@ -173,12 +182,12 @@ class ManifestBuilder {
$manifest .= "\$_TEMPLATE_MANIFEST = " . var_export($templateManifest, true) . ";\n";
$manifest .= "\$_CSS_MANIFEST = " . var_export($cssManifest, true) . ";\n";
DB::connect($databaseConfig);
// Database manifest
$allClasses = ManifestBuilder::allClasses($classManifest);
$manifest .= "\$_ALL_CLASSES = " . var_export($allClasses, true) . ";\n";
global $_ALL_CLASSES;
$_ALL_CLASSES = $allClasses;
@ -200,34 +209,34 @@ class ManifestBuilder {
* application
*
* @param string $folder The folder to traverse (recursively)
* @pram array $classMap The already built class map
* @param array $classMap The already built class map
*/
private static function getClassManifest($folder, &$classMap) {
$items = scandir($folder);
if($items) foreach($items as $item) {
// Skip some specific PHP files
if(in_array($item, self::$ignore_files)) continue;
// ignore hidden files and folders
if(substr($item,0,1) == '.') continue;
// ignore files without php-extension
if(substr($item,-4) != '.php' && !is_dir("$folder/$item")) continue;
if(substr($item,-4) != '.php' && !@is_dir("$folder/$item")) continue;
// ignore files and folders with underscore-prefix
if(substr($item,0,1) == '_') continue;
// ignore certain directories
if(is_dir("$folder/$item") && in_array($item, self::$ignore_folders)) continue;
// ignore certain directories
if(@is_dir("$folder/$item") && in_array($item, self::$ignore_folders)) continue;
// ignore directories with _manifest_exlude file
if(is_dir("$folder/$item") && file_exists("$folder/$item/_manifest_exclude")) continue;
if(@is_dir("$folder/$item") && file_exists("$folder/$item/_manifest_exclude")) continue;
// i18n: ignore language files (loaded on demand)
if($item == 'lang' && is_dir("$folder/$item") && ereg_replace("/[^/]+/\\.\\.","",$folder.'/..') == Director::baseFolder()) continue;
if(is_dir("$folder/$item")) {
// recurse into directories (if not in $ignore_folders)
if($item == 'lang' && @is_dir("$folder/$item") && ereg_replace("/[^/]+/\\.\\.","",$folder.'/..') == Director::baseFolder()) continue;
if(@is_dir("$folder/$item")) {
// recurse into directories (if not in $ignore_folders)
ManifestBuilder::getClassManifest("$folder/$item", $classMap);
} else {
// include item in the manifest
@ -236,13 +245,13 @@ class ManifestBuilder {
if($classMap && array_key_exists($itemCode, $classMap)) {
$regex = '/class\s' . $itemCode .'/';
if(
preg_match($regex, file_get_contents("$folder/$item"))
preg_match($regex, file_get_contents("$folder/$item"))
&& preg_match($regex, file_get_contents($classMap[$itemCode]))
) {
user_error("Warning: there are two '$itemCode' files both containing the same class: '$folder/$item' and '{$classMap[$itemCode]}'.
user_error("Warning: there are two '$itemCode' files both containing the same class: '$folder/$item' and '{$classMap[$itemCode]}'.
This might mean that the wrong code is being used.", E_USER_WARNING);
} else {
user_error("Warning: there are two '$itemCode' files with the same filename: '$folder/$item' and '{$classMap[$itemCode]}'.
user_error("Warning: there are two '$itemCode' files with the same filename: '$folder/$item' and '{$classMap[$itemCode]}'.
This might mean that the wrong code is being used.", E_USER_NOTICE);
}
} else {
@ -266,11 +275,11 @@ class ManifestBuilder {
$templateName = substr($item, 0, -3);
$templateType = substr($folder,strrpos($folder,'/')+1);
if($templateType == "templates") $templateType = "main";
if($themeName) {
$templateManifest[$templateName]['themes'][$themeName][$templateType] = "$baseDir/$folder/$item";
$templateManifest[$templateName]['themes'][$themeName][$templateType] = "$baseDir/$folder/$item";
} else {
$templateManifest[$templateName][$templateType] = "$baseDir/$folder/$item";
$templateManifest[$templateName][$templateType] = "$baseDir/$folder/$item";
}
} else if(substr($item,-4) == '.css') {
@ -278,13 +287,13 @@ class ManifestBuilder {
// Debug::message($item);
if($themeName) {
$cssManifest[$cssName]['themes'][$themeName] = "$folder/$item";
$cssManifest[$cssName]['themes'][$themeName] = "$folder/$item";
} else {
$cssManifest[$cssName]['unthemed'] = "$folder/$item";
$cssManifest[$cssName]['unthemed'] = "$folder/$item";
}
} else if(is_dir("$baseDir/$folder/$item")) {
} else if(@is_dir("$baseDir/$folder/$item")) {
ManifestBuilder::getTemplateManifest($baseDir, "$folder/$item", $templateManifest, $cssManifest, $themeName);
}
}
@ -305,51 +314,148 @@ class ManifestBuilder {
foreach($classManifest as $file) {
$b = basename($file);
if($b != 'cli-script.php' && $b != 'main.php')
include_once($file);
self::parse_file($file);
}
if(DB::isActive()) {
$tables = DB::getConn()->tableList();
} else {
$tables = array();
$tables = DB::isActive() ? DB::getConn()->tableList() : array();
$allClasses["parents"] = self::find_parents();
$allClasses["children"] = self::find_children();
$allClasses["implementors"] = self::$implementsArray;
foreach(self::$classArray as $class => $info) {
$allClasses['exists'][$class] = $class;
if(isset($tables[strtolower($class)])) $allClasses['hastable'][$class] = $class;
}
$allClasses['hastable'] = array();
// Build a map of classes and their subclasses
$_classes = get_declared_classes();
foreach($_classes as $class) {
$allClasses['exists'][$class] = $class;
if(isset($tables[strtolower($class)]))
$allClasses['hastable'][$class] = $class;
if(isset($tables[strtolower($class)])) $allClasses['hastable'][$class] = $class;
foreach($_classes as $subclass) {
if(is_subclass_of($class, $subclass))
$allClasses['parents'][$class][$subclass] = $subclass;
if(is_subclass_of($subclass, $class))
$allClasses['children'][$class][$subclass] = $subclass;
if(is_subclass_of($class, $subclass)) $allClasses['parents'][$class][$subclass] = $subclass;
if(is_subclass_of($subclass, $class)) $allClasses['children'][$class][$subclass] = $subclass;
}
}
return $allClasses;
}
/**
* Parses a php file and adds any class or interface information into self::$classArray
*
* @param string $filename
*/
private static function parse_file($filename) {
$file = file_get_contents($filename);
$implements = "";
$extends = "";
$class="";
if(!$file) die("Couldn't open $filename<br />");
$classes = array();
$size = preg_match_all('/class (.*)[ \n]*{/m', $file, $classes);
for($i=0; $i < $size; $i++) {
//we have a class
$args = split("implements", $classes[1][$i]);
$implements = isset($args[1]) ? $args[1] : null;
$interfaces = explode(",", $implements);
$args = split("extends", $args[0]);
$extends = trim(isset($args[1]) ? $args[1] : null);
$class = trim($args[0]);
if($extends) self::$extendsArray[$extends][$class] = $class;
foreach($interfaces as $interface) {
self::$implementsArray[$interface][$class] = $class;
}
self::$classArray[$class] = array(
"interfaces" => $interfaces,
"extends" => $extends,
"file" => $filename
);
}
$interfaces = array();
$size = preg_match_all('/interface (.*){/', $file, $interfaces);
for($i=0;$i<$size;$i++) {
$class = trim($interfaces[1][$i]);
self::$classArray[$class] = array(
"interfaces"=>array(),
"extends" => "",
"isinterface"=>true
);
}
}
/**
* Include all files of the class manifest so that that actually *all*
* classes are available
* Moves through self::$classArray and creates an array containing parent data
*
* @return array
*/
static function includeEverything() {
global $_CLASS_MANIFEST;
private static function find_parents() {
$parentArray = array();
foreach(self::$classArray as $class => $info) {
$extendArray = array();
foreach($_CLASS_MANIFEST as $filename) {
if(preg_match('/.*cli-script\.php$/', $filename))
continue;
$parent = $info["extends"];
require_once($filename);
while($parent) {
$extendArray[$parent] = $parent;
$parent = isset(self::$classArray[$parent]["extends"]) ? self::$classArray[$parent]["extends"] : null;
}
$parentArray[$class] = array_reverse($extendArray);
}
return $parentArray;
}
/**
* Iterates through self::$classArray and returns an array with any descendant data
*
* @return array
*/
private static function find_children() {
$childrenArray = array();
foreach(self::$extendsArray as $class => $children) {
$allChildren = $children;
foreach($children as $childName) {
$allChildren = array_merge($allChildren, self::up_children($childName));
}
$childrenArray[$class] = $allChildren;
}
return $childrenArray;
}
/**
* Helper function to find all children of give class
*
* @param string $class
* @return array
*/
private static function get_children($class) {
return isset(self::$extendsArray[$class]) ? self::$extendsArray[$class] : array();
}
/**
* Returns a flat array with all children of a given class
*
* @param string $class
* @param array $results
*/
function up_children($class) {
$children = self::get_Children($class);
$results = $children;
foreach($children as $className) {
$results = array_merge($results, self::up_children($className));
}
return $results;;
}
/**
@ -361,15 +467,15 @@ class ManifestBuilder {
$_ALL_CLASSES['hastable'] = array();
$tables = DB::getConn()->tableList();
// We need to iterate through the full class lists, because the table names come out in lowercase
foreach($_ALL_CLASSES['exists'] as $class) {
if(isset($tables[strtolower($class)])) $_ALL_CLASSES['hastable'][$class] = $class;
}
self::write_manifest();
}
/**
* Write the manifest file, containing the updated values in the applicable globals
*/
@ -379,12 +485,13 @@ class ManifestBuilder {
$manifest = "\$_CLASS_MANIFEST = " . var_export($_CLASS_MANIFEST, true) . ";\n";
// Config manifest
$baseDir = dirname($_SERVER['SCRIPT_FILENAME']) . "/..";
$baseDir = dirname($_SERVER['SCRIPT_FILENAME']) . "/..";
$baseDir = ereg_replace("/[^/]+/\\.\\.","",$baseDir);
$topLevel = scandir($baseDir);
foreach($topLevel as $filename) {
if(is_dir("$baseDir/$filename/") && file_exists("$baseDir/$filename/_config.php")) {
if($filename[0] == '.') continue;
if(@is_dir("$baseDir/$filename/") && file_exists("$baseDir/$filename/_config.php")) {
$manifest .= "require_once(\"$baseDir/$filename/_config.php\");\n";
}
}
@ -394,7 +501,7 @@ class ManifestBuilder {
$manifest .= "\$_ALL_CLASSES = " . var_export($_ALL_CLASSES, true) . ";\n";
$manifest = "<?php\n$manifest\n?>";
if($fh = fopen(MANIFEST_FILE,"w")) {
if($fh = fopen(MANIFEST_FILE,"w")) {
fwrite($fh, $manifest);
fclose($fh);
@ -406,4 +513,4 @@ class ManifestBuilder {
}
?>
?>

View File

@ -1,9 +1,16 @@
<?php
/**
* @package sapphire
* @subpackage core
*/
/**
* Base object that all others should inherit from.
* This object provides a number of helper methods that patch over PHP's deficiencies.
* @package sapphire
* @subpackage core
*/
class Object {
/**
* This DataObjects extensions, eg Versioned.
@ -396,7 +403,7 @@ class Object {
*
* @return DataObjectDecorator The instance of the extension
*/
public function getExtension($name) {
public function extInstance($name) {
return $this->extension_instances[$name];
}
@ -422,6 +429,123 @@ class Object {
),
));
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// CACHE METHODS (added by simon_w (simon -at- simon -dot- geek -dot- nz))
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/**
* Loads a current cache from the filesystem, if it can.
*
* @param string $cachename The name of the cache to load
* @param int $expire The lifetime of the cache in seconds
* @return mixed The data from the cache, or false if the cache wasn't loaded
*/
protected function loadCache($cachename, $expire = 3600) {
$cache_dir = TEMP_FOLDER;
$cache_path = $cache_dir . "/" . $this->sanitiseCachename($cachename);
if((!isset($_GET['flush']) || $_GET['flush']!=1) && (@file_exists($cache_path) && ((@filemtime($cache_path) + $expire) > (time())))) {
return @unserialize(file_get_contents($cache_path));
}
return false;
}
/**
* Saves a cache to the file system
*
* @param string $cachename The name of the cache to save
* @param mixed $data The data to cache
*/
protected function saveCache($cachename, $data) {
$cache_dir = TEMP_FOLDER;
$cache_path = $cache_dir . "/" . $this->sanitiseCachename($cachename);
$fp = @fopen($cache_path, "w+");
if(!$fp) {
return; // Throw an error?
}
@fwrite($fp, @serialize($data));
@fclose($fp);
}
/**
* Makes a cache name safe to use in a file system
*
* @param string $cachename The cache name to sanitise
* @return string the sanitised cache name
*/
protected function sanitiseCachename($cachename) {
// Replace illegal characters with underscores
$cachename = str_replace(array('~', '.', '/', '!', ' ', "\n", "\r", "\t", '\\', ':', '"', '\'', ';'), '_', $cachename);
return $cachename;
}
/**
* Caches the return value of a method.
*
* @param callback $callback The method to cache
* @param int $expire The lifetime of the cache
* @param string|int $id An id for the cache
* @return mixed The cached return of the method
*/
public function cacheToFile($callback, $expire = 3600, $id = false) {
if(!$this->class) {
$this->class = get_class($this);
}
if(!method_exists($this->class, $callback)) {
user_error("Class {$this->class} doesn't have the method $callback.", E_USER_ERROR);
}
$cachename = $this->class . "_" . $callback;
if($id) {
$cachename .= "_" . (string)$id;
}
if(($data = $this->loadCache($cachename, $expire)) !== false) {
return $data;
}
// No cache to use
$data = $this->$callback();
if($data === false) {
// Some problem with function. Didn't give anything to cache. So don't cache it.
return false;
}
$this->saveCache($cachename, $data);
return $data;
}
/**
* Caches the return value of a method. Passes args to the method as well.
*
* @param callback $callback The method to cache
* @param array $args The arguments to pass to the method
* @param int $expire The lifetime of the cache
* @param string|int $id An id for the cache
* @return mixed The cached return of the method
*/
// I know this is almost exactly the same as cacheToFile, but call_user_func_array() is slow.
// Which is why there's two separate functions
public function cacheToFileWithArgs($callback, $args = array(), $expire = 3600, $id = false) {
if(!$this->class) {
$this->class = get_class($this);
}
if(!method_exists($this->class, $callback)) {
user_error("Class {$this->class} doesn't have the method $callback.", E_USER_ERROR);
}
$cachename = $this->class . "_" . $callback;
if($id) {
$cachename .= "_" . (string)$id;
}
if(($data = $this->loadCache($cachename, $expire)) !== false) {
return $data;
}
// No cache to use
$data = call_user_func_array(array($this, $callback), $args);
if($data === false) {
// Some problem with function. Didn't give anything to cache. So don't cache it.
return false;
}
$this->saveCache($cachename, $data);
return $data;
}
}
/**
@ -430,4 +554,3 @@ class Object {
* // ENFORCE STRONG_CREATE
*/
Object::useCustomClass('Datetime','SSDatetime',true);
?>

View File

@ -1,8 +1,15 @@
<?php
/**
* @package sapphire
* @subpackage view
*/
/**
* Requirements tracker, for javascript and css.
* @todo Document the requirements tracker, and discuss it with the others.
* @package sapphire
* @subpackage view
*/
class Requirements {
private static $javascript = array();
@ -11,6 +18,7 @@ class Requirements {
private static $customCSS = array();
private static $customHeadTags = "";
private static $disabled = array();
private static $blocked = array();
/**
* Register the given javascript file as required.
@ -114,7 +122,7 @@ class Requirements {
static function clear($fileOrID = null) {
if($fileOrID) {
foreach(array('javascript','css', 'customScript', 'customCSS') as $type) {
if(Requirements::${$type}[$fileOrID]) {
if(isset(Requirements::${$type}[$fileOrID])) {
Requirements::$disabled[$type][$fileOrID] = Requirements::${$type}[$fileOrID];
unset(Requirements::${$type}[$fileOrID]);
}
@ -132,6 +140,35 @@ class Requirements {
}
}
/**
* Needed to actively prevent the inclusion of a file,
* e.g. when using your own prototype.js.
* Blocking should only be used as an exception, because
* it is hard to trace back. You can just block items with an
* ID, so make sure you add an unique identifier to customCSS() and customScript().
*
* @param string $fileOrID
*/
static function block($fileOrID) {
self::$blocked[$fileOrID] = $fileOrID;
}
/**
* Removes an item from the blocking-list.
* CAUTION: Does not "re-add" any previously blocked elements.
* @param string $fileOrID
*/
static function unblock($fileOrID) {
unset(self::$blocked[$fileOrID]);
}
/**
* Removes all items from the blocking-list.
*/
static function unblock_all() {
self::$blocked = array();
}
/**
* Restore requirements cleared by call to Requirements::clear
*/
@ -154,30 +191,30 @@ class Requirements {
$prefix = "";
$requirements = '';
foreach(Requirements::$javascript as $file => $dummy) {
foreach(array_diff_key(self::$javascript,self::$blocked) as $file => $dummy) {
if(substr($file,0,7) == 'http://' || Director::fileExists($file)) {
$requirements .= "<script type=\"text/javascript\" src=\"$prefix$file\"></script>\n";
}
}
if(Requirements::$customScript) {
if(self::$customScript) {
$requirements .= "<script type=\"text/javascript\">\n//<![CDATA[\n";
foreach(Requirements::$customScript as $script) {
foreach(array_diff_key(self::$customScript,self::$blocked) as $script) {
$requirements .= "$script\n";
}
$requirements .= "\n//]]>\n</script>\n";
}
foreach(Requirements::$css as $file => $params) {
foreach(array_diff_key(self::$css,self::$blocked) as $file => $params) {
if(Director::fileExists($file)) {
$media = (isset($params['media'])) ? " media=\"{$params['media']}\"" : "";
$requirements .= "<link rel=\"stylesheet\" type=\"text/css\"{$media} href=\"$prefix$file\" />\n";
}
}
foreach(Requirements::$customCSS as $css) {
foreach(array_diff_key(self::$customCSS,self::$blocked) as $css) {
$requirements .= "<style type=\"text/css\">\n$css\n</style>\n";
}
$requirements .= Requirements::$customHeadTags;
$requirements .= self::$customHeadTags;
if(isset($_GET['debug_profile'])) Profiler::unmark("Requirements::includeInHTML");
return eregi_replace("(</head[^>]*>)", $requirements . "\\1", $content);

View File

@ -1,5 +1,10 @@
<?php
/**
* @package sapphire
* @subpackage view
*/
/**
* The SSViewer executes a .ss template file.
* The SSViewer class handles rendering of .ss templates. In addition to a full template in
@ -9,6 +14,8 @@
* Compiled templates are cached. If you put ?flush=1 on your URL, it will force the template to be recompiled. This
* is a hack; the system should really detect when a page needs re-fetching.
* @todo Fix the broken caching.
* @package sapphire
* @subpackage view
*/
class SSViewer extends Object {
private $chosenTemplates;
@ -286,6 +293,10 @@ class SSViewer extends Object {
ereg('.*[\/](.*)',$template,$path);
$content = ereg_replace('<' . '% +_t\((\'([^\']*)\'|"([^"]*)")(([^)]|\)[^ ]|\) +[^% ])*)\) +%' . '>', '<?= _t(\''. $path[1] . '.\\2\\3\'\\4) ?>', $content);
// i18n - sprintf => "sprintf(_t(...),$argument)"
// CAUTION: No spaces allowed between arguments!
$content = ereg_replace('<' . '% +sprintf\(_t\((\'([^\']*)\'|"([^"]*)")(([^)]|\)[^ ]|\) +[^% ])*)\),\<\?= +([^\?]*) +\?\>) +%' . '>', '<?= sprintf(_t(\''. $path[1] . '.\\2\\3\'\\4),\\6) ?>', $content);
// </base> isnt valid html? !?
$content = ereg_replace('<' . '% +base_tag +%' . '>', '<base href="<?= Director::absoluteBaseURL(); ?>" />', $content);
@ -324,7 +335,11 @@ class SSViewer extends Object {
}
}
/**
* Special SSViewer that will process a template passed as a string, rather than a filename.
* @package sapphire
* @subpackage view
*/
class SSViewer_FromString extends SSViewer {
protected $content;

View File

@ -1,5 +1,10 @@
<?php
/**
* @package sapphire
* @subpackage control
*/
/**
* Handles all manipulation of the session.
*
@ -12,14 +17,8 @@
*
* The instance object is basically just a way of manipulating a set of nested maps, and isn't specific to session data.
* This class is currently really basic and could do with a more well-thought-out implementation
*
* $session->myVar = 'XYZ' would be fine, as would Session::data->myVar. What about the equivalent
* of Session::get('member.abc')? Are the explicit accessor methods acceptable? Do we need a
* broader spectrum of functions, such as Session::inc("cart.$productID", 2)? And what should
* Session::get("cart") then return? An array?
*
* @todo Decide whether this class is really necessary, and if so, overhaul it. Perhaps use
* __set() and __get() on an instance, rather than static functions?
* @package sapphire
* @subpackage control
*/
class Session {
public static function set($name, $val) {
@ -45,6 +44,7 @@ class Session {
* Session data
*/
protected $data = array();
protected $changedData = array();
/**
* Create a new session object, with the given starting data
@ -61,12 +61,15 @@ class Session {
// We still want to do this even if we have strict path checking for legacy code
$var = &$this->data;
$diffVar = &$this->changedData;
foreach($names as $n) {
$var = &$var[$n];
$diffVar = &$diffVar[$n];
}
$var = $val;
$diffVar = $val;
}
public function inst_addToArray($name, $val) {
@ -74,12 +77,15 @@ class Session {
// We still want to do this even if we have strict path checking for legacy code
$var = &$this->data;
$diffVar = &$this->changedData;
foreach($names as $n) {
$var = &$var[$n];
$diffVar = &$diffVar[$n];
}
$var[] = $val;
$diffVar[sizeof($var)-1] = $val;
}
public function inst_get($name) {
@ -106,25 +112,43 @@ class Session {
// We still want to do this even if we have strict path checking for legacy code
$var = &$this->data;
$diffVar = &$this->changedData;
foreach($names as $n) {
$var = &$var[$n];
$diffVar = &$diffVar[$n];
}
$var = null;
$diffVar = null;
}
public function inst_getAll() {
return $this->data;
}
/**
* Save data to session
* Only save the changes, so that anyone manipulating $_SESSION directly doesn't get burned.
*/
public function inst_save() {
// Save the updated session back
foreach($this->data as $k => $v) {
$_SESSION[$k] = $v;
}
$this->recursivelyApply($this->changedData, $_SESSION);
}
/**
* Recursively apply the changes represented in $data to $dest.
* Used to update $_SESSION
*/
protected function recursivelyApply($data, &$dest) {
foreach($data as $k => $v) {
if(is_array($v)) {
if(!isset($dest[$k])) $dest[$k] = array();
$this->recursivelyApply($v, $dest[$k]);
} else {
$dest[$k] = $v;
}
}
}
/**
* Sets the appropriate form message in session, with type. This will be shown once,

View File

@ -2,7 +2,7 @@
/**
* @package sapphire
* @subpackage core
* @subpackage view
*/
/**
@ -15,6 +15,8 @@
*
* ViewableData cover page controls, controllers, and data objects. It's the basic unit of
* data exchange. More specifically, it's anything that can be put into a view.
* @package sapphire
* @subpackage view
*/
class ViewableData extends Object implements Iterator {
/**
@ -268,6 +270,20 @@ class ViewableData extends Object implements Iterator {
}
}
/**
* Return the string-format type for the given field.
*
* @usedby ViewableData::XML_val()
* @param string $fieldName
* @return string 'xml'|'raw'
*/
function escapeTypeForField($fieldName) {
$helperPair = $this->castingHelperPair($fieldName);
$castedClass = $helperPair['className'];
if(!$castedClass || $castedClass == 'HTMLText' || $castedClass == 'HTMLVarchar') return "xml";
else return "raw";
}
/**
* Return the object version of the given field/method.
* @param string $fieldName The name of the field/method.
@ -401,18 +417,8 @@ class ViewableData extends Object implements Iterator {
Profiler::mark('casting cost');
}
$helperPair = $this->castingHelperPair($fieldName);
$castedClass = $helperPair['className'];
// Note: these probably shouldn't be hard-coded. But right now it's not a problem, and I don't
// want to over-engineer
if(!$castedClass || $castedClass == 'HTMLText' || $castedClass == 'HTMLVarchar' || $castedClass == 'Text') {
// Case 2: the value is already XML-safe, just return it
} else {
// Case 3: the value is raw and must be made XML-safe
$val = Convert::raw2xml($val);
}
// Case 2: Check if the value is raw and must be made XML-safe
if($this->escapeTypeForField($fieldName) != 'xml') $val = Convert::raw2xml($val);
if(isset($_GET['debug_profile'])) {
Profiler::unmark('casting cost');
@ -681,6 +687,22 @@ class ViewableData extends Object implements Iterator {
function CurrentMember() {
return Member::currentUser();
}
/**
* Returns the Security ID.
* This is used to prevent CRSF attacks in forms.
* @return int
*/
function SecurityID() {
if(Session::get('SecurityID')) {
$securityID = Session::get('SecurityID');
} else {
$securityID = rand();
Session::set('SecurityID', $securityID);
}
return $securityID;
}
/**
* Checks if the current user has the given permission.
@ -740,6 +762,16 @@ class ViewableData extends Object implements Iterator {
return Director::absoluteBaseURL();
}
/**
* When rendering some objects it is necessary to iterate over the object being rendered, to
* do this, you need access to itself.
*
* @return ViewableData
*/
function Me() {
return $this;
}
/**
* Return a Debugger object.
* This is set up like so that you can put $Debug.Content into your template to get debugging
@ -857,7 +889,9 @@ class ViewableData extends Object implements Iterator {
* Object-casting information for class methods
* @var mixed
*/
public static $casting = null;
public static $casting = array(
'BaseHref' => 'Varchar'
);
/**
* Keep a record of the parent node of this data node.
@ -875,6 +909,8 @@ class ViewableData extends Object implements Iterator {
/**
* A ViewableData object that has been customised with extra data. Use
* ViewableData->customise() to create.
* @package sapphire
* @subpackage view
*/
class ViewableData_Customised extends ViewableData {
public function castingHelperPair($field) {
@ -981,6 +1017,8 @@ class ViewableData_Customised extends ViewableData {
/**
* A ViewableData object that has been customised with an extra object. Use
* ViewableData->customise() to create.
* @package sapphire
* @subpackage view
*/
class ViewableData_ObjectCustomised extends ViewableData {
function __construct($obj, $extraObj) {
@ -1050,6 +1088,8 @@ class ViewableData_ObjectCustomised extends ViewableData {
/**
* Debugger helper.
* @package sapphire
* @subpackage view
* @todo Finish this off
*/
class ViewableData_Debugger extends ViewableData {

View File

@ -1,4 +1,10 @@
<?php
/**
* @package sapphire
* @subpackage control
*/
/**
* The most common kind if controller; effectively a controller linked to a {@link DataObject}.
*
@ -12,6 +18,9 @@
*
* Subclasses of ContentController are generally instantiated by ModelAsController; this will create
* a controller based on the URLSegment action variable, by looking in the SiteTree table.
*
* @package sapphire
* @subpackage control
*/
class ContentController extends Controller {
protected $dataRecord;
@ -154,20 +163,6 @@ class ContentController extends Controller {
return new DataObjectSet($visible);
}
/**
* Returns the page in the current page stack of the given level.
* Level(1) will return the main menu item that we're currently inside, etc.
*/
public function Level($level) {
$parent = $this->data();
$stack = array($parent);
while($parent = $parent->Parent) {
array_unshift($stack, $parent);
}
return isset($stack[$level-1]) ? $stack[$level-1] : null;
}
public function Menu($level) {
return $this->getMenu($level);
@ -237,17 +232,17 @@ JS
$archiveLink = "<a class=\"current\">Archived Site</a>";
$liveLink = "<a href=\"$thisPage?stage=Live\" target=\"site\" style=\"left : -3px;\">Published Site</a>";
$stageLink = "<a href=\"$thisPage?stage=Stage\" target=\"site\" style=\"left : -1px;\">Draft Site</a>";
$message = "<div id=\"SilverStripeNavigatorMessage\">Archived site from<br>" . $dateObj->Nice() . "</div>";
$message = "<div id=\"SilverStripeNavigatorMessage\" title=\"Note: this message won't be shown to your visitors\">Archived site from<br>" . $dateObj->Nice() . "</div>";
} else if(Versioned::current_stage() == 'Stage') {
$stageLink = "<a class=\"current\">Draft Site</a>";
$liveLink = "<a href=\"$thisPage?stage=Live\" target=\"site\" style=\"left : -3px;\">Published Site</a>";
$message = "<div id=\"SilverStripeNavigatorMessage\">DRAFT SITE</div>";
$message = "<div id=\"SilverStripeNavigatorMessage\" title=\"Note: this message won't be shown to your visitors\">DRAFT SITE</div>";
} else {
$liveLink = "<a class=\"current\">Published Site</a>";
$stageLink = "<a href=\"$thisPage?stage=Stage\" target=\"site\" style=\"left : -1px;\">Draft Site</a>";
$message = "<div id=\"SilverStripeNavigatorMessage\">PUBLISHED SITE</div>";
$message = "<div id=\"SilverStripeNavigatorMessage\" title=\"Note: this message won't be shown to your visitors\">PUBLISHED SITE</div>";
}
if($member) {

View File

@ -1,8 +1,14 @@
<?php
/**
* @package sapphire
* @subpackage control
*/
/**
* The content negotiator performs text/html or application/xhtml+xml switching.
* It does this through the static function ContentNegotiator::process()
* @package sapphire
* @subpackage control
*/
class ContentNegotiator {
protected static $encoding = 'utf-8';
@ -38,20 +44,27 @@ class ContentNegotiator {
$chosenFormat = $_GET['forceFormat'];
} else {
foreach($mimes as $format => $mime) {
$regExp = '/' . str_replace(array('+','/'),array('\+','\/'), $mime) . '(;q=(\d+\.\d+))?/i';
if (preg_match($regExp, $_SERVER['HTTP_ACCEPT'], $matches)) {
$preference = isset($matches[2]) ? $matches[2] : 1;
if(!isset($q[$preference])) $q[$preference] = $format;
}
}
if($q) {
// Get the preferred format
krsort($q);
$chosenFormat = reset($q);
// The W3C validator doesn't send an HTTP_ACCEPT header, but it can support xhtml. We put this special case in here so that
// designers don't get worried that their templates are HTML4.
if(isset($_SERVER['HTTP_USER_AGENT']) && substr($_SERVER['HTTP_USER_AGENT'], 0, 14) == 'W3C_Validator/') {
$chosenFormat = "xhtml";
} else {
$chosenFormat = "html";
foreach($mimes as $format => $mime) {
$regExp = '/' . str_replace(array('+','/'),array('\+','\/'), $mime) . '(;q=(\d+\.\d+))?/i';
if (isset($_SERVER['HTTP_ACCEPT']) && preg_match($regExp, $_SERVER['HTTP_ACCEPT'], $matches)) {
$preference = isset($matches[2]) ? $matches[2] : 1;
if(!isset($q[$preference])) $q[$preference] = $format;
}
}
if($q) {
// Get the preferred format
krsort($q);
$chosenFormat = reset($q);
} else {
$chosenFormat = "html";
}
}
}

View File

@ -1,5 +1,10 @@
<?php
/**
* @package sapphire
* @subpackage control
*/
/**
* Base controller class.
* Controllers are the cornerstone of all site functionality in Sapphire. The {@link Director}
@ -7,9 +12,26 @@
* the appropriate action - either by calling the action method, or displaying the action's template.
*
* See {@link getTemplate()} for information on how the template is chosen.
* @package sapphire
* @subpackage control
*/
class Controller extends ViewableData {
/**
* Define a list of actions that are allowed to be called on this controller.
* The variable should be an array of action names. This sample shows the different values that it can contain:
*
* <code>
* array(
* 'someaction', // someaction can be accessed by anyone, any time
* 'otheraction' => true, // So can otheraction
* 'restrictedaction' => 'ADMIN', // restrictedaction can only be people with ADMIN privilege
* 'complexaction' '->canComplexAction' // complexaction can only be accessed if $this->canComplexAction() returns true
* );
* </code>
*/
static $allowed_actions = null;
protected $urlParams;
protected $requestParams;
@ -39,7 +61,7 @@ class Controller extends ViewableData {
}
/**
* @return
* @return array The parameters extracted from the URL by the {@link Director}.
*/
function getURLParams() {
return $this->urlParams;
@ -54,11 +76,32 @@ class Controller extends ViewableData {
}
/**
* Executes this controller, and return an {@link HTTPResponse} object with the result.
*
* This method first does a few set-up activities:
* - Push this controller ont to the controller stack - see {@link Controller::curr()} for information about this.
* - Call {@link init()}
*
* Then it looks for the action method. The action is taken from $this->urlParams['Action'] - for this reason, it's important
* to have $Action included in your Director rule
*
* If $requestParams['executeForm'] is set, then the Controller assumes that we're processing a form. This is usually
* set by adding ?executeForm=XXX to the form's action URL. Form processing differs in the following ways:
* - The action name will be the name of the button clicked. If no button-click can be detected, the first button in the
* list will be assumed.
* - If the given action method doesn't exist on the controller, Controller will look for that method on the Form object.
* this lets developers package both a form and its action handlers in a single subclass of Form.
*
* NOTE: You should rarely need to overload run() - this kind of change is only really appropriate for things like nested
* controllers - {@link ModelAsController} and {@link RootURLController} are two examples here. If you want to make more
* orthodox functionality, it's better to overload {@link init()} or {@link index()}.
*
*
*
* Execute the appropriate action handler. If none is given, use defaultAction to display
* a template. The default action will be appropriate in most cases where displaying data
* is the core goal; the Viewer can call methods on the controller to get the data it needs.
*
* @param array $urlParams named parameters extracted from the URL, including Action.
* @param array $requestParams GET and POST variables.
* @return HTTPResponse The response that this controller produces, including HTTP headers such as redirection info
*/
@ -70,7 +113,13 @@ class Controller extends ViewableData {
$this->response = new HTTPResponse();
$this->requestParams = $requestParams;
$this->action = isset($this->urlParams['Action']) ? str_replace("-","_",$this->urlParams['Action']) : "index";
$this->action = isset($this->urlParams['Action']) ? strtolower(str_replace("-","_",$this->urlParams['Action'])) : "";
if(!$this->action) $this->action = 'index';
// Check security on the controller
if(!$this->checkAccessAction($this->action)) {
user_error("Disallowed action: '$this->action' on controller '$this->class'", E_USER_ERROR);
}
// Init
$this->baseInitCalled = false;
@ -113,6 +162,7 @@ class Controller extends ViewableData {
// Create the form object
$form = $formController;
$formObjParts = explode('.', $this->requestParams['executeForm']);
foreach($formObjParts as $formMethod){
if(isset($_GET['debug_profile'])) Profiler::mark("Calling $formMethod", "on $form->class");
@ -121,6 +171,7 @@ class Controller extends ViewableData {
if(!$form) break; //user_error("Form method '" . $this->requestParams['executeForm'] . "' returns null in controller class '$this->class' ($_SERVER[REQUEST_URI])", E_USER_ERROR);
}
// Populate the form
if(isset($_GET['debug_profile'])) Profiler::mark("Controller", "populate form");
if($form){
@ -309,10 +360,11 @@ class Controller extends ViewableData {
}
/**
* Deprecated - use Controller::curr() instead
* @deprecated use Controller::curr() instead
* @returns Controller
*/
public static function currentController() {
user_error('Controller::currentController() is deprecated. Use Controller::curr() instead.', E_USER_NOTICE);
return self::curr();
}
@ -431,6 +483,10 @@ class Controller extends ViewableData {
* Handle redirection
*/
function redirect($url) {
if($this->response->getHeader('Location')) {
user_error("Already directed to " . $this->response->getHeader('Location') . "; now trying to direct to $url", E_USER_ERROR);
}
// Attach site-root to relative links, if they have a slash in them
if($url == "" || $url[0] == '?' || (substr($url,0,4) != "http" && $url[0] != "/" && strpos($url,'/') !== false)){
$url = Director::baseURL() . $url;
@ -473,6 +529,45 @@ class Controller extends ViewableData {
);
}
/**
* Check thAT
*/
function checkAccessAction($action) {
// Collate self::$allowed_actions from this class and all parent classes
$access = null;
$className = $this->class;
while($className != 'Controller') {
// Merge any non-null parts onto $access.
$accessPart = eval("return $className::\$allowed_actions;");
if($accessPart !== null) $access = array_merge((array)$access, $accessPart);
// Build an array of parts for checking if part[0] == part[1], which means that this class doesn't directly define it.
$accessParts[] = $accessPart;
$className = get_parent_class($className);
}
if($access === null || $accessParts[0] === $accessParts[1]) {
// user_error("Deprecated: please define static \$allowed_actions on your Controllers for security purposes", E_USER_NOTICE);
return true;
}
if($action == 'index') return true;
if(isset($access[$action])) {
$test = $access[$action];
if($test === true) return true;
if(substr($test,0,2) == '->') {
$funcName = substr($test,2);
return $this->$funcName();
}
if(Permission::check($test)) return true;
} else if((($key = array_search($action, $access)) !== false) && is_numeric($key)) {
return true;
}
return false;
}
}
?>

View File

@ -1,11 +1,21 @@
<?php
/**
* Director is responsible for processing the URL
* Director is the first step in the "execution pipeline". It parses the URL, matching it to
* one of a number of patterns, and determines the controller, action and any argument to be
* used. It then runs the controller, which will finally run the viewer and/or perform processing
* steps.
* @package sapphire
* @subpackage control
*/
/**
* Director is responsible for processing URLs, and providing environment information.
*
* The most important part of director is {@link Director::direct()}, which is passed a URL and will execute the appropriate
* controller.
*
* Director also has a number of static methods that provide information about the environment, such as {@link Director::set_environment_type()}.
*
* @package sapphire
* @subpackage control
* @see Director::direct(),Director::addRules(),Director::set_environment_type()
*/
class Director {
@ -53,26 +63,44 @@ class Director {
/**
* Add new rules
* Add URL matching rules to the Director.
*
* The director is responsible for turning URLs into Controller objects. It does thi
*
* @param $priority The priority of the rules; higher values will get your rule checked first.
* We recommend priority 100 for your site's rules. The built-in rules are priority 10, standard modules are priority 50.
*/
static function addRules($priority, $rules) {
Director::$rules[$priority] = isset(Director::$rules[$priority]) ? array_merge($rules, (array)Director::$rules[$priority]) : $rules;
}
/**
* Process the given URL, creating the appropriate controller and executing it
* Process the given URL, creating the appropriate controller and executing it.
*
* This method will:
* - iterate over all of the rules given in {@link Director::addRules()}, and find the first one that matches.
* - instantiate the {@link Controller} object required by that rule, and call {@link Controller::setURLParams()} to give the URL paramters to the controller.
* - link the Controller's session to PHP's main session, using {@link Controller::setSession()}.
* - call {@link Controller::run()} on that controller
* - save the Controller's session back into PHP's main session.
* - output the response to the browser, using {@link HTTPResponse::output()}.
*
* @param $url String, the URL the user is visiting, without the querystring.
* @uses getControllerForURL() rule-lookup logic is handled by this.
* @uses Controller::run() Controller::run() handles the page logic for a Director::direct() call.
*/
function direct($url) {
if(isset($_GET['debug_profile'])) Profiler::mark("Director","direct");
$controllerObj = Director::getControllerForURL($url);
// Load the session into the controller
$controllerObj->setSession(new Session($_SESSION));
if(is_string($controllerObj) && substr($controllerObj,0,9) == 'redirect:') {
Director::redirect(substr($controllerObj, 9));
$response = new HTTPResponse();
$response->redirect(substr($controllerObj, 9));
$response->output();
} else if($controllerObj) {
// Load the session into the controller
$controllerObj->setSession(new Session($_SESSION));
$response = $controllerObj->run(array_merge((array)$_GET, (array)$_POST, (array)$_FILES));
@ -88,9 +116,16 @@ class Director {
/**
* Test a URL request, returning a response object.
*
* This method is the counterpart of Director::direct() that is used in functional testing. It will execute the URL given,
*
* @param $url The URL to visit
* @param $post The $_POST & $_FILES variables
* @param $session The {@link Session} object representing the current session.
* @param $session The {@link Session} object representing the current session. By passing the same object to multiple
* calls of Director::test(), you can simulate a peristed session.
*
* @uses getControllerForURL() The rule-lookup logic is handled by this.
* @uses Controller::run() Controller::run() handles the page logic for a Director::direct() call.
*/
function test($url, $post = null, $session = null) {
$getVars = array();
@ -240,7 +275,7 @@ class Director {
* @return string If redirect() has been called, it will return the URL redirected to. Otherwise, it will return null;
*/
static function redirected_to() {
Controller::curr()->redirectedTo();
return Controller::curr()->redirectedTo();
}
/**
@ -328,7 +363,7 @@ class Director {
}
static function getAbsURL($url) {
return Director::baseURL() . '/' . $url;
return Director::baseURL() . $url;
}
static function getAbsFile($file) {
@ -401,12 +436,18 @@ class Director {
}
/**
* Returns true if this script is being run from the command line rather than the webserver.
*
* @return boolean
*/
public static function is_cli() {
return preg_match('/cli-script\.php/', $_SERVER['SCRIPT_NAME']);
}
////////////////////////////////////////////////////////////////////////////////////////////
// Site mode methods
////////////////////////////////////////////////////////////////////////////////////////////
/**
* Sets the site mode (if it is the public site or the cms),
* and runs registered modules.
@ -439,17 +480,35 @@ class Director {
self::$callbacks[$mode][] = $function;
}
static function set_dev_servers($servers) {
Director::$dev_servers = $servers;
}
static function set_test_servers($servers) {
Director::$test_servers = $servers;
}
////////////////////////////////////////////////////////////////////////////////////////////
// Environment type methods
////////////////////////////////////////////////////////////////////////////////////////////
/**
* Force the environment type to be dev, test or live.
* This will affect the results of isLive, isDev, and isTest
* Set the environment type of the current site.
*
* Typically, a SilverStripe site have a number of environments:
* - development environments, such a copy on your local machine.
* - test sites, such as the one you show the client before going live.
* - the live site itself.
*
* The behaviour of these environments often varies slightly. For example, development sites may have errors dumped to the screen,
* and order confirmation emails might be sent to the developer instead of the client.
*
* To help with this, Sapphire support the notion of an environment type. The environment type can be dev, test, or live.
*
* You can set it explicitly with Director::set_environment_tpye(). Or you can use {@link Director::set_dev_servers()} and {@link Director::set_test_servers()}
* to set it implicitly, based on the value of $_SERVER['HTTP_HOST']. If the HTTP_HOST value is one of the servers listed, then
* the environment type will be test or dev. Otherwise, the environment type will be live.
*
* Dev mode can also be forced by putting ?isDev=1 in your URL, which will ask you to log in and then push the site into dev
* mode for the remainder of the session. Putting ?isDev=0 onto the URL can turn it back.
* Generally speaking, these methods will be called from your _config.php file.
*
* Once the environment type is set, it can be checked with {@link Director::isDev()}, {@link Director::isTest()}, and
* {@link Director::isLive()}.
*
* @param $et string The environment type: dev, test, or live.
*/
static function set_environment_type($et) {
if($et != 'dev' && $et != 'test' && $et != 'live') {
@ -459,10 +518,36 @@ class Director {
}
}
/**
* Specify HTTP_HOST values that are development environments.
* For information about environment types, see {@link Director::set_environment_type()}.
* @param $servers array An array of HTTP_HOST values that should be treated as development environments.
*/
static function set_dev_servers($servers) {
Director::$dev_servers = $servers;
}
/**
* Specify HTTP_HOST values that are test environments.
* For information about environment types, see {@link Director::set_environment_type()}.
* @param $servers array An array of HTTP_HOST values that should be treated as test environments.
*/
static function set_test_servers($servers) {
Director::$test_servers = $servers;
}
/*
* This function will return true if the site is in a live environment.
* For information about environment types, see {@link Director::set_environment_type()}.
*/
static function isLive() {
return !(Director::isDev() || Director::isTest());
}
/**
* This function will return true if the site is in a development environment.
* For information about environment types, see {@link Director::set_environment_type()}.
*/
static function isDev() {
if(self::$environment_type) return self::$environment_type == 'dev';
@ -491,6 +576,10 @@ class Director {
return false;
}
/**
* This function will return true if the site is in a test environment.
* For information about environment types, see {@link Director::set_environment_type()}.
*/
static function isTest() {
if(self::$environment_type) {
return self::$environment_type == 'test';
@ -505,11 +594,28 @@ class Director {
}
/**
* @todo These functions are deprecated, let's use isLive isDev and isTest instead.
* @deprecated use isDev() instead
*/
function isDevMode() { return self::isDev(); }
function isTestMode() { return self::isTest(); }
function isLiveMode() { return self::isLive(); }
function isDevMode() {
user_error('Director::isDevMode() is deprecated. Use Director::isDev() instead.', E_USER_NOTICE);
return self::isDev();
}
/**
* @deprecated use isTest() instead
*/
function isTestMode() {
user_error('Director::isTestMode() is deprecated. Use Director::isTest() instead.', E_USER_NOTICE);
return self::isTest();
}
/**
* @deprecated use isLive() instead
*/
function isLiveMode() {
user_error('Director::isLiveMode() is deprecated. Use Director::isLive() instead.', E_USER_NOTICE);
return self::isLive();
}
}

View File

@ -1,4 +1,10 @@
<?php
/**
* @package forms
* @subpackage core
*/
/**
* This class collects all output that needs to be returned after an Form-Request to the client. It automatically determines
* if it needs to send back javascript after an Ajax-Request or just redirect to another page (on a normal request).
@ -19,8 +25,11 @@
* - Please DON'T escape literal parameters which are passed to FormResponse, they are escaped automatically.
* - Some functions assume a {LeftAndMain}-based environment (e.g. load_form())
*
* TODO Force a specific execution order ($forceTop, $forceBottom)
* TODO Extension to return different formats, e.g. JSON or XML
* @todo Force a specific execution order ($forceTop, $forceBottom)Ω
* @todo Extension to return different formats, e.g. JSON or XML
*
* @package forms
* @subpackage core
*/
class FormResponse {
@ -98,7 +107,7 @@ class FormResponse {
*
* @param $scriptContent string
*
* TODO Should this content be escaped?
* @todo Should this content be escaped?
*/
static function add($scriptContent, $uniquenessID = null) {
if(isset($uniquenessID)) {
@ -210,7 +219,7 @@ class FormResponse {
* @param $replaceMethod string Method for replacing - either 'replace' (=outerHTML) or 'update' (=innerHTML)
* (Caution: "outerHTML" might cause problems on the client-side, e.g. on table-tags)
*
* TODO More fancy replacing with loading-wheel etc.
* @todo More fancy replacing with loading-wheel etc.
*/
static function update_dom_id($domID, $domContent, $reapplyBehaviour = true, $replaceMethod = 'replace', $uniquenessID = null) {
//self::$non_ajax_content = $domContent;

View File

@ -1,7 +1,15 @@
<?php
/**
* @package sapphire
* @subpackage control
*/
/**
* Represenets an HTTPResponse returned by a controller.
*
* @package sapphire
* @subpackage control
*/
class HTTPResponse extends Object {
protected static $status_codes = array(

View File

@ -1,9 +1,16 @@
<?php
/**
* @package sapphire
* @subpackage control
*/
/**
* ModelAsController will hand over all control to the appopriate model object
* It uses URLSegment to determine the right object. Also, if (ModelClass)_Controller exists,
* that controller will be used instead. It should be a subclass of ContentController.
*
* @package sapphire
*/
class ModelAsController extends Controller implements NestedController {

View File

@ -1,5 +1,17 @@
<?php
/**
* @package sapphire
* @subpackage control
*/
/**
* Interface that is implemented by controllers that are designed to hand control over to another controller.
* ModelAsController, which selects up a SiteTree object and passes control over to a suitable subclass of ContentController, is a good
* example of this.
* @package sapphire
* @subpackage control
*/
interface NestedController {
public function getNestedController();

View File

@ -1,7 +1,15 @@
<?php
/**
* This controller handles what happens when you visit the root URL
* @package sapphire
* @subpackage control
*/
/**
* This controller handles what happens when you visit the root URL.
*
* @package sapphire
* @subpackage control
*/
class RootURLController extends Controller {
protected static $is_at_root = false;

View File

@ -1,5 +1,10 @@
<?php
/**
* @package sapphire
* @subpackage misc
*/
/**
* Base-class for storage and retrieval of translated entities.
* Most common use is translation of the CMS-interface through the _t()-method
@ -21,8 +26,9 @@
* Please see the {Translatable} DataObjectDecorator for managing translations of database-content.
*
* @author Bernat Foj Capell <bernat@silverstripe.com>
* @package sapphire
* @subpackage misc
*/
class i18n extends Controller {
/**
@ -304,6 +310,7 @@ class i18n extends Controller {
'lah_PK' => 'Lahnda (Pakistan)',
'lb_LU' => 'Luxembourgish (Luxembourg)',
'lbe_RU' => 'Lak (Russia)',
'lc_XX' => 'LOLCAT',
'lez_RU' => 'Lezghian (Russia)',
'lg_UG' => 'Ganda (Uganda)',
'lij_IT' => 'Ligurian (Italy)',
@ -349,8 +356,8 @@ class i18n extends Controller {
'my_MM' => 'Burmese (Myanmar)',
'myv_RU' => 'Erzya (Russia)',
'na_NR' => 'Nauru (Nauru)',
'nb_NO' => 'Norwegian Bokm<EFBFBD>l (Norway)',
'nb_SJ' => 'Norwegian Bokm<EFBFBD>l (Svalbard and Jan Mayen)',
'nb_NO' => 'Norwegian Bokmal (Norway)',
'nb_SJ' => 'Norwegian Bokmal (Svalbard and Jan Mayen)',
'nd_ZW' => 'North Ndebele (Zimbabwe)',
'ndc_MZ' => 'Ndau (Mozambique)',
'ne_NP' => 'Nepali (Nepal)',
@ -838,6 +845,9 @@ class i18n extends Controller {
}
}
// sort by title (not locale)
asort($locales);
return $locales;
}
@ -923,14 +933,15 @@ class i18n extends Controller {
protected static function get_owner_module($name) {
if (substr($name,-3) == '.ss') {
global $_TEMPLATE_MANIFEST;
$path = current($_TEMPLATE_MANIFEST[substr($name,0,-3)]);
ereg(Director::baseFolder() . '/([^/]+)/',$path,$module);
$path = str_replace('\\','/',Director::makeRelative(current($_TEMPLATE_MANIFEST[substr($name,0,-3)])));
ereg('/([^/]+)/',$path,$module);
} else {
global $_CLASS_MANIFEST;
$path = $_CLASS_MANIFEST[$name];
ereg(Director::baseFolder() . '/([^/]+)/',$path,$module);
if(strpos($name,'_') !== false) $name = strtok($name,'_');
$path = str_replace('\\','/',Director::makeRelative($_CLASS_MANIFEST[$name]));
ereg('/([^/]+)/', $path, $module);
}
return $module[1];
return ($module) ? $module[1] : false;
}
@ -1242,13 +1253,18 @@ class i18n extends Controller {
*/
static function include_by_class($class) {
$module = self::get_owner_module($class);
if(!$module) user_error("i18n::include_by_class: Class {$class} not found", E_USER_WARNING);
if (file_exists($file = Director::getAbsFile("$module/lang/". self::get_locale() . '.php'))) {
include_once($file);
} else if (self::get_locale() != 'en_US') {
$old = self::get_locale();
self::set_locale('en_US');
self::include_by_class($class);
} else {
user_error("Locale file $file should exist", E_USER_WARNING);
self::set_locale($old);
} else if(file_exists(Director::getAbsFile("$module/lang"))) {
user_error("i18n::include_by_class: Locale file $file should exist", E_USER_WARNING);
}
}

View File

@ -1,13 +1,14 @@
<?php
/**
* @package sapphire
* @subpackage core
* @subpackage model
*/
/**
* This is a special kind of DataObjectSet used to represent the items linked to in a 1-many or many-many
* join. It provides add and remove methods that will update the database.
* @package sapphire
* @subpackage model
*/
class ComponentSet extends DataObjectSet {
/**
@ -88,9 +89,8 @@ class ComponentSet extends DataObjectSet {
}
if(is_object($item)) {
// TODO Should this allow subclasses?
if($item->class != $this->childClass) {
user_error("ComponentSet::add() Tried to add an '{$item->class}' object, but '{$this->childClass}' expected", E_USER_ERROR);
if(!is_a($item, $this->childClass)) {
user_error("ComponentSet::add() Tried to add an '{$item->class}' object, but a '{$this->childClass}' object expected", E_USER_ERROR);
}
} else {
$id = $item;
@ -195,8 +195,8 @@ class ComponentSet extends DataObjectSet {
*/
function remove($item) {
if(is_object($item)) {
if($item->class != $this->childClass && !is_subclass_of($item, $this->childClass)) {
user_error("ComponentSet::remove() Tried to remove an '{$item->class}' object, but '{$this->childClass}' expected", E_USER_ERROR);
if(!is_a($item, $this->childClass)) {
user_error("ComponentSet::remove() Tried to remove an '{$item->class}' object, but a '{$this->childClass}' object expected", E_USER_ERROR);
}
} else {
$item = DataObject::get_by_id($this->childClass, $item);

View File

@ -1,12 +1,12 @@
<?php
/**
* @package sapphire
* @subpackage core
* @package cms
*/
/**
* This interface lets us set up objects that will tell us what the current page is.
* @package cms
*/
interface CurrentPageIdentifier {
/**

View File

@ -2,12 +2,14 @@
/**
* @package sapphire
* @subpackage core
* @subpackage model
*/
/**
* Global database interface, complete with static methods.
* Use this class for interacting with the database.
* @package sapphire
* @subpackage model
*/
class DB {
/**
@ -29,8 +31,6 @@ class DB {
* @var Database $globalConn
*/
static function setConn($globalConn) {
Debug::message("setConn called");
Debug::backtrace();
DB::$globalConn = $globalConn;
}
@ -49,31 +49,15 @@ class DB {
* @param array $database A map of options. The 'type' is the name of the subclass of Database to use. For the rest of the options, see the specific class.
*/
static function connect($databaseConfig) {
echo 'db:connect:<pre>';
print_r($databaseConfig);
echo '</pre>';
//At this point, the database 'type' value should be the class name we want to instantiate.
//This class that gets called will create a value in the parameters array called pdo_type which
//is the name of the driver we want to use (ie, pgsql).
if(!isset($databaseConfig['type']) || empty($databaseConfig['type'])) {
user_error("DB::connect: Not passed a valid database config", E_USER_ERROR);
}
//if($databaseConfig['type']=='pdo'){
// $conn = new PDODatabase($databaseConfig);
//} else {
$dbClass = $databaseConfig['type'];
echo 'creating a ' . $dbClass . ' instance!<br>';
//This will shoot off to the PostgreSQLDatabase class...
$conn = new $dbClass($databaseConfig);
//}
/*if (isset($databaseConfig['pdo']) && $databaseConfig['pdo']) { // TODO:pkrenn_remove
if (isset($databaseConfig['pdo']) && $databaseConfig['pdo']) { // TODO:pkrenn_remove
$conn = new PDODatabase($databaseConfig);
} else { // TODO:pkrenn_remove begin
$dbClass = $databaseConfig['type'];
$conn = new $dbClass($databaseConfig);
} // TODO:pkrenn_remove end*/
} // TODO:pkrenn_remove end
DB::setConn($conn);
}
@ -83,7 +67,6 @@ class DB {
* @return string $connect The connection string.
**/
public function getConnect($parameters) {
echo 'the DB:$globalConn value is ' . DB::$globalConn . '<br>';
return DB::$globalConn->getConnect($parameters);
}

View File

@ -2,13 +2,15 @@
/**
* @package sapphire
* @subpackage core
* @subpackage model
*/
/**
* A single database record & abstract class for the data-access-model.
* @package sapphire
* @subpackage model
*/
class DataObject extends Controller {
class DataObject extends ViewableData implements DataObjectInterface {
/**
* Data stored in this objects database record. An array indexed
* by fieldname.
@ -93,7 +95,7 @@ class DataObject extends Controller {
parent::__construct();
// Must be called after parent constructor
if(!$isSingleton && !$this->record['ID']) {
if(!$isSingleton && (!isset($this->record['ID']) || !$this->record['ID'])) {
$this->populateDefaults();
}
@ -113,13 +115,10 @@ class DataObject extends Controller {
/**
* Create a duplicate of this node.
*
* @param $doWrite Perform a write() operation before returning the object. If this is true, it will create the duplicate in the database.
*
* @return DataObject A duplicate of this node. The exact type will be the type of this node.
* Caution: Doesn't duplicate relations.
*
* @return DataObject
* @param $doWrite Perform a write() operation before returning the object. If this is true, it will create the duplicate in the database.
* @return DataObject A duplicate of this node. The exact type will be the type of this node.
*/
function duplicate($doWrite = true) {
$className = $this->class;
@ -232,6 +231,27 @@ class DataObject extends Controller {
return $name;
}
/**
* Get the translated user friendly singular name of this DataObject
* same as singular_name() but runs it through the translating function
*
* NOTE:
* It uses as default text if no translation found the $add_action when
* defined or else the default text is singular_name()
*
* Translating string is in the form:
* $this->class.SINGULARNAME
* Example:
* Page.SINGULARNAME
*
* @return string User friendly translated singular name of this DataObject
*/
function i18n_singular_name()
{
$name = (!empty($this->add_action)) ? $this->add_action : $this->singular_name();
return _t($this->class.'.SINGULARNAME', $name);
}
/**
* Get the user friendly plural name of this DataObject
* If the name is not defined (by renaming $plural_name in the subclass),
@ -251,6 +271,22 @@ class DataObject extends Controller {
}
}
/**
* Get the translated user friendly plural name of this DataObject
* Same as plural_name but runs it through the translation function
* Translation string is in the form:
* $this->class.PLURALNAME
* Example:
* Page.PLURALNAME
*
* @return string User friendly translated plural name of this DataObject
*/
function i18n_plural_name()
{
$name = $this->plural_name();
return _t($this->class.'.PLURALNAME', $name);
}
/**
* Returns the associated database record - in this case, the object itself.
* This is included so that you can call $dataOrController->data() and get a DataObject all the time.
@ -472,6 +508,7 @@ class DataObject extends Controller {
public function write($showDebug = false, $forceInsert = false, $forceWrite = false) {
$firstWrite = false;
$this->brokenOnWrite = true;
$isNewRecord = false;
$this->onBeforeWrite();
if($this->brokenOnWrite) {
user_error("$this->class has a broken onBeforeWrite() function. Make sure that you call parent::onBeforeWrite().", E_USER_ERROR);
@ -493,93 +530,96 @@ class DataObject extends Controller {
}
// No changes made
if(!$this->changed) {
return $this->record['ID'];
}
foreach($this->getClassAncestry() as $ancestor) {
if(ClassInfo::hasTable($ancestor))
$ancestry[] = $ancestor;
}
// Look for some changes to make
unset($this->changed['ID']);
$hasChanges = false;
foreach($this->changed as $fieldName => $changed) {
if($changed) {
$hasChanges = true;
break;
}
}
if($hasChanges || $forceWrite || !$this->record['ID']) {
// New records have their insert into the base data table done first, so that they can pass the
// generated primary key on to the rest of the manipulation
if(!$this->record['ID'] && isset($ancestry[0])) {
$baseTable = $ancestry[0];
DB::query("INSERT INTO `{$baseTable}` SET Created = NOW()");
$this->record['ID'] = DB::getGeneratedID($baseTable);
$this->changed['ID'] = 2;
$isNewRecord = true;
if($this->changed) {
foreach($this->getClassAncestry() as $ancestor) {
if(ClassInfo::hasTable($ancestor))
$ancestry[] = $ancestor;
}
// Divvy up field saving into a number of database manipulations
if(isset($ancestry) && is_array($ancestry)) {
foreach($ancestry as $idx => $class) {
$classSingleton = singleton($class);
foreach($this->record as $fieldName => $value) {
if(isset($this->changed[$fieldName]) && $this->changed[$fieldName] && $fieldType = $classSingleton->fieldExists($fieldName)) {
$manipulation[$class]['fields'][$fieldName] = $value ? ("'" . addslashes($value) . "'") : singleton($fieldType)->nullValue();
}
}
// Look for some changes to make
unset($this->changed['ID']);
// Add the class name to the base object
if($idx == 0) {
$manipulation[$class]['fields']["LastEdited"] = "now()";
if($dbCommand == 'insert') {
$manipulation[$class]['fields']["Created"] = "now()";
//echo "<li>$this->class - " .get_class($this);
$manipulation[$class]['fields']["ClassName"] = "'$this->class'";
}
}
// In cases where there are no fields, this 'stub' will get picked up on
if(ClassInfo::hasTable($class)) {
$manipulation[$class]['command'] = $dbCommand;
$manipulation[$class]['id'] = $this->record['ID'];
} else {
unset($manipulation[$class]);
}
$hasChanges = false;
foreach($this->changed as $fieldName => $changed) {
if($changed) {
$hasChanges = true;
break;
}
}
if($hasChanges || $forceWrite || !$this->record['ID']) {
// New records have their insert into the base data table done first, so that they can pass the
// generated primary key on to the rest of the manipulation
if(!$this->record['ID'] && isset($ancestry[0])) {
$baseTable = $ancestry[0];
$this->extend('augmentWrite', $manipulation);
// New records have their insert into the base data table done first, so that they can pass the
// generated ID on to the rest of the manipulation
if(isset($isNewRecord) && $isNewRecord && isset($manipulation[$baseTable])) {
$manipulation[$baseTable]['command'] = 'update';
}
DB::manipulate($manipulation);
DB::query("INSERT INTO `{$baseTable}` SET Created = NOW()");
$this->record['ID'] = DB::getGeneratedID($baseTable);
$this->changed['ID'] = 2;
if(isset($isNewRecord) && $isNewRecord) {
DataObjectLog::addedObject($this);
} else {
DataObjectLog::changedObject($this);
$isNewRecord = true;
}
// Divvy up field saving into a number of database manipulations
if(isset($ancestry) && is_array($ancestry)) {
foreach($ancestry as $idx => $class) {
$classSingleton = singleton($class);
foreach($this->record as $fieldName => $value) {
if(isset($this->changed[$fieldName]) && $this->changed[$fieldName] && $fieldType = $classSingleton->fieldExists($fieldName)) {
$manipulation[$class]['fields'][$fieldName] = $value ? ("'" . addslashes($value) . "'") : singleton($fieldType)->nullValue();
}
}
// Add the class name to the base object
if($idx == 0) {
$manipulation[$class]['fields']["LastEdited"] = "now()";
if($dbCommand == 'insert') {
$manipulation[$class]['fields']["Created"] = "now()";
//echo "<li>$this->class - " .get_class($this);
$manipulation[$class]['fields']["ClassName"] = "'$this->class'";
}
}
// In cases where there are no fields, this 'stub' will get picked up on
if(ClassInfo::hasTable($class)) {
$manipulation[$class]['command'] = $dbCommand;
$manipulation[$class]['id'] = $this->record['ID'];
} else {
unset($manipulation[$class]);
}
}
}
$this->extend('augmentWrite', $manipulation);
// New records have their insert into the base data table done first, so that they can pass the
// generated ID on to the rest of the manipulation
if(isset($isNewRecord) && $isNewRecord && isset($manipulation[$baseTable])) {
$manipulation[$baseTable]['command'] = 'update';
}
DB::manipulate($manipulation);
if(isset($isNewRecord) && $isNewRecord) {
DataObjectLog::addedObject($this);
} else {
DataObjectLog::changedObject($this);
}
$this->changed = null;
} elseif ( $showDebug ) {
echo "<b>Debug:</b> no changes for DataObject<br />";
}
$this->changed = null;
} elseif ( $showDebug ) {
echo "<b>Debug:</b> no changes for DataObject<br />";
// Clears the cache for this object so get_one returns the correct object.
$this->flushCache();
if(!isset($this->record['Created'])) {
$this->record['Created'] = date('Y-m-d H:i:s');
}
$this->record['LastEdited'] = date('Y-m-d H:i:s');
}
// Clears the cache for this object so get_one returns the correct object.
$this->flushCache();
// Write ComponentSets as necessary
if($this->components) {
foreach($this->components as $component) {
@ -587,11 +627,6 @@ class DataObject extends Controller {
}
}
if(!isset($this->record['Created'])) {
$this->record['Created'] = date('Y-m-d H:i:s');
}
$this->record['LastEdited'] = date('Y-m-d H:i:s');
return $this->record['ID'];
}
@ -730,39 +765,42 @@ class DataObject extends Controller {
* @param string $sort A sort expression to be inserted into the ORDER BY clause. If omitted, the static field $default_sort on the component class will be used.
* @param string $join A single join clause. This can be used for filtering, only 1 instance of each DataObject will be returned.
* @param string $limit A limit expression to be inserted into the LIMIT clause
* @param string $having A filter to be inserted into the HAVING clause
*
* @return ComponentSet The components of the one-to-many relationship.
*/
public function getComponents($componentName, $filter = "", $sort = "", $join = "", $limit = "", $having = "") {
$sum = md5("{$filter}_{$sort}_{$join}_{$limit}_{$having}");
if(isset($this->componentCache[$componentName . '_' . $sum]) && false != $this->componentCache[$componentName . '_' . $sum]) {
return $this->componentCache[$componentName . '_' . $sum];
}
public function getComponents($componentName, $filter = "", $sort = "", $join = "", $limit = "") {
$result = null;
$sum = md5("{$filter}_{$sort}_{$join}_{$limit}");
if(isset($this->componentCache[$componentName . '_' . $sum]) && false != $this->componentCache[$componentName . '_' . $sum]) {
return $this->componentCache[$componentName . '_' . $sum];
}
if(!$componentClass = $this->has_many($componentName)) {
user_error("DataObject::getComponents(): Unknown 1-to-many component '$componentName' on class '$this->class'", E_USER_ERROR);
}
$componentObj = singleton($componentClass);
$id = $this->getField("ID");
$joinField = $this->getComponentJoinField($componentName);
// get filter
$combinedFilter = "$joinField = '$id'";
if($filter) $combinedFilter .= " AND {$filter}";
$result = $componentObj->instance_get($combinedFilter, $sort, $join, $limit, "ComponentSet", $having);
if(!$result) {
$result = new ComponentSet();
if($this->isInDB()) { //Check to see whether we should query the db
$componentObj = singleton($componentClass);
$id = $this->getField("ID");
// get filter
$combinedFilter = "$joinField = '$id'";
if($filter) $combinedFilter .= " AND {$filter}";
$result = $componentObj->instance_get($combinedFilter, $sort, $join, $limit, "ComponentSet");
}
$result->setComponentInfo("1-to-many", $this, null, null, $componentClass, $joinField);
// If this record isn't in the database, then we want to hold onto this specific ComponentSet,
// because it's the only copy of the data that we have.
if(!$this->isInDB()) {
if(!$result) {
// If this record isn't in the database, then we want to hold onto this specific ComponentSet,
// because it's the only copy of the data that we have.
$result = new ComponentSet();
$this->setComponent($componentName . '_' . $sum, $result);
}
$result->setComponentInfo("1-to-many", $this, null, null, $componentClass, $joinField);
return $result;
}
@ -821,10 +859,13 @@ class DataObject extends Controller {
* @param string $componentName Name of the many-many component
* @return ComponentSet The set of components
*
* TODO Implement query-params
* @todo Implement query-params
*/
public function getManyManyComponents($componentName, $filter = "", $sort = "", $join = "", $limit = "", $having = "") {
if(isset($this->components[$componentName])) return $this->components[$componentName];
public function getManyManyComponents($componentName, $filter = "", $sort = "", $join = "", $limit = "") {
$sum = md5("{$filter}_{$sort}_{$join}_{$limit}");
if(isset($this->componentCache[$componentName . '_' . $sum]) && false != $this->componentCache[$componentName . '_' . $sum]) {
return $this->componentCache[$componentName . '_' . $sum];
}
list($parentClass, $componentClass, $parentField, $componentField, $table) = $this->many_many($componentName);
@ -840,8 +881,7 @@ class DataObject extends Controller {
"`$table`.$parentField = $this->ID", // filter
$sort,
$limit,
"INNER JOIN `$table` ON `$table`.$componentField = `$componentBaseClass`.ID", // join
$having // having
"INNER JOIN `$table` ON `$table`.$componentField = `$componentBaseClass`.ID" // join
);
array_unshift($query->select, "`$table`.*");
@ -859,7 +899,12 @@ class DataObject extends Controller {
$result = new ComponentSet();
}
$result->setComponentInfo("many-to-many", $this, $parentClass, $table, $componentClass);
$this->components[$componentName] = $result;
// If this record isn't in the database, then we want to hold onto this specific ComponentSet,
// because it's the only copy of the data that we have.
if(!$this->isInDB()) {
$this->setComponent($componentName . '_' . $sum, $result);
}
return $result;
}
@ -1335,9 +1380,32 @@ class DataObject extends Controller {
}
$baseClass = array_shift($tableClasses);
$select = array("`$baseClass`.*");
// If sort contains a function call, let's move the sort clause into a separate selected field.
// Some versions of MySQL choke if you have a group function referenced directly in the ORDER BY
if($sort && strpos($sort,'(') !== false) {
// Sort can be "Col1 DESC|ASC, Col2 DESC|ASC", we need to handle that
$sortParts = explode(",", $sort);
foreach($sortParts as $i => $sortPart) {
$sortPart = trim($sortPart);
if(substr(strtolower($sortPart),-5) == ' desc') {
$select[] = substr($sortPart,0,-5) . " AS _SortColumn{$i}";
$newSorts[] = "_SortColumn{$i} DESC";
} else if(substr(strtolower($sortPart),-4) == ' asc') {
$select[] = substr($sortPart,0,-4) . " AS _SortColumn{$i}";
$newSorts[] = "_SortColumn{$i} ASC";
} else {
$select[] = "$sortPart AS _SortColumn{$i}";
$newSorts[] = "_SortColumn{$i} ASC";
}
}
$sort = implode(", ", $newSorts);
}
// Build our intial query
$query = new SQLQuery(array("`$baseClass`.*"), "`$baseClass`", $filter, $sort);
$query = new SQLQuery($select, "`$baseClass`", $filter, $sort);
// Join all the tables
if($tableClasses) {
@ -1401,7 +1469,10 @@ class DataObject extends Controller {
}
/**
* Get a bunch of fields in a list - a <ul> of <li><b>name:</b> value</li>
* Get a bunch of fields in an HTML LI, like this:
* - name: value
* - name: value
* - name: value
*
* @return string The fields as an HTML unordered list
*/
@ -1424,12 +1495,11 @@ class DataObject extends Controller {
* @param string $join A single join clause. This can be used for filtering, only 1 instance of each DataObject will be returned.
* @param string $limit A limit expression to be inserted into the LIMIT clause.
* @param string $containerClass The container class to return the results in.
* @param string $having A filter to be inserted into the HAVING clause.
*
* @return mixed The objects matching the filter, in the class specified by $containerClass
*/
public static function get($callerClass, $filter = "", $sort = "", $join = "", $limit = "", $containerClass = "DataObjectSet", $having = "") {
return singleton($callerClass)->instance_get($filter, $sort, $join, $limit, $containerClass, $having);
public static function get($callerClass, $filter = "", $sort = "", $join = "", $limit = "", $containerClass = "DataObjectSet") {
return singleton($callerClass)->instance_get($filter, $sort, $join, $limit, $containerClass);
}
/**
@ -1441,12 +1511,11 @@ class DataObject extends Controller {
* @param string $join A single join clause. This can be used for filtering, only 1 instance of each DataObject will be returned.
* @param string $limit A limit expression to be inserted into the LIMIT clause.
* @param string $containerClass The container class to return the results in.
* @param string $having A filter to be inserted into the HAVING clause.
*
* @return mixed The objects matching the filter, in the class specified by $containerClass
*/
public function instance_get($filter = "", $sort = "", $join = "", $limit="", $containerClass = "DataObjectSet", $having = "") {
$query = $this->extendedSQL($filter, $sort, $limit, $join, $having);
public function instance_get($filter = "", $sort = "", $join = "", $limit="", $containerClass = "DataObjectSet") {
$query = $this->extendedSQL($filter, $sort, $limit, $join);
$records = $query->execute();
$ret = $this->buildDataObjectSet($records, $containerClass, $query, $this->class);
@ -1490,8 +1559,6 @@ class DataObject extends Controller {
* Return the first item matching the given query.
* All calls to get_one() are cached.
*
* TODO Caching doesn't respect sorting.
*
* @param string $callerClass The class of objects to be returned
* @param string $filter A filter to be inserted into the WHERE clause
* @param boolean $cache Use caching
@ -1500,16 +1567,17 @@ class DataObject extends Controller {
* @return DataObject The first item matching the query
*/
public static function get_one($callerClass, $filter = "", $cache = true, $orderby = "") {
if(!$cache || !isset(DataObject::$cache_get_one[$callerClass][$filter]) || isset(DataObject::$cache_get_one[$callerClass][$filter]->destroyed)) {
$sum = md5("{$filter}_{$orderby}");
if(!$cache || !isset(DataObject::$cache_get_one[$callerClass][$sum]) || !DataObject::$cache_get_one[$callerClass][$sum] || DataObject::$cache_get_one[$callerClass][$sum]->destroyed) {
$item = singleton($callerClass)->instance_get_one($filter, $orderby);
if($cache) {
DataObject::$cache_get_one[$callerClass][$filter] = $item;
if(!DataObject::$cache_get_one[$callerClass][$filter]) {
DataObject::$cache_get_one[$callerClass][$filter] = false;
DataObject::$cache_get_one[$callerClass][$sum] = $item;
if(!DataObject::$cache_get_one[$callerClass][$sum]) {
DataObject::$cache_get_one[$callerClass][$sum] = false;
}
}
}
return $cache ? DataObject::$cache_get_one[$callerClass][$filter] : $item;
return $cache ? DataObject::$cache_get_one[$callerClass][$sum] : $item;
}
/**
@ -1588,10 +1656,15 @@ class DataObject extends Controller {
*/
public static function get_by_id($callerClass, $id) {
if(is_numeric($id)) {
$tableClasses = ClassInfo::dataClassesFor($callerClass);
$baseClass = array_shift($tableClasses);
return DataObject::get_one($callerClass,"`$baseClass`.`ID` = $id");
if(singleton($callerClass) instanceof DataObject) {
$tableClasses = ClassInfo::dataClassesFor($callerClass);
$baseClass = array_shift($tableClasses);
return DataObject::get_one($callerClass,"`$baseClass`.`ID` = $id");
// This simpler code will be used by non-DataObject classes that implement DataObjectInterface
} else {
return DataObject::get_one($callerClass,"`ID` = $id");
}
} else {
user_error("DataObject::get_by_id passed a non-numeric ID #$id", E_USER_WARNING);
}
@ -1830,6 +1903,15 @@ class DataObject extends Controller {
/**
* one-to-many relationship definitions.
* This is a map from component name to data type.
*
* Caution: Because this doesn't define any data structure itself, you should
* specify a $has_one relationship on the other end of the relationship.
* Also, if the $has_one relationship on the other end has multiple
* definitions of this class (e.g. two different relationships to the Member
* object), then you need to write a custom accessor (e.g. overload the
* function from the key of this array), because sapphire won't know which
* to access.
*
* @var array
*/
public static $has_many = null;

View File

@ -2,7 +2,7 @@
/**
* @package sapphire
* @subpackage core
* @subpackage model
*/
@ -10,6 +10,8 @@
* Plug-ins for additional functionality in your DataObjects
*
* DataObject decorators add extra functionality to your data objects.
* @package sapphire
* @subpackage model
*/
abstract class DataObjectDecorator extends Extension {

View File

@ -2,13 +2,15 @@
/**
* @package sapphire
* @subpackage core
* @subpackage model
*/
/**
* A DataObjectLog is a log of changes that have been made to the database in this session.
* It was designed to help with updates to the CMS tree, and could be used wherever an Ajax call
* needs to update a complex on-screen representation of your data.
* @package sapphire
* @subpackage model
*/
class DataObjectLog extends Object {
/**

View File

@ -2,11 +2,14 @@
/**
* @package sapphire
* @subpackage core
* @subpackage model
*/
/**
* This class represents a set of database objects, such as the results of a query
* This class represents a set of {@link ViewableData} subclasses (mostly {@link DataObject} or {@link ArrayData}.
* It is used by the ORM-layer of Silverstripe to return query-results from {@link SQLQuery}.
* @package sapphire
* @subpackage model
*/
class DataObjectSet extends ViewableData implements Iterator {
/**
@ -60,17 +63,33 @@ class DataObjectSet extends ViewableData implements Iterator {
protected $paginationGetVar = "start";
/**
* Create a new DataObjectSet.
* @param array|DataObject,... $items The DataObjects to use in this set, either as an array or as multiple variables
* Create a new DataObjectSet. If you pass one or more arguments, it will try to convert them into {@link ArrayData} objects.
* @todo Does NOT automatically convert objects with complex datatypes (e.g. converting arrays within an objects to its own DataObjectSet)
*
* @param ViewableData|array|mixed $items Parameters to use in this set, either as an associative array, object with simple properties, or as multiple parameters.
*/
public function __construct($items = null, $otherArg = null) {
public function __construct($items = null) {
if($items) {
if (is_array($items)) {
// We now have support for using the key of a data object set
$this->items = $items;
} else if($allArgs = func_get_args()) {
$this->items = $allArgs;
// if the first parameter is not an array, or we have more than one parameter, collate all parameters to an array
// otherwise use the passed array
$itemsArr = (!is_array($items) || count(func_get_args()) > 1) ? func_get_args() : $items;
// We now have support for using the key of a data object set
foreach($itemsArr as $i => $item) {
if(is_subclass_of($item, 'ViewableData')) {
$this->items[$i] = $item;
} elseif(is_object($item) || ArrayLib::is_associative($item)) {
$this->items[$i] = new ArrayData($item);
} else {
user_error(
"DataObjectSet::__construct: Passed item #{$i} is not an object or associative array,
can't be properly iterated on in templates",
E_USER_WARNING
);
$this->items[$i] = $item;
}
}
$this->current = $this->prepareItem(current($this->items));
}
parent::__construct();
@ -309,6 +328,18 @@ class DataObjectSet extends ViewableData implements Iterator {
return $this->TotalPages() > 1;
}
function FirstItem() {
return isset($this->pageStart) ? $this->pageStart + 1 : 1;
}
function LastItem() {
if(isset($this->pageStart)) {
return min($this->pageStart + $this->pageLength, $this->totalSize);
} else {
return min($this->pageLength, $this->totalSize);
}
}
/**
* Returns the URL of the previous page.
* @return string
@ -359,8 +390,8 @@ class DataObjectSet extends ViewableData implements Iterator {
* @param string $key Key to index this DataObject by.
*/
public function insertFirst($item, $key = null) {
if($key != null) {
array_shift($this->items, $item);
if($key == null) {
array_unshift($this->items, $item);
} else {
// Not very efficient :-(
$newItems = array();
@ -374,6 +405,7 @@ class DataObjectSet extends ViewableData implements Iterator {
* @deprecated Use merge()
*/
public function append(DataObjectSet $doset){
user_error('DataObjectSet::append() is deprecated. Use DataObjectSet::merge() instead.', E_USER_NOTICE);
foreach($doset as $item){
$this->push($item);
}
@ -611,7 +643,7 @@ class DataObjectSet extends ViewableData implements Iterator {
/**
* Returns the dataset as an array of ID => Title.
*
* TODO Duplication from toDropdownMap()
* @todo Duplication from toDropdownMap()
*
* @param string $key The field you wish to use as a key for the array
* @param string $value The field or method you wish to use to get values for the map
@ -1006,4 +1038,4 @@ function column_sort_callback_basic($a, $b) {
return $result;
}
?>
?>

View File

@ -2,12 +2,14 @@
/**
* @package sapphire
* @subpackage core
* @subpackage model
*/
/**
* Abstract database connectivity class.
* Sub-classes of this implement the actual database connection libraries
* @package sapphire
* @subpackage model
*/
abstract class Database extends Object {
/**
@ -49,20 +51,20 @@ abstract class Database extends Object {
* Create the database and connect to it. This can be called if the
* initial database connection is not successful because the database
* does not exist.
* @param string $connect Connection string
* @param string $username Database username
* @param string $password Database Password
* @param string $database Database to which to create
*
* It takes no parameters, and should create the database from the information
* specified in the constructor.
*
* @return boolean Returns true if successful
*/
abstract function createDatabase($connect, $username, $password, $database);
abstract function createDatabase();
/**
* Build the connection string from input
* @param array $parameters The connection details
* @return string $connect The connection string
**/
abstract function getConnect();
abstract function getConnect($parameters);
/**
* Create a new table.
@ -307,6 +309,38 @@ abstract class Database extends Object {
Profiler::unmark('createField');
Database::alteration_message("Field $table.$field: created as $spec","created");
} else if($this->fieldList[$table][$field] != $spec) {
// If enums are being modified, then we need to fix existing data in the table.
// Update any records where the enum is set to a legacy value to be set to the default.
// One hard-coded exception is SiteTree - the default for this is Page.
if(substr($spec, 0, 4) == "enum") {
$new = substr($spec, 5);
$old = substr($this->fieldList[$table][$field], 5);
$new = substr($new, 0, strpos($new, ')'));
$old = substr($old, 0, strpos($old, ')'));
$new = str_replace("'", '', $new);
$old = str_replace("'", '', $old);
$new = explode(',', $new);
$old = explode(',', $old);
$holder = array();
foreach($old as $check) {
if(!in_array($check, $new)) {
$holder[] = $check;
}
}
if(count($holder)) {
$default = explode('default ', $spec);
$default = $default[1];
if($default == "'SiteTree'") $default = "'Page'";
$query = "UPDATE `$table` SET $field=$default WHERE $field IN (";
for($i=0;$i+1<count($holder);$i++) {
$query .= "'{$holder[$i]}', ";
}
$query .= "'{$holder[$i]}')";
DB::query($query);
$amount = DB::affectedRows();
Database::alteration_message("Changed $amount rows to default value of field $field (Value: $default)");
}
}
Profiler::mark('alterField');
$this->transAlterField($table, $field, $spec);
Profiler::unmark('alterField');
@ -368,11 +402,11 @@ abstract class Database extends Object {
}
}
/** Replaces "''" with "null", recursively walks through the given array.
/** Replaces "\'\'" with "null", recursively walks through the given array.
* @param string $array Array where the replacement should happen
*/
static function replace_with_null(&$array) {
$array = str_replace('\'\'', "null", $array);
$array = ereg_replace('= *\'\'', "= null", $array);
if(is_array($array)) {
foreach($array as $key => $value) {
@ -443,6 +477,8 @@ abstract class Database extends Object {
* Primarily, the Query class takes care of the iterator plumbing, letting the subclasses focusing
* on providing the specific data-access methods that are required: {@link nextRecord()}, {@link numRecords()}
* and {@link seek()}
* @package sapphire
* @subpackage model
*/
abstract class Query extends Object implements Iterator {
/**

View File

@ -4,7 +4,7 @@
* Database Administration
*
* @package sapphire
* @subpackage core
* @subpackage model
*/
@ -20,9 +20,19 @@ require_once("core/model/DB.php");
*
* Utility functions for administrating the database. These can be accessed
* via URL, e.g. http://www.yourdomain.com/db/build.
* @package sapphire
* @subpackage model
*/
class DatabaseAdmin extends Controller {
/// SECURITY ///
static $allowed_actions = array(
'build',
'cleanup',
'testinstall',
'import'
);
/**
* Get the data classes, grouped by their root class
*

View File

@ -1,12 +1,12 @@
<?php
/**
* @package sapphire
* @subpackage core
* @package cms
*/
/**
* ErrorPage holds the content for the page of an error response.
* @package cms
*/
class ErrorPage extends Page {
@ -27,10 +27,10 @@ class ErrorPage extends Page {
if(!DataObject::get_one("ErrorPage", "ErrorCode = '404'")) {
$errorpage = new ErrorPage();
$errorpage->ErrorCode = 404;
$errorpage->Title = "Page not found";
$errorpage->Title = _t('ErrorPage.DEFAULTERRORPAGETITLE', 'Page not found');
$errorpage->URLSegment = "page-not-found";
$errorpage->ShowInMenus = false;
$errorpage->Content = "<p>Sorry, it seems you were trying to access a page that doesn't exist.</p><p>Please check the spelling of the URL you were trying to access and try again.</p>";
$errorpage->Content = _t('ErrorPage.DEFAULTERRORPAGECONTENT', '<p>Sorry, it seems you were trying to access a page that doesn\'t exist.</p><p>Please check the spelling of the URL you were trying to access and try again.</p>');
$errorpage->Status = "New page";
$errorpage->write();
// Don't publish, as the manifest may not be built yet
@ -50,8 +50,29 @@ class ErrorPage extends Page {
"ErrorCode",
_t('ErrorPage.CODE', "Error code"),
array(
404 => "404 - Page not found",
500 => "500 - Server error"
400 => _t('ErrorPage.400', '400 - Bad Request'),
401 => _t('ErrorPage.401', '401 - Unauthorized'),
403 => _t('ErrorPage.403', '403 - Forbidden'),
404 => _t('ErrorPage.404', '404 - Not Found'),
405 => _t('ErrorPage.405', '405 - Method Not Allowed'),
406 => _t('ErrorPage.406', '406 - Not Acceptable'),
407 => _t('ErrorPage.407', '407 - Proxy Authentication Required'),
408 => _t('ErrorPage.408', '408 - Request Timeout'),
409 => _t('ErrorPage.409', '409 - Conflict'),
410 => _t('ErrorPage.410', '410 - Gone'),
411 => _t('ErrorPage.411', '411 - Length Required'),
412 => _t('ErrorPage.412', '412 - Precondition Failed'),
413 => _t('ErrorPage.413', '413 - Request Entity Too Large'),
414 => _t('ErrorPage.414', '414 - Request-URI Too Long'),
415 => _t('ErrorPage.415', '415 - Unsupported Media Type'),
416 => _t('ErrorPage.416', '416 - Request Range Not Satisfiable'),
417 => _t('ErrorPage.417', '417 - Expectation Failed'),
500 => _t('ErrorPage.500', '500 - Internal Server Error'),
501 => _t('ErrorPage.501', '501 - Not Implemented'),
502 => _t('ErrorPage.502', '502 - Bad Gateway'),
503 => _t('ErrorPage.503', '503 - Service Unavailable'),
504 => _t('ErrorPage.504', '504 - Gateway Timeout'),
505 => _t('ErrorPage.505', '505 - HTTP Version Not Supported'),
)
),
"Content"
@ -104,6 +125,7 @@ class ErrorPage extends Page {
/**
* Controller for ErrorPages.
* @package cms
*/
class ErrorPage_Controller extends Page_Controller {
public function init() {

View File

@ -1,13 +1,13 @@
<?php
/**
* @package sapphire
* @subpackage core
* @package cms
*/
/**
* Ghost pages are placeholder pages that are used to facilitate the apparent support for
* multiple parents.
* @package cms
*/
class GhostPage extends SiteTree implements HiddenClass {
static $has_one = array(
@ -96,6 +96,7 @@ class GhostPage extends SiteTree implements HiddenClass {
/**
* Controller for GhostPages
* @package cms
*/
class GhostPage_Controller extends Page_Controller {
function getViewer($action) {
@ -105,6 +106,7 @@ class GhostPage_Controller extends Page_Controller {
/**
* Special type of ComponentSet just for GhostPages
* @package cms
*/
class GhostPage_ComponentSet extends ComponentSet {
function setOwner($ownerObj) {

View File

@ -1,13 +1,13 @@
<?php
/**
* @package sapphire
* @subpackage core
* @package cms
*/
/**
* Anything that implements HiddenClass won't be shown in user-interface elements. For example,
* DataObjects that implement HiddenClass won't be showing in the "new page" dropdown.
* @package cms
*/
interface HiddenClass {

View File

@ -2,12 +2,14 @@
/**
* @package sapphire
* @subpackage core
* @subpackage model
*/
/**
* DataObjects that use the Hierachy decorator can be be organised as a hierachy, with children and parents.
* The most obvious example of this is SiteTree.
* @package sapphire
* @subpackage model
*/
class Hierarchy extends DataObjectDecorator {
protected $markedNodes;
@ -295,7 +297,7 @@ class Hierarchy extends DataObjectDecorator {
}
/**
* Return a partial tree as a <ul>.
* Return a partial tree as an HTML UL.
*/
public function partialTreeAsUL($minCount = 50) {
$children = $this->owner->AllChildren();
@ -333,7 +335,7 @@ class Hierarchy extends DataObjectDecorator {
continue;
}
$idList[] = $child->ID;
$child->loadDescendantIDListInto($idList);
$child->extInstance('Hierarchy')->loadDescendantIDListInto($idList);
}
}
}
@ -522,7 +524,7 @@ class Hierarchy extends DataObjectDecorator {
* Get the next node in the tree of the type. If there is no instance of the className descended from this node,
* then search the parents.
*
* TODO Write!
* @todo Write!
*/
public function naturalPrev( $className, $afterNode = null ) {
return null;

View File

@ -2,11 +2,13 @@
/**
* @package sapphire
* @subpackage core
* @subpackage filesystem
*/
/**
* Represents an image attached to a page.
* @package sapphire
* @subpackage filesystem
*/
class Image extends File {
/**
@ -262,9 +264,9 @@ class Image extends File {
* Generate an image on the specified format. It will save the image
* at the location specified by cacheFilename(). The image will be generated
* using the specific 'generate' method for the specified format.
* @var string $format Name of the format to generate.
* @var string $arg1 Argument to pass to the generate method.
* @var string $arg2 A second argument to pass to the generate method.
* @param string $format Name of the format to generate.
* @param string $arg1 Argument to pass to the generate method.
* @param string $arg2 A second argument to pass to the generate method.
*/
function generateFormattedImage($format, $arg1 = null, $arg2 = null) {
$cacheFile = $this->cacheFilename($format, $arg1, $arg2);
@ -365,7 +367,11 @@ class Image extends File {
}
/**
* Image not stored in the database, that is just a cached resampled image
* A resized / processed {@link Image} object.
* When Image object are processed or resized, a suitable Image_Cached object is returned, pointing to the
* cached copy of the processed image.
* @package sapphire
* @subpackage filesystem
*/
class Image_Cached extends Image {
/**
@ -393,6 +399,12 @@ class Image_Cached extends Image {
}
}
/**
* A db field type designed to help save images.
* @deprecated Use a has_one relationship pointing to the file table instead.
* @package sapphire
* @subpackage filesystem
*/
class Image_Saver extends DBField {
function saveInto($record) {
$image = $record->getComponent($this->name);
@ -412,14 +424,17 @@ class Image_Saver extends DBField {
}
/**
* Uploader support for the uploading anything which is a File or subclass of
* File, eg Image.
* Uploader support for the uploading anything which is a File or subclass of File, eg Image.
* @package sapphire
* @subpackage filesystem
*/
class Image_Uploader extends Controller {
/**
* Ensures the css is loaded for the iframe.
*/
function iframe() {
if(!Permission::check('ADMIN')) Security::permissionFailure($this);
Requirements::css("cms/css/Image_iframe.css");
return array();
}
@ -590,34 +605,25 @@ class Image_Uploader extends Controller {
_t('ImageUploader.DELETE', 'Delete %s', PR_MEDIUM, 'Delete file/image'),
$type
);
return new Form(
$form = new Form(
$this,
'DeleteImageForm',
new FieldSet(
new HiddenField("Class", null, $this->urlParams['Class']),
new HiddenField("ID", null, $this->urlParams['ID']),
new HiddenField("Field", null, $this->urlParams['Field']),
new HeaderField($title),
new LabelField(
sprintf(
_t(
'ImageUploader.CLICKREMOVE',
"Click the button below to remove this %s.",
PR_MEDIUM,
'... this image/file'
),
$type
)
)
new HiddenField("Field", null, $this->urlParams['Field'])
),
new FieldSet(
new ConfirmedFormAction(
$deleteAction = new ConfirmedFormAction(
"delete",
$title,
sprintf(_t('ImageUploader.REALLYDELETE', "Do you really want to remove this %s?"), $type)
)
)
);
$deleteAction->addExtraClass('delete');
return $form;
}
}
@ -632,7 +638,7 @@ class Image_Uploader extends Controller {
}
$owner = DataObject::get_by_id($data['Class'], $data['ID']);
$fieldName = $data['Field'] . 'ID';
if($data['ImageSource'] == 'existing') {
if(!$data['ExistingFile']) {
// No image has been selected
@ -645,6 +651,14 @@ class Image_Uploader extends Controller {
// Edit the class name, if applicable
$existingFile = DataObject::get_by_id("File", $data['ExistingFile']);
$desiredClass = $owner->has_one($data['Field']);
// Unless specifically asked, we don't want the user to be able
// to select a folder
if(is_a($existingFile, 'Folder') && $desiredClass != 'Folder') {
Director::redirectBack();
return;
}
if(!is_a($existingFile, $desiredClass)) {
$existingFile->ClassName = $desiredClass;
$existingFile->write();
@ -690,6 +704,8 @@ class Image_Uploader extends Controller {
* Flush all of the generated images.
*/
function flush() {
if(!Permission::check('ADMIN')) Security::permissionFailure($this);
$images = DataObject::get("Image","");
$numItems = 0;
$num = 0;
@ -710,6 +726,8 @@ class Image_Uploader extends Controller {
* @deprecated This function is only used to migrate content from old databases.
*/
function transferlegacycontent() {
if(!Permission::check('ADMIN')) Security::permissionFailure($this);
$images = DB::query("SELECT * FROM _obsolete_Image");
echo "<h3>Transferring images</h3>";
foreach($images as $image) {

View File

@ -2,11 +2,13 @@
/**
* @package sapphire
* @subpackage core
* @subpackage model
*/
/**
* MySQL connector class.
* @package sapphire
* @subpackage model
*/
class MySQLDatabase extends Database {
/**
@ -30,10 +32,10 @@ class MySQLDatabase extends Database {
/**
* Connect to a MySQL database.
* @param array $parameters An map of parameters, which should include:
* <ul><li>server: The server, eg, localhost</li>
* <li>username: The username to log on with</li>
* <li>password: The password to log on with</li>
* <li>database: The database to connect to</li>
* - server: The server, eg, localhost
* - username: The username to log on with
* - password: The password to log on with
* - database: The database to connect to
*/
public function __construct($parameters) {
$this->dbConn = mysql_connect($parameters['server'], $parameters['username'], $parameters['password']);
@ -127,7 +129,7 @@ class MySQLDatabase extends Database {
return $this->active ? true : false;
}
public function createDatabase($connect, $username, $password, $db) {
public function createDatabase() {
$this->query("CREATE DATABASE $this->database");
$this->query("USE $this->database");
@ -390,6 +392,8 @@ class MySQLDatabase extends Database {
/**
* A result-set from a MySQL database.
* @package sapphire
* @subpackage model
*/
class MySQLQuery extends Query {
/**

View File

@ -2,18 +2,20 @@
/**
* @package sapphire
* @subpackage core
* @subpackage model
*/
/**
* PDO (general database) connector class.
* @package sapphire
* @subpackage model
*/
class PDODatabase extends Database {
/**
* Connection to the DBMS.
* @var resource
*/
private $dbConn=null;
private $dbConn;
/**
* True if we are connected to a database.
@ -38,7 +40,7 @@ class PDODatabase extends Database {
* Parameters used for creating a connection
* @var array
*/
protected $param;
private $param;
/**
* Connect to a database (MySQL, PostgreSQL, or MS SQL).
@ -51,22 +53,20 @@ class PDODatabase extends Database {
* <li>password: The password to log on with</li>
* <li>database: The database to connect to</li></ul>
*/
public function __construct($parameters) {
public function __construct($parameters) {
$this->param = $parameters;
$connect = $this->getConnect();
//$connect=$this->getConnect($parameters);
$connectWithDB = $connect . ';dbname=' . $parameters['database'];
echo 'connect with DB: ' . $connectWithDB . '<br>';
try { // Try connect to the database, if it does not exist, create it
$connect = self::getConnect($parameters);
$connectWithDB = $connect . ';dbname=' . $parameters['database'];
try { // Try connect to the database, if it does not exist, create it
$this->dbConn = new PDO($connectWithDB, $parameters['username'], $parameters['password']);
} catch (PDOException $e) {
// To do - this is an instance method, not a static method. Call it as such.
if (!self::createDatabase($connect, $parameters['username'], $parameters['password'], $parameters['database'])) {
$this->databaseError("Could not connect to the database, make sure the server is available and user credentials are correct");
} else {
$this->dbConn = new PDO($connectWithDB, $parameters['username'], $parameters['password']); // After creating the database, connect to it
}
}
}
parent::__construct();
}
@ -75,12 +75,8 @@ class PDODatabase extends Database {
* @param array $parameters The connection details.
* @return string $connect The connection string.
**/
/*public function getConnect($parameters) {
echo 'PDODatabase::getConnect:<pre>';
print_r($parameters);
echo '</pre>';
$type=$parameters['pdo_type'];
/*switch ($parameters['pdo_type']) {
public function getConnect($parameters) {
switch ($parameters['type']) {
case "mysql":
$port = '3306';
$type = 'mysql';
@ -102,25 +98,12 @@ class PDODatabase extends Database {
break;
default:
$this->databaseError("This database server is not available");
}*/
/*
}
if (isset($parameters['port']) && is_numeric($parameters['port'])) {
$port = $parameters['port'];
} else {
//assumes that a port is required for a database connection
$this->databaseError("This database server is not available");
}
$connect = $type . ':host=' . $parameters['server'] . $instance . ';port=' . $port;
return $connect;
}*/
public function getConnect(){
Debug::backtrace();
user_error("PDODatabase subclasses need to implement getConnect", E_USER_ERROR);
//echo 'getting getConnect with these parameters:<pre>';
//print_r($parameters);
//echo '</pre>';
//return $this->getConnect($parameters);
}
/**
@ -248,11 +231,9 @@ class PDODatabase extends Database {
* @param string $password Database Password
* @param string $database Database to which to create
* @return boolean Returns true if successful
* @todo This shouldn't take any arguments; it should take the information given in the constructor instead.
*/
public function createDatabase($connect, $username, $password, $database) {
echo 'connect:<pre>';
print_r($connect);
echo '</pre>';
public function createDatabase($connect, $username, $password, $database) {
try {
$dbh = new PDO($connect, $username, $password);
$stmt = $dbh->prepare("CREATE DATABASE $database");
@ -309,7 +290,7 @@ class PDODatabase extends Database {
if ($fields) {
foreach($fields as $k => $v) $fieldSchemas .= "`$k` $v,\n";
}
echo 'boo!';
switch (self::getDatabaseServer()) {
case "mysql":
$stmt = $this->dbConn->prepare("CREATE TABLE $tableName (ID INT(11) NOT NULL AUTO_INCREMENT, $fieldSchemas PRIMARY KEY (ID)) TYPE=MyISAM");
@ -332,11 +313,11 @@ class PDODatabase extends Database {
/**
* Alter fields and indexes in existing table.
* @var string $tableName The name of the table.
* @var string $newFields Fields to add.
* @var string $newIndexes Indexes to add.
* @var string $alteredFields Fields to change.
* @var string $alteredIndexes Indexes to change.
* @param string $tableName The name of the table.
* @param string $newFields Fields to add.
* @param string $newIndexes Indexes to add.
* @param string $alteredFields Fields to change.
* @param string $alteredIndexes Indexes to change.
* @return void.
*/
public function alterTable($table, $newFields = null, $newIndexes = null, $alteredFields = null, $alteredIndexes = null) {
@ -372,8 +353,8 @@ class PDODatabase extends Database {
/**
* Rename an existing table, the TO is necessary for PostgreSQL and MS SQL.
* @var string $oldTableName The name of the existing table.
* @var string $newTableName How the table should be named from now on.
* @param string $oldTableName The name of the existing table.
* @param string $newTableName How the table should be named from now on.
* @return void.
*/
public function renameTable($oldTableName, $newTableName) {
@ -387,7 +368,7 @@ class PDODatabase extends Database {
* @return boolean Return true if the table has integrity after the method is complete.
*/
public function checkAndRepairTable($tableName) {
if ($parameters['pdo_type'] == "mysql") {
if ($parameters['type'] == "mysql") {
if (!$this->runTableCheckCommand("CHECK TABLE `$tableName`")) {
if(!Database::$supressOutput) {
echo "<li style=\"color: orange\">Table $tableName: repaired</li>";
@ -586,9 +567,7 @@ class PDODatabase extends Database {
* @param string $able Table of which to show the indexes.
* Returns a map of indexes.
*/
public function indexList($table) {
echo 'self::getDatabaseServer=' . self::getDatabaseServer() . '<br>';
public function indexList($table) {
switch (self::getDatabaseServer()) {
case "mysql":
foreach($this->dbConn->query("SHOW INDEXES IN '$table'") as $index) {
@ -677,6 +656,8 @@ class PDODatabase extends Database {
/**
* A result-set from a database query (array).
* @package sapphire
* @subpackage model
*/
class PDOQuery extends Query {
private $database;
@ -738,4 +719,4 @@ class PDOQuery extends Query {
}
?>
?>

View File

@ -1,11 +1,19 @@
<?php
/**
* @package sapphire
* @subpackage core
* @package cms
*/
/**
* Data object that represents any page view in the system.
* Data object that logs statistics for any page view in the system.
*
* Inbound links from external websites are distinquished by a 'true'
* value in the FromExternal field.
*
* The referring urls are recorded in the Referrer field.
*
* Information about the users browser version and operating system is also recorded.
*
* @package cms
*/
class PageView extends DataObject {
@ -34,66 +42,67 @@ class PageView extends DataObject {
static $defaults = array();
protected $hitdata = null;
function init() {
$browscap = new Browscap();
$this->hitdata = $browscap->getBrowser(null, true);
}
/**
* gathers data for this page view and writes
* it to the data source.
*/
function record() {
$this->init();
$this->setBrowser();
$this->setOS();
$this->setUserID();
$this->setPageID();
$this->setIP();
$this->recordBrowser();
$this->recordOS();
$this->recordUserID();
$this->recordPageID();
$this->recordIP();
$this->recordFromExternal();
$this->recordReferrer();
$this->write(true);
}
function sanitize($str) {
//TODO
return $str;
private function recordFromExternal() {
$http_host = "http://".$_SERVER['HTTP_HOST'];
if (isset($_SERVER['HTTP_REFERER']) && !strstr($_SERVER['HTTP_REFERER'], $http_host) && $_SERVER['HTTP_REFERER'] != null)
$this->FromExternal = 1;
}
function setBrowser() {
if(isset($this->hitdata['Browser']))
$this->setField('Browser', $this->hitdata['Browser']);
private function recordBrowser() {
if (isset($this->hitdata['Browser']))
$this->Browser = $this->hitdata['Browser'];
if(isset($this->hitdata['Version']))
$this->setField('BrowserVersion', $this->hitdata['Version']);
if (isset($this->hitdata['Version']))
$this->BrowserVersion = $this->hitdata['Version'];
}
private function recordReferrer() {
if(isset($_SERVER['HTTP_REFERER'])) $this->Referrer = $_SERVER['HTTP_REFERER'];
}
function setOS() {
private function recordOS() {
if(isset($this->hitdata['Platform']))
$this->setField('OS', $this->hitdata['Platform']);
$this->OS = $this->hitdata['Platform'];
}
function setUserID() {
private function recordUserID() {
$isLogged = Session::get('loggedInAs');
if($isLogged) {
$id = $isLogged;
} else {
$id = -1;
}
$this->setField('UserID', $id);
$id = ($isLogged) ? $isLogged : -1;
$this->UserID = $id;
}
function setPageID() {
private function recordPageID() {
$currentPage = Director::currentPage();
if($currentPage)
$this->setField('PageID', $currentPage->ID);
if ($currentPage) $this->PageID = $currentPage->ID;
}
function setIP() {
if(isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
$ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
} else {
$ip = $_SERVER['REMOTE_ADDR'];
}
$this->setField('IP', $ip);
private function recordIP() {
$this->IP = (isset($_SERVER['HTTP_X_FORWARDED_FOR']))
? $_SERVER['HTTP_X_FORWARDED_FOR'] : $_SERVER['REMOTE_ADDR'];
}
}
?>

View File

@ -1,497 +0,0 @@
<?php
/**
* @package sapphire
* @subpackage core
*/
/**
* MySQL connector class.
*/
class PostgreSQLDatabase extends PDODatabase {
/**
* Connection to the DBMS.
* @var resource
*/
private $dbConn;
/**
* True if we are connected to a database.
* @var boolean
*/
private $active;
/**
* The name of the database.
* @var string
*/
private $database;
private $pdo_type = 'pgsql';
private $server;
private $instance;
private $port = '5432';
private $username;
private $password;
/**
* Connect to a PostgreSQL database.
* @param array $parameters An map of parameters, which should include:
* <ul><li>server: The server, eg, localhost</li>
* <li>username: The username to log on with</li>
* <li>password: The password to log on with</li>
* <li>database: The database to connect to</li>
*/
public function __construct($parameters) {
/*$this->dbConn = sql_connect($parameters['server'], $parameters['username'], $parameters['password']);
$this->active = mysql_select_db($parameters['database'], $this->dbConn);
$this->database = $parameters['database'];
if(!$this->dbConn) {
$this->databaseError("Couldn't connect to MySQL database");
}*/
//$parameters ['port'] = $this->port;
//$parameters ['pdo_type'] = $this->pdo_type;
//$parameters ['instance'] = $this->instance;
foreach($parameters as $key=>$value)
$this->$key=$value;
parent::__construct ( $parameters );
}
/**
* This is a PostgreSQL-specific connection string.
* @param array $parameters The connection details.
* @return string $connect The connection string.
**/
public function getConnect() {
echo 'PostgreSQLDatabase::getConnect:<pre>';
//Debug::show($parameters);
echo '</pre>';
//if (isset ( $parameters ['port'] ) && is_numeric ( $parameters ['port'] ))
if(isset($this->port) && is_numeric($this->port))
$port = ';port=' . $parameters ['port']; else
$port = '';
$connect = $this->pdo_type . ':host=' . $this->server . $this->instance . $port . '; user=' . $this->username . '; password=' . $this->password;
echo 'returning ' . $connect . '<br>';
return $connect;
}
/**
* Returns true if this database supports collations
* @return boolean
*/
//public function supportsCollations() {
// return $this->getVersion() >= 4.1;
//}
/**
* The version of MySQL.
* @var float
*/
//private $mysqlVersion;
/**
* Get the version of MySQL.
* @return float
*/
//public function getVersion() {
// if(!$this->mysqlVersion) {
// $this->mysqlVersion = (float)$this->query("SELECT VERSION()")->value();
// }
// return $this->mysqlVersion;
//}
/**
* Get the database server, namely mysql.
* @return string
*/
//public function getDatabaseServer() {
// return "mysql";
//}
/*public function query($sql, $errorLevel = E_USER_ERROR) {
if(isset($_REQUEST['previewwrite']) && in_array(strtolower(substr($sql,0,strpos($sql,' '))), array('insert','update','delete','replace'))) {
Debug::message("Will execute: $sql");
return;
}
if(isset($_REQUEST['showqueries'])) {
$starttime = microtime(true);
}
$handle = mysql_query($sql, $this->dbConn);
if(isset($_REQUEST['showqueries'])) {
$endtime = round(microtime(true) - $starttime,4);
Debug::message("\n$sql\n{$endtime}ms\n", false);
}
if(!$handle && $errorLevel) $this->databaseError("Couldn't run query: $sql | " . mysql_error($this->dbConn), $errorLevel);
return new MySQLQuery($this, $handle);
}
*/
//public function getGeneratedID($table) {
// return mysql_insert_id($this->dbConn);
//}
/**
* OBSOLETE: Get the ID for the next new record for the table.
*
* @var string $table The name od the table.
* @return int
*/
/*
public function getNextID($table) {
user_error('getNextID is OBSOLETE (and will no longer work properly)', E_USER_WARNING);
$result = $this->query("SELECT MAX(ID)+1 FROM `$table`")->value();
return $result ? $result : 1;
}*/
/*
public function isActive() {
return $this->active ? true : false;
}*/
/*
public function createDatabase($connect, $username, $password, $db) {
$this->query("CREATE DATABASE $this->database");
$this->query("USE $this->database");
$this->tableList = $this->fieldList = $this->indexList = null;
if(mysql_select_db($this->database, $this->dbConn)) {
$this->active = true;
return true;
}
}*/
/**
* Drop the database that this object is currently connected to.
* Use with caution.
*/
/*
public function dropDatabase() {
$this->query("DROP DATABASE $this->database");
}*/
/**
* Returns the name of the currently selected database
*/
/*
public function currentDatabase() {
return $this->database;
}*/
/**
* Switches to the given database.
* If the database doesn't exist, you should call createDatabase() after calling selectDatabase()
*/
/*
public function selectDatabase($dbname) {
$this->database = $dbname;
if($this->databaseExists($this->database)) mysql_select_db($this->database, $this->dbConn);
$this->tableList = $this->fieldList = $this->indexList = null;
}*/
/**
* Returns true if the named database exists.
*/
/*
public function databaseExists($name) {
$SQL_name = Convert::raw2sql($name);
return $this->query("SHOW DATABASES LIKE '$SQL_name'")->value() ? true : false;
}*/
/*
public function createTable($tableName, $fields = null, $indexes = null) {
$fieldSchemas = $indexSchemas = "";
if($fields) foreach($fields as $k => $v) $fieldSchemas .= "`$k` $v,\n";
if($indexes) foreach($indexes as $k => $v) $fieldSchemas .= $this->getIndexSqlDefinition($k, $v) . ",\n";
$this->query("CREATE TABLE `$tableName` (
ID int(11) not null auto_increment,
$fieldSchemas
$indexSchemas
primary key (ID)
) TYPE=MyISAM");
}
*/
/**
* Alter a table's schema.
* @param $table The name of the table to alter
* @param $newFields New fields, a map of field name => field schema
* @param $newIndexes New indexes, a map of index name => index type
* @param $alteredFields Updated fields, a map of field name => field schema
* @param $alteredIndexes Updated indexes, a map of index name => index type
*/
/*
public function alterTable($tableName, $newFields = null, $newIndexes = null, $alteredFields = null, $alteredIndexes = null) {
$fieldSchemas = $indexSchemas = "";
if($newFields) foreach($newFields as $k => $v) $alterList[] .= "ADD `$k` $v";
if($newIndexes) foreach($newIndexes as $k => $v) $alterList[] .= "ADD " . $this->getIndexSqlDefinition($k, $v);
if($alteredFields) foreach($alteredFields as $k => $v) $alterList[] .= "CHANGE `$k` `$k` $v";
if($alteredIndexes) foreach($alteredIndexes as $k => $v) {
$alterList[] .= "DROP INDEX `$k`";
$alterList[] .= "ADD ". $this->getIndexSqlDefinition($k, $v);
}
$alterations = implode(",\n", $alterList);
$this->query("ALTER TABLE `$tableName` " . $alterations);
}*/
/*
public function renameTable($oldTableName, $newTableName) {
$this->query("ALTER TABLE `$oldTableName` RENAME `$newTableName`");
}
*/
/**
* Checks a table's integrity and repairs it if necessary.
* @var string $tableName The name of the table.
* @return boolean Return true if the table has integrity after the method is complete.
*/
/*
public function checkAndRepairTable($tableName) {
if(!$this->runTableCheckCommand("CHECK TABLE `$tableName`")) {
Database::alteration_message("Table $tableName: repaired","repaired");
return $this->runTableCheckCommand("REPAIR TABLE `$tableName` USE_FRM");
} else {
return true;
}
}*/
/**
* Helper function used by checkAndRepairTable.
* @param string $sql Query to run.
* @return boolean Returns if the query returns a successful result.
*/
/*
protected function runTableCheckCommand($sql) {
$testResults = $this->query($sql);
foreach($testResults as $testRecord) {
if(strtolower($testRecord['Msg_text']) != 'ok') {
return false;
}
}
return true;
}
*/
/*
public function createField($tableName, $fieldName, $fieldSpec) {
$this->query("ALTER TABLE `$tableName` ADD `$fieldName` $fieldSpec");
}
*/
/**
* Change the database type of the given field.
* @param string $tableName The name of the tbale the field is in.
* @param string $fieldName The name of the field to change.
* @param string $fieldSpec The new field specification
*/
/*
public function alterField($tableName, $fieldName, $fieldSpec) {
// This wee function was built for MoT. It will preserve the binary format of the content,
// but change the character set
//$changes = $this->query("SELECT ID, `$fieldName` FROM `$tableName`")->map();
$this->query("ALTER TABLE `$tableName` CHANGE `$fieldName` `$fieldName` $fieldSpec");
// This wee function was built for MoT. It will preserve the binary format of the content,
// but change the character set
/*
echo "<li>Fixing " . sizeof($changes) . " page's contnet";
foreach($changes as $id => $text) {
$SQL_text = Convert::raw2sql($text);
$this->query("UPDATE `$tableName` SET `$fieldName` = '$SQL_text' WHERE ID = '$id'");
}
*/
//}
/*
public function fieldList($table) {
$fields = DB::query("SHOW FULL FIELDS IN `$table`");
foreach($fields as $field) {
$fieldSpec = $field['Type'];
if(!$field['Null'] || $field['Null'] == 'NO') {
$fieldSpec .= ' not null';
}
if($field['Collation'] && $field['Collation'] != 'NULL') {
$collInfo = DB::query("SHOW COLLATION LIKE '$field[Collation]'")->record();
$fieldSpec .= " character set $collInfo[Charset] collate $field[Collation]";
}
if($field['Default'] || $field['Default'] === "0") {
$fieldSpec .= " default '" . addslashes($field['Default']) . "'";
}
if($field['Extra']) $fieldSpec .= " $field[Extra]";
$fieldList[$field['Field']] = $fieldSpec;
}
return $fieldList;
}
*/
/**
* Create an index on a table.
* @param string $tableName The name of the table.
* @param string $indexName The name of the index.
* @param string $indexSpec The specification of the index, see Database::requireIndex() for more details.
*/
/*
public function createIndex($tableName, $indexName, $indexSpec) {
$this->query("ALTER TABLE `$tableName` ADD " . $this->getIndexSqlDefinition($indexName, $indexSpec));
}*/
/*
protected function getIndexSqlDefinition($indexName, $indexSpec) {
$indexSpec = trim($indexSpec);
if($indexSpec[0] != '(') list($indexType, $indexFields) = explode(' ',$indexSpec,2);
else $indexFields = $indexSpec;
if(!isset($indexType)) {
$indexType = "index";
}
return "$indexType `$indexName` $indexFields";
}*/
/**
* Alter an index on a table.
* @param string $tableName The name of the table.
* @param string $indexName The name of the index.
* @param string $indexSpec The specification of the index, see Database::requireIndex() for more details.
*/
/*
public function alterIndex($tableName, $indexName, $indexSpec) {
$indexSpec = trim($indexSpec);
if($indexSpec[0] != '(') {
list($indexType, $indexFields) = explode(' ',$indexSpec,2);
} else {
$indexFields = $indexSpec;
}
if(!$indexType) {
$indexType = "index";
}
$this->query("ALTER TABLE `$tableName` DROP INDEX `$indexName`");
$this->query("ALTER TABLE `$tableName` ADD $indexType `$indexName` $indexFields");
}
*/
/**
* Return the list of indexes in a table.
* @param string $table The table name.
* @return array
*/
/*
public function indexList($table) {
$indexes = DB::query("SHOW INDEXES IN `$table`");
foreach($indexes as $index) {
$groupedIndexes[$index['Key_name']]['fields'][$index['Seq_in_index']] = $index['Column_name'];
if($index['Index_type'] == 'FULLTEXT') {
$groupedIndexes[$index['Key_name']]['type'] = 'fulltext ';
} else if(!$index['Non_unique']) {
$groupedIndexes[$index['Key_name']]['type'] = 'unique ';
} else {
$groupedIndexes[$index['Key_name']]['type'] = '';
}
}
foreach($groupedIndexes as $index => $details) {
ksort($details['fields']);
$indexList[$index] = $details['type'] . '(' . implode(',',$details['fields']) . ')';
}
return $indexList;
}*/
/**
* Returns a list of all the tables in the database.
* Table names will all be in lowercase.
* @return array
*/
/*
public function tableList() {
foreach($this->query("SHOW TABLES") as $record) {
$table = strtolower(reset($record));
$tables[$table] = $table;
}
return isset($tables) ? $tables : null;
}
*/
/**
* Return the number of rows affected by the previous operation.
* @return int
*/
/*
public function affectedRows() {
return mysql_affected_rows($this->dbConn);
}*/
}
/**
* A result-set from a PostgreSQL database.
* Created by Geoff, 25 February 2008. Basically a pg_* conversion from the original MySQL version
*/
class PostgreSQLQuery extends Query {
/**
* The PostgreSQL object that created this result set.
* @var PostgreSQL
*/
private $database;
/**
* The internal PostgreSQL handle that points to the result set.
* @var resource
*/
private $handle;
/**
* Hook the result-set given into a Query class, suitable for use by sapphire.
* @param database The database object that created this query.
* @param handle the internal mysql handle that is points to the resultset.
*/
public function __construct(PostgreSQLDatabase $database, $handle) {
$this->database = $database;
$this->handle = $handle;
parent::__construct ();
}
public function __destroy() {
pg_free_result ( $this->handle );
}
public function seek($row) {
return pg_fetch_row ( $this->handle, $row );
}
public function numRecords() {
return pg_num_rows ( $this->handle );
}
public function nextRecord() {
// Coalesce rather than replace common fields.
if ($data = pg_fetch_row ( $this->handle )) {
foreach ( $data as $columnIdx => $value ) {
$columnName = pg_field_name ( $this->handle, $columnIdx );
// $value || !$ouput[$columnName] means that the *last* occurring value is shown
// !$ouput[$columnName] means that the *first* occurring value is shown
if (isset ( $value ) || ! isset ( $output [$columnName] )) {
$output [$columnName] = $value;
}
}
return $output;
} else {
return false;
}
}
}
?>

View File

@ -1,10 +1,17 @@
<?php
/**
* @package cms
* @subpackage content
*/
/**
* A redirector page redirects when the page is visited.
* @package cms
* @subpackage content
*/
class RedirectorPage extends Page {
static $add_action = "a redirector to another page";
static $add_action = "Redirector to another page";
static $icon = array("cms/images/treeicons/page-shortcut","file");
static $db = array(
@ -34,7 +41,7 @@ class RedirectorPage extends Page {
function Link() {
if($this->RedirectionType == 'External') {
return $this->ExternalURL;
return Convert::raw2att($this->ExternalURL);
} else {
$linkTo = $this->LinkToID ? DataObject::get_by_id("SiteTree", $this->LinkToID) : null;
if($linkTo) {
@ -89,6 +96,11 @@ class RedirectorPage extends Page {
}
}
/**
* Controller for the {@link RedirectorPage}.
* @package cms
* @subpackage content
*/
class RedirectorPage_Controller extends Page_Controller {
function init() {
if($this->RedirectionType == 'External') {

View File

@ -1,8 +1,15 @@
<?php
/**
* @package sapphire
* @subpackage model
*/
/**
* This is a class used to represent key->value pairs generated from database queries.
* The query isn't actually executed until you need it.
* @package sapphire
* @subpackage model
*/
class SQLMap extends Object implements Iterator {
/**

View File

@ -1,8 +1,15 @@
<?php
/**
* @package sapphire
* @subpackage model
*/
/**
* Object representing a SQL query.
* The various parts of the SQL query can be manipulated individually.
* @package sapphire
* @subpackage model
*/
class SQLQuery extends Object {
/**

View File

@ -1,7 +1,7 @@
<?php
/**
* @package sapphire
* @subpackage core
* @package cms
*/
/**
@ -10,6 +10,7 @@
* should inherit from this.
*
* In addition, it contains a number of static methods for querying the site tree.
* @package cms
*/
class SiteTree extends DataObject {
@ -87,7 +88,10 @@ class SiteTree extends DataObject {
"Viewers" => "Enum('Anyone, LoggedInUsers, OnlyTheseUsers', 'Anyone')",
"Editors" => "Enum('LoggedInUsers, OnlyTheseUsers', 'LoggedInUsers')",
"ViewersGroup" => "Int",
"EditorsGroup" => "Int"
"EditorsGroup" => "Int",
// Simple task tracking
"ToDo" => "Text",
);
static $indexes = array(
@ -171,7 +175,15 @@ class SiteTree extends DataObject {
static $extensions = array(
"Hierarchy",
"Translatable('Title', 'MenuTitle', 'Content', 'URLSegment', 'MetaTitle', 'MetaDescription', 'MetaKeywords', 'Status')",
"Versioned('Stage', 'Live')" );
"Versioned('Stage', 'Live')"
);
/**
* Delimit breadcrumb-links generated by BreadCrumbs()
*
* @var string
*/
public static $breadcrumbs_delimiter = " &raquo; ";
/**
@ -429,7 +441,7 @@ class SiteTree extends DataObject {
$page = $page->Parent;
}
return implode(" &raquo; ", array_reverse($parts));
return implode(self::$breadcrumbs_delimiter, array_reverse($parts));
}
@ -699,8 +711,8 @@ class SiteTree extends DataObject {
if(!DataObject::get_one("SiteTree", "URLSegment = 'home'")) {
$homepage = new Page();
$homepage->Title = "Home";
$homepage->Content = "<p>Welcome to SilverStripe! This is the default homepage. You can edit this page by opening <a href=\"admin/\">the CMS</a>. You can now access the <a href=\"http://doc.silverstripe.com\">developer documentation</a>, or begin <a href=\"http://doc.silverstripe.com/doku.php?id=tutorials\">the tutorials.</a></p>";
$homepage->Title = _t('SiteTree.DEFAULTHOMETITLE', 'Home');
$homepage->Content = _t('SiteTree.DEFAULTHOMECONTENT', '<p>Welcome to SilverStripe! This is the default homepage. You can edit this page by opening <a href="admin/">the CMS</a>. You can now access the <a href="http://doc.silverstripe.com">developer documentation</a>, or begin <a href="http://doc.silverstripe.com/doku.php?id=tutorials">the tutorials.</a></p>');
$homepage->URLSegment = "home";
$homepage->Status = "Published";
$homepage->write();
@ -711,8 +723,8 @@ class SiteTree extends DataObject {
if(DB::query("SELECT COUNT(*) FROM SiteTree")->value() == 1) {
$aboutus = new Page();
$aboutus->Title = "About Us";
$aboutus->Content = "<p>You can fill this page out with your own content, or delete it and create your own pages.<br /></p>";
$aboutus->Title = _t('SiteTree.DEFAULTABOUTTITLE', 'About Us');
$aboutus->Content = _t('SiteTree.DEFAULTABOUTCONTENT', '<p>You can fill this page out with your own content, or delete it and create your own pages.<br /></p>');
$aboutus->URLSegment = "about-us";
$aboutus->Status = "Published";
$aboutus->write();
@ -720,8 +732,8 @@ class SiteTree extends DataObject {
Database::alteration_message("About Us created","created");
$contactus = new Page();
$contactus->Title = "Contact Us";
$contactus->Content = "<p>You can fill this page out with your own content, or delete it and create your own pages.<br /></p>";
$contactus->Title = _t('SiteTree.DEFAULTCONTACTTITLE', 'Contact Us');
$contactus->Content = _t('SiteTree.DEFAULTCONTACTCONTENT', '<p>You can fill this page out with your own content, or delete it and create your own pages.<br /></p>');
$contactus->URLSegment = "contact-us";
$contactus->Status = "Published";
$contactus->write();
@ -765,7 +777,7 @@ class SiteTree extends DataObject {
'';
$count = 1;
while(DataObject::get_one("SiteTree", "URLSegment = '$this->URLSegment' $idFilter")) {
while(class_exists($this->URLSegment) || DataObject::get_one("SiteTree", "URLSegment = '$this->URLSegment' $idFilter")) {
$count++;
$this->URLSegment = ereg_replace('-[0-9]+$','', $this->URLSegment) . "-$count";
}
@ -1060,6 +1072,10 @@ class SiteTree extends DataObject {
_t('SiteTree.HOMEPAGEFORDOMAIN', "Domain(s)", PR_MEDIUM, 'Listing domains that should be used as homepage')
)
),
$tabToDo = new Tab($this->ToDo ? 'To-do **' : 'To-do',
new LiteralField("ToDoHelp", _t('SiteTree.TODOHELP', "<p>You can use this to keep track of work that needs to be done to the content of your site. To see all your pages with to do information, open the 'Site Reports' window on the left and select 'To Do'</p>")),
new TextareaField("ToDo", "")
),
$tabReports = new TabSet('Reports',
$tabBacklinks =new Tab('Backlinks',
new LiteralField("Backlinks", $backlinks)
@ -1211,14 +1227,30 @@ class SiteTree extends DataObject {
$instance = singleton($class);
if((($instance instanceof HiddenClass) || !$instance->canCreate()) && ($class != $this->class)) continue;
/*
$addAction = $instance->uninherited('add_action', true);
if(!$addAction) $addAction = "a $class";
if(!$addAction) {
$addAction = $instance->singular_name();
}
*/
$addAction = $instance->i18n_singular_name();
$result[$class] = ($class == $this->class)
? "Currently $addAction"
: "Change to $addAction";
if($class == $this->class) {
$currentClass = $class;
$currentAddAction = $addAction;
} else {
$result[$class] = ($class == $this->class)
? _t('SiteTree.CURRENTLY', 'Currently').' '.$addAction
: _t('SiteTree.CHANGETO', 'Change to').' '.$addAction;
}
}
// sort alphabetically, and put current on top
asort($result);
$result = array_reverse($result);
$result[$currentClass] = $currentAddAction.' ('._t('SiteTree.CURRENT','current').')';
$result = array_reverse($result);
return $result;
}
@ -1342,13 +1374,26 @@ class SiteTree extends DataObject {
"span title=\"" . _t('SiteTree.MODIFIEDONDRAFT', 'Modified on draft site') . "\" class=\"modified\"" : "")));
if($tag) {
return "<$tag>" . $this->Title . "</" . strtok($tag,' ') . ">";
return "<$tag>" . $this->MenuTitle . "</" . strtok($tag,' ') . ">";
} else {
return $this->Title;
return $this->MenuTitle;
}
}
/**
* Returns the page in the current page stack of the given level.
* Level(1) will return the main menu item that we're currently inside, etc.
*/
public function Level($level) {
$parent = $this;
$stack = array($parent);
while($parent = $parent->Parent) {
array_unshift($stack, $parent);
}
return isset($stack[$level-1]) ? $stack[$level-1] : null;
}
/**
* Return the CSS classes to apply to this node in the CMS tree
*
@ -1370,6 +1415,9 @@ class SiteTree extends DataObject {
if($controller->isCurrentPage($this))
$classes .= " current";
if(!$this->canEdit() && !$this->canAddChildren())
$classes .= " disabled";
$classes .= $this->markingClasses();
return $classes;

View File

@ -1,7 +0,0 @@
<?php
abstract class Staged extends DataObjectDecorator {
}
?>

View File

@ -1,5 +1,10 @@
<?php
/**
* @package sapphire
* @subpackage misc
*/
/**
* The {Translatable} decorator allows your DataObjects to have versions in different languages,
* defining which fields are can be translated.
@ -23,7 +28,8 @@
* e.g. when overriding the get_one()-calls (which are already extended by {Translatable}).
*
* @author Bernat Foj Capell <bernat@silverstripe.com>
*
* @package sapphire
* @subpackage misc
*/
class Translatable extends DataObjectDecorator {
@ -143,7 +149,7 @@ class Translatable extends DataObjectDecorator {
/**
* Set default language.
*
* @paran $lang String
* @param $lang String
*/
static function set_default_lang($lang) {
self::$default_lang = $lang;
@ -604,17 +610,17 @@ class Translatable extends DataObjectDecorator {
}
$fields->addFieldsToTab(
'Root',
new Tab("Translations",
new HeaderField("Create new translation", 2),
$langDropdown = new LanguageDropdownField("NewTransLang", "New language", $alreadyTranslatedLangs),
$createButton = new InlineFormAction('createtranslation',"Create")
new Tab(_t('Translatable.TRANSLATIONS', 'Translations'),
new HeaderField(_t('Translatable.CREATE', 'Create new translation'), 2),
$langDropdown = new LanguageDropdownField("NewTransLang", _t('Translatable.NEWLANGUAGE', 'New language'), $alreadyTranslatedLangs),
$createButton = new InlineFormAction('createtranslation',_t('Translatable.CREATEBUTTON', 'Create'))
)
);
if (count($alreadyTranslatedLangs)) {
$fields->addFieldsToTab(
'Root.Translations',
new FieldSet(
new HeaderField("Existing translations:", 3),
new HeaderField(_t('Translatable.EXISTING', 'Existing translations:'), 3),
new LiteralField('existingtrans',implode(', ',$alreadyTranslatedLangs))
)
);

View File

@ -1,8 +1,15 @@
<?php
/**
* @package sapphire
* @subpackage model
*/
/**
* The Versioned decorator allows your DataObjects to have several versions, allowing
* you to rollback changes and view history. An example of this is the pages used in the CMS.
* @package sapphire
* @subpackage model
*/
class Versioned extends DataObjectDecorator {
/**
@ -152,7 +159,7 @@ class Versioned extends DataObjectDecorator {
if($this->owner->parentClass() == "DataObject") {
$rootTable = true;
}
if ($suffix && ($ext = $this->owner->getExtension($allSuffixes[$suffix]))) {
if ($suffix && ($ext = $this->owner->extInstance($allSuffixes[$suffix]))) {
if (!$ext->isVersionedTable($table)) continue;
$fields = $ext->fieldsInExtraTables($suffix);
$indexes = $fields['indexes'];
@ -338,7 +345,7 @@ class Versioned extends DataObjectDecorator {
function extendWithSuffix($table) {
foreach (Versioned::$versionableExtensions as $versionableExtension => $suffixes) {
if ($this->owner->hasExtension($versionableExtension)) {
$table = $this->owner->getExtension($versionableExtension)->extendWithSuffix($table);
$table = $this->owner->extInstance($versionableExtension)->extendWithSuffix($table);
}
}
return $table;
@ -466,7 +473,7 @@ class Versioned extends DataObjectDecorator {
$fields = array_keys($fromRecord->getAllFields());
foreach($fields as $field) {
if(in_array($field, array("ID","Version","RecordID","AuthorID"))) continue;
if(in_array($field, array("ID","Version","RecordID","AuthorID", "ParentID"))) continue;
$fromRecord->$field = Diff::compareHTML($fromRecord->$field, $toRecord->$field);
}
@ -623,6 +630,9 @@ class Versioned extends DataObjectDecorator {
* Return the latest version of the given page
*/
static function get_latest_version($class, $id) {
$oldStage = Versioned::$reading_stage;
Versioned::$reading_stage = null;
$baseTable = ClassInfo::baseDataClass($class);
$query = singleton($class)->buildVersionSQL("`{$baseTable}`.RecordID = $id", "`{$baseTable}`.Version DESC");
$query->limit = 1;
@ -633,10 +643,16 @@ class Versioned extends DataObjectDecorator {
Debug::show($record);
user_error("Versioned::get_version: Couldn't get $class.$id, version $version", E_USER_ERROR);
}
Versioned::$reading_stage = $oldStage;
return new $className($record);
}
static function get_version($class, $id, $version) {
$oldStage = Versioned::$reading_stage;
Versioned::$reading_stage = null;
$baseTable = ClassInfo::baseDataClass($class);
$query = singleton($class)->buildVersionSQL("`{$baseTable}`.RecordID = $id AND `{$baseTable}`.Version = $version");
$record = $query->execute()->record();
@ -646,6 +662,9 @@ class Versioned extends DataObjectDecorator {
Debug::show($record);
user_error("Versioned::get_version: Couldn't get $class.$id, version $version", E_USER_ERROR);
}
Versioned::$reading_stage = $oldStage;
return new $className($record);
}
@ -675,6 +694,9 @@ class Versioned extends DataObjectDecorator {
/**
* Represents a single version of a record.
* @package sapphire
* @subpackage model
* @see Versioned
*/
class Versioned_Version extends ViewableData {
protected $record;

View File

@ -1,11 +1,17 @@
<?php
/**
* @package cms
*/
/**
* Virtual Page creates an instance of a page, with the same fields that the original page had, but readonly.
* This allows you can have a page in mulitple places in the site structure, with different children without duplicating the content
* Note: This Only duplicates $db fields and not the $has_one etc..
* @package cms
*/
class VirtualPage extends Page {
static $add_action = "Virtual page (another page's content)";
static $icon = array("cms/images/treeicons/page-shortcut-gold","file");
@ -119,7 +125,8 @@ class VirtualPage extends Page {
}
/**
* @desc
* Controller for the virtual page.
* @package cms
*/
class VirtualPage_Controller extends Page_Controller {

View File

@ -1,8 +1,14 @@
<?php
/**
* @package sapphire
* @subpackage model
*/
/**
* Represents a boolean field.
*
* @param $defaultVal int
* @package sapphire
* @subpackage model
*/
class Boolean extends DBField {

View File

@ -1,7 +1,15 @@
<?php
/**
* Currency value.
* @package sapphire
* @subpackage model
*/
/**
* Represents a decimal field containing a currency amount.
* Currency the currency class only supports single currencies.
* @package sapphire
* @subpackage model
*/
class Currency extends Decimal {

View File

@ -1,15 +1,32 @@
<?php
/**
* @package sapphire
* @subpackage model
*/
/**
* Single field in the database.
* Every field from the database is represented as a sub-class of DBField. In addition to supporting
* the creation of the field in the database,
* @package sapphire
* @subpackage model
*/
abstract class DBField extends ViewableData {
protected $value;
protected $tableName;
protected $name;
/**
* @var $default mixed Default-value in the database.
* Might be overridden on DataObject-level, but still useful for setting defaults on
* already existing records after a db-build.
*/
protected $defaultVal;
function __construct($name) {
$this->name = $name;
@ -29,12 +46,15 @@ abstract class DBField extends ViewableData {
function setVal($value) {
return $this->setValue($value);
}
function setValue($value) {
$this->value = $value;
}
function setTable($tableName) {
$this->tableName = $tableName;
}
function forTemplate() {
return $this->value;
}
@ -45,15 +65,19 @@ abstract class DBField extends ViewableData {
function ATT() {
return Convert::raw2att($this->value);
}
function RAW() {
return $this->value;
}
function JS() {
return Convert::raw2js($this->value);
}
function HTML(){
return Convert::raw2xml($this->value);
}
function XML(){
return Convert::raw2xml($this->value);
}
@ -93,5 +117,4 @@ abstract class DBField extends ViewableData {
DBG;
}
}
?>

View File

@ -1,5 +1,15 @@
<?php
/**
* @package sapphire
* @subpackage model
*/
/**
* Represents a date field.
* @package sapphire
* @subpackage model
*/
class Date extends DBField {
function setValue($value) {
@ -94,7 +104,7 @@ class Date extends DBField {
if(time() < strtotime($this->value)) $agoWord = _t("Date.AWAY", " away");
else $agoWord = _t("Date.AGO", " ago");
return $this->TimeDiff() . $agoWord;
return $this->TimeDiff() . ' ' . $agoWord;
}
}
@ -129,6 +139,46 @@ class Date extends DBField {
}
}
}
/**
* Gets the time difference, but always returns it in a certain format
* @param string $format The format, could be one of these:
* 'seconds', 'minutes', 'hours', 'days', 'months', 'years'.
*
* @return string
*/
function TimeDiffIn($format) {
if($this->value) {
$ago = abs(time() - strtotime($this->value));
switch($format) {
case "seconds":
$span = $ago;
return ($span != 1) ? "{$span} seconds" : "{$span} second";
break;
case "minutes":
$span = round($ago/60);
return ($span != 1) ? "{$span} minutes" : "{$span} minute";
break;
case "hours":
$span = round($ago/3600);
return ($span != 1) ? "{$span} hours" : "{$span} hour";
break;
case "days":
$span = round($ago/86400);
return ($span != 1) ? "{$span} days" : "{$span} day";
break;
case "months":
$span = round($ago/86400/30);
return ($span != 1) ? "{$span} months" : "{$span} month";
break;
case "years":
$span = round($ago/86400/365);
return ($span != 1) ? "{$span} years" : "{$span} year";
break;
}
}
}
function requireField() {
DB::requireField($this->tableName, $this->name, "date");

View File

@ -1,7 +1,21 @@
<?php
/**
* @package sapphire
* @subpackage model
*/
if(!class_exists('Datetime')) {
/**
* @package sapphire
* @subpackage model
* @deprecated Use {@link SSDatetime} instead, as PHP 5.2 has its own Datetime class. Object::create('Datetime') will instantiate an SSDatetime object.
*/
class Datetime extends Date {
function __construct($name) {
user_error('Datetime is deprecated. Use SSDatetime instead.', E_USER_NOTICE);
parent::__construct($name);
}
function setValue($value) {
if($value) $this->value = date('Y-m-d H:i:s', strtotime($value));

View File

@ -1,6 +1,14 @@
<?php
/**
* Decimal value.
* @package sapphire
* @subpackage model
*/
/**
* Represents a Decimal field.
* @package sapphire
* @subpackage model
*/
class Decimal extends DBField {
protected $wholeSize, $decimalSize;
@ -24,6 +32,15 @@ class Decimal extends DBField {
function requireField() {
DB::requireField($this->tableName, $this->name, "decimal($this->wholeSize,$this->decimalSize)");
}
function saveInto($dataObject) {
$fieldName = $this->name;
if($fieldName) {
$dataObject->$fieldName = (float)preg_replace('/[^0-9.]/', '', $this->value);
} else {
user_error("DBField::saveInto() Called on a nameless '" . get_class($this) . "' object", E_USER_ERROR);
}
}
}

View File

@ -1,5 +1,15 @@
<?php
/**
* @package sapphire
* @subpackage model
*/
/**
* Represents an enumeration field.
* @package sapphire
* @subpackage model
*/
class Enum extends DBField {
protected $enum, $default;

View File

@ -1,6 +1,14 @@
<?php
/**
*
* @package sapphire
* @subpackage model
*/
/**
* Represents a floating point field.
* @package sapphire
* @subpackage model
*/
class Float extends DBField {

View File

@ -1,5 +1,17 @@
<?php
/**
* @package sapphire
* @subpackage model
*/
/**
* Represents a large text field that contains HTML content.
*
* This behaves similarly to Text, but the template processor won't escape any HTML content within it.
* @package sapphire
* @subpackage model
*/
class HTMLText extends Text {
/**
@ -43,13 +55,17 @@ class HTMLText extends Text {
$summary .= $parts[$pIndex++] . ' ';
}
// Tags that shouldn't be closed
$noClose = array("br", "img");
// make sure that the summary is well formed XHTML by closing tags
while( $openTag = array_pop( $tagStack ) ) {
preg_match( '/^<(\w+)\s+/', $openTag, $tagName );
if(sizeof($tagName) > 0)
$summary .= "</{$tagName[1]}>";
if(sizeof($tagName) > 0) {
if(!in_array($tagName[1], $noClose)) {
$summary .= "</{$tagName[1]}>";
}
}
}
return $summary;

View File

@ -1,8 +1,16 @@
<?php
/**
* This behaves exactly the same as Varchar but is intended to store HTML content in it.
* The template processor won't escape any HTML content within it
* @package sapphire
* @subpackage model
*/
/**
* Represents a short text field that is intended to contain HTML content.
*
* This behaves similarly to Varchar, but the template processor won't escape any HTML content within it.
* @package sapphire
* @subpackage model
*/
class HTMLVarchar extends Varchar {

View File

@ -1,5 +1,15 @@
<?php
/**
* @package sapphire
* @subpackage model
*/
/**
* Represents an integer field.
* @package sapphire
* @subpackage model
*/
class Int extends DBField {
function __construct($name, $defaultVal = 0) {
@ -33,6 +43,9 @@ class Int extends DBField {
function Nice() {
return sprintf( '%d', $this->value );
}
}
?>
?>

View File

@ -1,5 +1,15 @@
<?php
/**
* @package sapphire
* @subpackage model
*/
/**
* Represents a decimal field from 0-1 containing a percentage value.
* @package sapphire
* @subpackage model
*/
class Percentage extends Decimal {
/**

View File

@ -1,4 +1,15 @@
<?php
/**
* @package sapphire
* @subpackage model
*/
/**
* Represents a date-time field.
* @package sapphire
* @subpackage model
*/
class SSDatetime extends Date {
function setValue($value) {
if($value) $this->value = date('Y-m-d H:i:s', strtotime($value));

View File

@ -1,5 +1,15 @@
<?php
/**
* @package sapphire
* @subpackage model
*/
/**
* Represents a long text field.
* @package sapphire
* @subpackage model
*/
class Text extends DBField {
static $casting = array(
"AbsoluteLinks" => "HTMLText",
@ -57,6 +67,34 @@ class Text extends DBField {
return $ret;
}
/**
* Limit sentences, can be controlled by passing an integer.
* @param int $sentCount The amount of sentences you want.
*/
function LimitSentences($sentCount = 2) {
$data = Convert::xml2raw($this->value);
$sentences = explode('.', $data);
if(count($sentences) == 1) {
return $sentences[0] . '.';
} elseif(count($sentences) > 1) {
if(is_numeric($sentCount) && $sentCount != 0) {
if($sentCount == 1) {
$output = $sentences[0] . '. ';
} else {
for($i = 1; $i <= $sentCount-1; $i++) {
if($sentences[0]) {
$output .= $sentences[0] . '. ';
}
if($sentences[$i]) {
$output .= $sentences[$i] . '. ';
}
}
}
return $output;
}
}
}
/**
* Caution: Not XML/HTML-safe - does not respect closing tags.
@ -184,6 +222,39 @@ class Text extends DBField {
}
}
function ContextSummary($characters = 500, $string = false, $striphtml = true, $highlight = true) {
if(!$string) {
// If no string is supplied, use the string from a SearchForm
$string = $_REQUEST['Search'];
}
// Remove HTML tags so we don't have to deal with matching tags
$text = $striphtml ? $this->NoHTML() : $this->value;
// Find the search string
$position = (int) stripos($text, $string);
// We want to search string to be in the middle of our block to give it some context
$position = max(0, $position - ($characters / 2));
if($position > 0) {
// We don't want to start mid-word
$position = max((int) strrpos(substr($text, 0, $position), ' '), (int) strrpos(substr($text, 0, $position), "\n"));
}
$summary = substr($text, $position, $characters);
if($highlight) {
// Add a span around all occurences of the search term
$summary = str_ireplace($string, "<span class=\"highlight\">$string</span>", $summary);
}
// trim it, because if we counted back and found a space then there will be an extra
// space at the front
return trim($summary);
}
/**
* Allows a sub-class of TextParser to be rendered. @see TextParser for implementation details.
*/

View File

@ -1,8 +1,15 @@
<?php
/**
* @package sapphire
* @subpackage model
*/
/**
* Represents a column in the database with the type 'Time'
* @package sapphire
* @subpackage model
*/
class Time extends DBField {
function setVal($value) {

View File

@ -1,5 +1,15 @@
<?php
/**
* @package sapphire
* @subpackage model
*/
/**
* Represents a short text field.
* @package sapphire
* @subpackage model
*/
class Varchar extends DBField {
protected $size;

View File

@ -81,6 +81,17 @@ form fieldset {
line-height: normal;
}
.ComplexTableField_Popup form p.checkbox input {
margin:0pt 1px;
}
.ComplexTableField_Popup form ul.optionset {
margin: 0;
padding: 0;
}
.ComplexTableField_Popup form ul.optionset li {
margin: 4px 0;
}
.right.ComplexTableField_Popup form div.Actions input {
font-size: 11px;
margin-top: 10px;

View File

@ -37,4 +37,7 @@
}
.dropdownpopup.focused {
display: block;
}
.dropdownpopup select option {
font-size: 12px;
}

View File

@ -21,6 +21,10 @@ table.TableListField td,
.TableListField table.data td,
table.CMSList td {
border-style:none;
}
.TableListField table.data td.nolabel{
display: none;
}
table.TableField th,

View File

@ -1,9 +1,14 @@
<?php
/**
* @package cms
*/
/**
* The Notifications class allows you to create email notifications for various events.
* It lets your scripts generate a number of notifications, and delay sending of the emails until
* the end of execution, so that multiple notifications can collated together
* @package cms
*/
class Notifications extends Object {
protected static $events = array();

View File

@ -1,6 +1,14 @@
<?php
/**
* @package sapphire
* @subpackage email
*/
/**
* Stores a queued email to be sent at the given time
* @package sapphire
* @subpackage email
*/
class QueuedEmail extends DataObject {

View File

@ -1,4 +1,15 @@
<?php
/**
* @package sapphire
* @subpackage email
*/
/**
* Daily task to send queued email.
* @package sapphire
* @subpackage email
*/
class QueuedEmailDispatchTask extends DailyTask {
public function process() {

View File

@ -1,6 +1,20 @@
<?php
/**
* @package sapphire
* @subpackage filesystem
*/
/**
* Class for handling archives.
* To implement a specific archive system, create a subclass of this abstract class, and amend the implementation of Archive::open().
* @package sapphire
* @subpackage filesystem
*/
abstract class Archive extends Object {
/**
* Return an Archive object for the given file.
*/
static function open($filename) {
if(substr($filename, strlen($filename) - strlen('.tar.gz')) == '.tar.gz' ||
substr($filename, strlen($filename) - strlen('.tar.bz2')) == '.tar.bz2' ||

View File

@ -1,10 +1,18 @@
<?php
/**
* @package sapphire
* @subpackage filesystem
*/
/**
* This class handles the representation of a File within Sapphire
* Note: The files are stored in the "/assets/" directory, but sapphire
* looks at the db object to gather information about a file such as URL
*
* It then uses this for all processing functions (like image manipulation)
* @package sapphire
* @subpackage filesystem
*/
class File extends DataObject {
static $default_sort = "Name";
@ -148,7 +156,7 @@ class File extends DataObject {
/**
* Save an file passed from a form post into this object
*/
function loadUploaded($tmpFile) {
function loadUploaded($tmpFile, $folderName = 'Uploads') {
if(!is_array($tmpFile)) user_error("File::loadUploaded() Not passed an array. Most likely, the form hasn't got the right enctype", E_USER_ERROR);
if(!$tmpFile['size']) return;
@ -157,14 +165,14 @@ class File extends DataObject {
// have been uploaded.
$base = dirname(dirname($_SERVER['SCRIPT_FILENAME']));
$class = $this->class;
$parentFolder = Folder::findOrMake("Uploads");
$parentFolder = Folder::findOrMake($folderName);
// Create a folder for uploading.
if(!file_exists("$base/assets")){
mkdir("$base/assets", Filesystem::$folder_create_mask);
}
if(!file_exists("$base/assets/Uploads")){
mkdir("$base/assets/Uploads", Filesystem::$folder_create_mask);
if(!file_exists("$base/assets/$folderName")){
mkdir("$base/assets/$folderName", Filesystem::$folder_create_mask);
}
// Generate default filename
@ -173,7 +181,7 @@ class File extends DataObject {
$file = ereg_replace('-+', '-',$file);
$file = basename($file);
$file = "assets/Uploads/$file";
$file = "assets/$folderName/$file";
while(file_exists("$base/$file")) {
$i = isset($i) ? ($i+1) : 2;
@ -232,38 +240,41 @@ class File extends DataObject {
function loadallcontent() {
ini_set("max_execution_time", 50000);
// get all file objects(not folders)
$start = (int)$_GET[start];
$allFiles = DataObject::get("File", "ClassName = 'File' AND Filename LIKE '%.pdf'", "", "", "$start, 5");
$allFiles = DataObject::get("File");
$total = $allFiles->TotalItems();
$i = $start;
$i = 0;
foreach($allFiles as $file) {
$i++;
$tmp = TEMP_FOLDER;
`echo "$i / $total" > $tmp/progress`;
$file->loadContent();
$file->write();
}
Director::redirect(HTTP::setGetVar("start", $start + 5));
// run loadcontent on each one
}
/**
* Gets the content of this file and puts it in the field Content
*/
function loadContent() {
$filename = escapeshellarg($this->getFullPath());
switch(strtolower($this->getExtension())){
case 'pdf':
$filename = escapeshellarg($this->getFullPath());
$content = `pstotext $filename`;
$content = `pdftotext $filename -`;
//echo("<pre>Content for $this->Filename:\n$content</pre>");
$this->Content = $content;
$this->write();
break;
case 'doc':
$content = `catdoc $filename`;
$this->Content = $content;
break;
case 'ppt':
$content = `catppt $filename`;
$this->Content = $content;
break;
case 'txt';
$content = file_get_contents($this->FileName);
$this->Content = $content;
}
}
@ -276,7 +287,8 @@ class File extends DataObject {
}
function TreeTitle() {
return $this->Title;
if($this->hasMethod('alternateTreeTitle')) return $this->alternateTreeTitle();
else return $this->Title;
}
/**
@ -323,6 +335,8 @@ class File extends DataObject {
$brokenPage->write();
}
}
$this->loadContent();
}
/**
@ -509,7 +523,7 @@ class File extends DataObject {
* legacy code.
*/
function getExtension() {
return strtolower(substr($this->getField('Name'),strrpos($this->getField('Name'),'.')+1));
return strtolower(substr($this->getField('Filename'),strrpos($this->getField('Filename'),'.')+1));
}
function getFileType() {
$types = array(
@ -581,6 +595,13 @@ class File extends DataObject {
echo "<p>Done!";
}
/**
* Select clause for DataObject::get('File') operations/
* Stores an array, suitable for a {@link SQLQuery} object.
*/
private static $dataobject_select;
/**
* We've overridden the DataObject::get function for File so that the very large content field
* is excluded!
@ -594,8 +615,23 @@ class File extends DataObject {
$query = $this->extendedSQL($filter, $sort, $limit, $join, $having);
$baseTable = reset($query->from);
$query->select = array("$baseTable.ID","$baseTable.ClassName","$baseTable.Created","$baseTable.LastEdited","$baseTable.Name","$baseTable.Title","$baseTable.Content","$baseTable.ParentID","$baseTable.Filename","if($baseTable.ClassName,$baseTable.ClassName,'File') AS RecordClassName");
// Work out which columns we're actually going to select
// In short, we select everything except File.Content
if(!self::$dataobject_select) {
self::$dataobject_select = array();
foreach($query->select as $item) {
if($item == "`File`.*") {
$fileColumns = DB::query("SHOW FIELDS IN `File`")->column();
$columnsToAdd = array_diff($fileColumns, array('Content'));
foreach($columnsToAdd as $otherItem) self::$dataobject_select[] = '`File`.' . $otherItem;
} else {
self::$dataobject_select[] = $item;
}
}
}
$query->select = self::$dataobject_select;
$records = $query->execute();
$ret = $this->buildDataObjectSet($records, $containerClass);

View File

@ -1,5 +1,15 @@
<?php
/**
* @package sapphire
* @subpackage filesystem
*/
/**
* A collection of static methods for manipulating the filesystem.
* @package sapphire
* @subpackage filesystem
*/
class Filesystem extends Object {
public static $file_create_mask = 02775;

View File

@ -1,5 +1,15 @@
<?php
/**
* @package sapphire
* @subpackage filesystem
*/
/**
* Represents a folder in the assets directory.
* @package sapphire
* @subpackage filesystem
*/
class Folder extends File {
static $many_many = array(
@ -85,13 +95,16 @@ class Folder extends File {
// Get index of database content
$dbChildren = DataObject::get("File", "ParentID = $parentID");
if(isset($dbChildren)) {
// We don't use DataObject so that things like subsites doesn't muck with this.
$dbChildren = DB::query("SELECT * FROM File WHERE ParentID = $parentID");
$hasDbChild = array();
if($dbChildren) {
foreach($dbChildren as $dbChild) {
$hasDbChild[$dbChild->Name] = $dbChild;
$className = $dbChild['ClassName'];
$hasDbChild[$dbChild['Name']] = new $className($dbChild);
}
$unwantedDbChildren = $hasDbChild;
}
$unwantedDbChildren = $hasDbChild;
// Iterate through the actual children, correcting the database as necessary
@ -325,6 +338,92 @@ class Folder extends File {
function cmsCleanup_parentChanged(){
}
/**
* Return the FieldSet used to edit this folder in the CMS.
* You can modify this fieldset by subclassing folder, or by creating a {@link DataObjectDecorator}
* and implemeting updateCMSFields(FieldSet $fields) on that decorator.
*/
function getCMSFields() {
$nameField = ($this->ID > 0) ? new TextField("Name") : new HiddenField("Name");
$fileList = new AssetTableField(
$this,
"Files",
"File",
array("Title" => _t('AssetAdmin.TITLE', "Title"), "LinkedURL" => _t('AssetAdmin.FILENAME', "Filename")),
""
);
$fileList->setFolder($this);
$fileList->setPopupCaption(_t('AssetAdmin.VIEWEDITASSET', "View/Edit Asset"));
$nameField = ($this->ID && $this->ID != "root") ? new TextField("Name", "Folder Name") : new HiddenField("Name");
if( $this->userCanEdit() ) {
$deleteButton = new InlineFormAction('deletemarked',_t('AssetAdmin.DELSELECTED','Delete selected files'), 'delete');
$deleteButton->includeDefaultJS(false);
} else {
$deleteButton = new HiddenField('deletemarked');
}
$fields = new FieldSet(
new HiddenField("Title"),
new TabSet("Root",
new Tab(_t('AssetAdmin.FILESTAB', "Files"),
$nameField,
$fileList,
$deleteButton,
new HiddenField("FileIDs"),
new HiddenField("DestFolderID")
),
new Tab(_t('AssetAdmin.DETAILSTAB', "Details"),
new ReadonlyField("URL", _t('AssetAdmin.URL', 'URL')),
new ReadonlyField("ClassName", _t('AssetAdmin.TYPE','Type')),
new ReadonlyField("Created", _t('AssetAdmin.CREATED','First Uploaded')),
new ReadonlyField("LastEdited", _t('AssetAdmin.LASTEDITED','Last Updated'))
),
new Tab(_t('AssetAdmin.UPLOADTAB', "Upload"),
new LiteralField("UploadIframe",
$this->getUploadIframe()
)
)/* This has been disabled for now because of it's mass memory consumption
,
new Tab(_t('AssetAdmin.UNUSEDFILESTAB', "Unused files"),
new LiteralField("UnusedAssets",
"<div id=\"UnusedAssets\"><h2>"._t('AssetAdmin.UNUSEDFILESTITLE', 'Unused files')."</h2>"
),
$this->getAssetList(),
new LiteralField("UnusedThumbnails",
"</div>
<div id=\"UnusedThumbnails\">
<h2>"._t('AssetAdmin.UNUSEDTHUMBNAILSTITLE', 'Unused thumbnails')."</h2>
<button class=\"action\">"._t('AssetAdmin.DELETEUNUSEDTHUMBNAILS', 'Delete unused thumbnails')."</button>
</div>"
)
)*/
),
new HiddenField("ID")
);
$this->extend('updateCMSFields', $fields);
return $fields;
}
/**
* Display the upload form. Returns an iframe tag that will show admin/assets/uploadiframe.
*/
function getUploadIframe() {
return <<<HTML
<iframe name="AssetAdmin_upload" src="admin/assets/uploadiframe/{$this->ID}" id="AssetAdmin_upload" border="0" style="border-style: none; width: 100%; height: 200px">
</iframe>
HTML;
}
/**
* Since this is a folder, we don't have any content as such.
*/
function loadContent() {
return;
}
}

View File

@ -1,7 +1,14 @@
<?php
/**
* @package sapphire
* @subpackage filesystem
*/
/**
* A wrapper class for GD-based images, with lots of manipulation functions.
* @package sapphire
* @subpackage filesystem
*/
class GD extends Object {
protected $gd, $width, $height;

View File

@ -1,6 +1,14 @@
<?php
/**
* @package forms
* @subpackage core
*/
/**
* Writes the POST array to a file as a last-ditch effort to preserve entered data.
* @package forms
* @subpackage core
*/
class PostBackup extends Object {

View File

@ -1,5 +1,15 @@
<?php
/**
* @package sapphire
* @subpackage filesystem
*/
/**
* Implementation of .tar, .tar.gz, and .tar.bz2 archive handler.
* @package sapphire
* @subpackage filesystem
*/
class TarballArchive extends Archive {
private $filename = '';
private $compressionModifiers = '';

View File

@ -1,8 +1,15 @@
<?php
/**
* FieldEditor
* Allows CMS user to create forms dynamically
*/
/**
* @package forms
* @subpackage fieldeditor
*/
/**
* Allows CMS user to create forms dynamically.
* @package forms
* @subpackage fieldeditor
*/
class FieldEditor extends FormField {
protected $readonly = false;
@ -175,8 +182,8 @@ class FieldEditor extends FormField {
function FormOptions() {
if($this->haveFormOptions){
$fields = new FieldSet(
new EmailField( "{$this->name}[EmailTo]", "Email submission to:", $this->form->getRecord()->EmailTo ),
new CheckboxField( "{$this->name}[EmailOnSubmit]", "Email form on submit:", $this->form->getRecord()->EmailOnSubmit )
new EmailField( "{$this->name}[EmailTo]", _t('FieldEditor.EMAILSUBMISSION', 'Email submission to:'), $this->form->getRecord()->EmailTo ),
new CheckboxField( "{$this->name}[EmailOnSubmit]", _t('FieldEditor.EMAILONSUBMIT', 'Email form on submit:'), $this->form->getRecord()->EmailOnSubmit )
);
if( $this->form->getRecord()->hasMethod( 'customFormActions' ) ) {

View File

@ -1,7 +1,14 @@
<?php
/**
* @package sapphire
* @subpackage misc
*/
/**
* Base class for XML parsers
* @package sapphire
* @subpackage misc
*/
class XML extends Object {
protected $parser;

View File

@ -49,8 +49,12 @@ NumericField.prototype = {
if( testedOk ) {
this.oldValue = this.value = testValue;
// DEBUG This produces weird javascript-errors, and is not very useable at all
// DONT MERGE
/*
if( this.value.length == this.maxLength && this.nextField )
this.nextField.focus();
*/
if( this.callOnValidate )
this.callOnValidate();

View File

@ -23,14 +23,13 @@ ComplexTableFieldPopupForm.prototype = {
// only do ajaxy stuff for content loaded in an iframe
if(window != top && parent.parent.GB_hide) {
var theForm = Event.findElement(e,"form");
var submitButton = document.getElementsBySelector("input.action",theForm)[0];
if(parent.parent.statusMessage != undefined) parent.parent.statusMessage('saving');
submitButton.setAttribute("disabled","true");
var submitButton = document.getElementsBySelector("input.action",theForm)[0];
if(typeof submitButton != 'undefined') {
submitButton.disabled = true;
Element.addClassName(submitButton,'loading');
}
submitButton._oldValue = submitButton.value;
submitButton.value = ingize(submitButton.value);
Element.addClassName(submitButton,'loading');
new parent.parent.Ajax.Request(
theForm.getAttribute("action"),
{
@ -48,6 +47,7 @@ ComplexTableFieldPopupForm.prototype = {
updateTableAfterSave : function(response) {
eval(response.responseText);
var theForm = document.getElementsByTagName("form")[0];
// don't update when validation is present and failed
@ -60,18 +60,20 @@ ComplexTableFieldPopupForm.prototype = {
}
);
} else {
var submitbutton = document.getElementsBySelector("input.action",theForm)[0];
submitbutton.disabled = false;
submitButton.value = submitButton._oldValue;
Element.removeClassName(submitButton,'loading');
var submitButton = document.getElementsBySelector("input.action",theForm)[0];
if(typeof submitButton != 'undefined') {
submitButton.disabled = false;
Element.removeClassName(submitButton,'loading');
}
}
},
ajaxErrorHandler: function(response) {
var submitButton = document.getElementsBySelector("form input.action")[0];
submitButton.disabled = false;
submitButton.value = submitButton._oldValue;
Element.removeClassName(submitButton,'loading');
var submitButton = document.getElementsBySelector("input.action",theForm)[0];
if(typeof submitButton != 'undefined') {
submitButton.disabled = false;
Element.removeClassName(submitButton,'loading');
}
// TODO does not work due to sandbox-iframe restrictions?
if(typeof(parent.parent.ajaxErrorHandler) == 'function') {
@ -85,9 +87,10 @@ ComplexTableFieldPopupForm.prototype = {
var theForm =document.getElementsByTagName("form")[0];
var submitButton = document.getElementsBySelector("input.action",theForm)[0];
submitButton.disabled = false;
submitButton.value = submitButton._oldValue;
Element.removeClassName(submitButton,'loading');
if(typeof submitButton != 'undefined') {
submitButton.disabled = false;
Element.removeClassName(submitButton,'loading');
}
// TODO Fix DOM-relation after pagination inside popup
if(this.GB_OpenerObj) {

View File

@ -4,11 +4,13 @@ var checkedListField = 'selected';
var checkedArray = null;
Event.observe( window, 'load', function() {
if($('sitetree')) {
$('sitetree').observeMethod( 'NodeClicked' , function() {
checkedListNameArray = null;
checkedArray = null;
} );
if($('sitetree')){
if(typeof $('sitetree').observeMethod != 'undefined') {
$('sitetree').observeMethod( 'NodeClicked' , function() {
checkedListNameArray = null;
checkedArray = null;
} );
}
}
} );
@ -24,13 +26,14 @@ RelationComplexTableField.prototype = {
// 2) Initialize The Array Or Update The Hidden Input Field And The HTML Table
var checkedListName = checkedList.getAttribute( 'name' );
if( checkedListNameArray == null ) {
//if( checkedListNameArray == null ) {
checkedListNameArray = [];
checkedListNameArray.push( checkedListName );
checkedArray = [];
if( checkedList.getAttribute( 'value' ) )
checkedArray.push( checkedList.getAttribute( 'value' ).split( ',' ) );
}
//}
/*
else if( checkedListNameArray.indexOf( checkedListName ) < 0 ) {
checkedListNameArray.push( checkedListName );
if( checkedList.getAttribute( 'value' ) )
@ -55,7 +58,7 @@ RelationComplexTableField.prototype = {
else
markingInput.removeAttribute( 'checked' );
}
}
} */
// 3) Create The Rules
@ -111,4 +114,4 @@ RelationComplexTableField.prototype = {
RelationComplexTableField.applyTo('#Form_EditForm div.HasOneComplexTableField');
RelationComplexTableField.applyTo('#Form_EditForm div.HasManyComplexTableField');
RelationComplexTableField.applyTo('#Form_EditForm div.ManyManyComplexTableField');
RelationComplexTableField.applyTo('#Form_EditForm div.ManyManyComplexTableField');

View File

@ -12,6 +12,10 @@ TableListField.prototype = {
onclick: this.deleteRecord.bind(this)
};
rules['#'+this.id+' th a'] = {
onclick: this.paginate.bind(this)
};
rules['#'+this.id+' th'] = {
initialize: function() {
var sortLinks = $$('span.sortLinkHidden a', this);
@ -269,4 +273,4 @@ TableListRecord.prototype = {
}
//TableListRecord.applyTo('div.TableListField tr');
TableListField.applyTo('div.TableListField');
TableListField.applyTo('div.TableListField');

View File

@ -42,12 +42,18 @@ function clearErrorMessage(holderDiv){
Element.hide(el);
});
}
$$('div.validationError', holderDiv.parentNode).each(function(el) {
Element.removeClassName(el,'validationError');
});
}
function clearAllErrorMessages() {
$$('span.message').each(function(el) {
Element.hide(el);
});
$$('div.validationError').each(function(el) {
Element.removeClassName(el,'validationError');
});
}
function require(fieldName,cachedError) {
@ -95,8 +101,6 @@ function require(fieldName,cachedError) {
var set = el.value;
}
var baseEl;
// Sometimes require events are triggered of
@ -132,7 +136,7 @@ function require(fieldName,cachedError) {
}
// This checks to see if the input has a value, and the field is not a readonly.
if((typeof set == 'undefined' || set == "")) {
if( ( typeof set == 'undefined' || (typeof(set) == 'string' && set.match(/^\s*$/)) ) ) {
//fieldgroup validation
var fieldLabel = findParentLabel(baseEl);
@ -251,6 +255,10 @@ function validationError(field,message, messageClass, cacheError) {
validationMessage.className = "message " + messageClass;
validationMessage.innerHTML = message;
validationMessage.style.display = "block";
// Set Classname on holder
var holder = document.getParentOfElement(field,'div','field');
Element.addClassName(holder, 'validationError');
}
/**

View File

@ -4,7 +4,11 @@ i18n::include_locale_file('sapphire', 'en_US');
global $lang;
$lang['bg_BG'] = $lang['en_US'];
if(array_key_exists('bg_BG', $lang) && is_array($lang['bg_BG'])) {
$lang['bg_BG'] = array_merge($lang['en_US'], $lang['bg_BG']);
} else {
$lang['bg_BG'] = $lang['en_US'];
}
$lang['bg_BG']['BasicAuth']['ENTERINFO'] = 'Моля, въведете потребителско име и парола.';
$lang['bg_BG']['BasicAuth']['ERRORNOTADMIN'] = 'Този потребител не е администратор.';

View File

@ -4,7 +4,11 @@ i18n::include_locale_file('sapphire', 'en_US');
global $lang;
$lang['cs_CZ'] = $lang['en_US'];
if(array_key_exists('cs_CZ', $lang) && is_array($lang['cs_CZ'])) {
$lang['cs_CZ'] = array_merge($lang['en_US'], $lang['cs_CZ']);
} else {
$lang['cs_CZ'] = $lang['en_US'];
}
$lang['cs_CZ']['BasicAuth']['ENTERINFO'] = 'Prosím zadejte uživatelské jméno a heslo.';
$lang['cs_CZ']['BasicAuth']['ERRORNOTADMIN'] = 'Tento uživatel není administrátor.';

View File

@ -4,7 +4,11 @@ i18n::include_locale_file('sapphire', 'en_US');
global $lang;
$lang['de_DE'] = $lang['en_US'];
if(array_key_exists('de_DE', $lang) && is_array($lang['de_DE'])) {
$lang['de_DE'] = array_merge($lang['en_US'], $lang['de_DE']);
} else {
$lang['de_DE'] = $lang['en_US'];
}
$lang['de_DE']['BasicAuth']['ENTERINFO'] = 'Bitte geben Sie einen Nutzernamen und ein Passwort ein';
$lang['de_DE']['BasicAuth']['ERRORNOTADMIN'] = 'Dieser Nutzer ist kein Administrator';

View File

@ -25,12 +25,6 @@ $lang['en_US']['ImageUploader']['DELETE'] = array(
PR_MEDIUM,
'Delete file/image'
);
$lang['en_US']['ImageUploader']['CLICKREMOVE'] = array(
'Click the button below to remove this %s.',
PR_MEDIUM,
'... this image/file'
);
$lang['en_US']['ImageUploader']['REALLYDELETE'] = 'Do you really want to remove this %s?';
$lang['en_US']['RedirectorPage']['HEADER'] = 'This page will redirect users to another page';
$lang['en_US']['RedirectorPage']['REDIRECTTO'] = 'Redirect to';
@ -350,4 +344,47 @@ $lang['en_US']['ChangePasswordEmail.ss']['CHANGEPASSWORDTEXT1'] = array(
$lang['en_US']['ChangePasswordEmail.ss']['CHANGEPASSWORDTEXT2'] = 'You can now use the following credentials to log in:';
$lang['en_US']['ForgotPasswordEmail.ss']['HELLO'] = 'Hi';
// New2
$lang['en_US']['TableField.ss']['ADD'] = 'Add a new row';
$lang['en_US']['TableField.ss']['ADDITEM'] = 'Add';
$lang['en_US']['TableField.ss']['DELETEROW'] = 'Delete this row';
$lang['en_US']['TableField.ss']['DELETE'] = 'delete';
$lang['en_US']['Security']['MEMBERALREADYEXISTS'] = 'There already exists a member with this identity URL';
$lang['en_US']['Security']['OPENIDURL'] = 'OpenID URL/i-name';
$lang['en_US']['Security']['OPENIDDESC'] = '<p>Make sure you enter your normalized OpenID/i-name credentials
here, i.e. with protocol and trailing slash for OpenID (e.g. http://openid.silverstripe.com/).</p>';
$lang['en_US']['Security']['OPENIDHEADER'] = 'OpenID/i-name credentials';
$lang['en_US']['Security']['EDITOPENIDURL'] = 'OpenID URL/i-name (e.g. http://openid.silverstripe.com/)';
$lang['en_US']['Security']['OPENIDURLNORMALIZATION'] = '<p>Make sure you enter your normalized OpenID/i-name credentials
here, i.e. with protocol and trailing slash for OpenID (e.g. http://openid.silverstripe.com/).</p>';
$lang['en_US']['TableListField']['CSVEXPORT'] = 'Export to CSV';
$lang['en_US']['TableListField']['PRINT'] = 'Print';
$lang['en_US']['Permission']['FULLADMINRIGHTS'] = 'Full administrative rights';
$lang['en_US']['Page']['CLASSNAME'] = 'Page';
$lang['en_US']['Statistics']['TRENDS'] = 'Trends';
$lang['en_US']['Statistics']['LEGEND'] = 'Legend';
$lang['en_US']['Statistics']['BROWSERS'] = 'Browsers';
$lang['en_US']['Statistics']['ID'] = 'ID';
$lang['en_US']['Statistics']['EMAIL'] = 'Email';
$lang['en_US']['Statistics']['JOINED'] = 'Joined';
$lang['en_US']['Statistics']['REGISTEREDUSERS'] = 'Registered Users';
$lang['en_US']['Statistics']['CSVEXPORT'] = 'Export as CSV';
$lang['en_US']['Statistics']['RECENTPAGEVIEWS'] = 'Recent Page Views';
$lang['en_US']['Statistics']['TIME'] = 'Time';
$lang['en_US']['Statistics']['BROWSER'] = 'Browser';
$lang['en_US']['Statistics']['OSABREV'] = 'OS';
$lang['en_US']['Statistics']['USER'] = 'User';
$lang['en_US']['Statistics']['PAGE'] = 'Page';
$lang['en_US']['Statistics']['PAGEVIEWS'] = 'Page Views';
$lang['en_US']['Statistics']['OS'] = 'Operating Systems';
$lang['en_US']['Statistics']['USERACTIVITY'] = 'User Activity';
?>

View File

@ -4,7 +4,11 @@ i18n::include_locale_file('sapphire', 'en_US');
global $lang;
$lang['es_ES'] = $lang['en_US'];
if(array_key_exists('es_ES', $lang) && is_array($lang['es_ES'])) {
$lang['es_ES'] = array_merge($lang['en_US'], $lang['es_ES']);
} else {
$lang['es_ES'] = $lang['en_US'];
}
$lang['es_ES']['BasicAuth']['ENTERINFO'] = 'Por favor introduzca su nombre de usuario y contraseña.';
$lang['es_ES']['BasicAuth']['ERRORNOTADMIN'] = 'Ese usuario no es un administrador.';

View File

@ -4,7 +4,11 @@ i18n::include_locale_file('sapphire', 'en_US');
global $lang;
$lang['fr_FR'] = $lang['en_US'];
if(array_key_exists('fr_FR', $lang) && is_array($lang['fr_FR'])) {
$lang['fr_FR'] = array_merge($lang['en_US'], $lang['fr_FR']);
} else {
$lang['fr_FR'] = $lang['en_US'];
}
$lang['fr_FR']['BasicAuth']['ENTERINFO'] = 'Entrer un identifiant et un mot de passe s\'il vous plaît.';
$lang['fr_FR']['BasicAuth']['ERRORNOTADMIN'] = 'Cet utilisateur n\'est pas un administrateur.';
@ -22,6 +26,7 @@ $lang['fr_FR']['ComplexTableField.ss']['SORTASC'] = 'Tri croissant';
$lang['fr_FR']['ComplexTableField.ss']['SORTDESC'] = 'Tri décroissant';
$lang['fr_FR']['ComplexTableField_popup.ss']['NEXT'] = 'Suivant';
$lang['fr_FR']['ComplexTableField_popup.ss']['PREVIOUS'] = 'Précédent';
$lang['fr_FR']['ContentController']['DRAFT_SITE_ACCESS_RESTRICTION'] = 'Vous devez vous authentifier avec votre mot de passe CMS afin de pouvoir consulter le contenu brouillon ou archivé. <a href="%s">Cliquer ici pour revenir au site publié.</a>';
$lang['fr_FR']['Controller']['FILE'] = 'Fichier';
$lang['fr_FR']['Controller']['IMAGE'] = 'Image';
$lang['fr_FR']['Date']['AGO'] = 'auparavant';
@ -239,6 +244,7 @@ $lang['fr_FR']['SiteTree']['PAGETITLE'] = 'Nom de la page';
$lang['fr_FR']['SiteTree']['PAGETYPE'] = 'Type de page';
$lang['fr_FR']['SiteTree']['PRIORITYLEASTIMPORTANT'] = 'Moins importante';
$lang['fr_FR']['SiteTree']['PRIORITYMOSTIMPORTANT'] = 'Plus importante';
$lang['fr_FR']['SiteTree']['PRIORITYNOTINDEXED'] = 'Non indexé';
$lang['fr_FR']['SiteTree']['REMOVEDFROMDRAFT'] = 'Supprimé du site brouillon';
$lang['fr_FR']['SiteTree']['SHOWINMENUS'] = 'Afficher dans les menus ?';
$lang['fr_FR']['SiteTree']['SHOWINSEARCH'] = 'Afficher dans les recherches ?';

View File

@ -4,7 +4,11 @@ i18n::include_locale_file('sapphire', 'en_US');
global $lang;
$lang['hr_HR'] = $lang['en_US'];
if(array_key_exists('hr_HR', $lang) && is_array($lang['hr_HR'])) {
$lang['hr_HR'] = array_merge($lang['en_US'], $lang['hr_HR']);
} else {
$lang['hr_HR'] = $lang['en_US'];
}
$lang['hr_HR']['BasicAuth']['ENTERINFO'] = 'Unesite korisničko ime i lozinu';
$lang['hr_HR']['BasicAuth']['ERRORNOTADMIN'] = 'Korisnik nije administrator';
@ -22,6 +26,7 @@ $lang['hr_HR']['ComplexTableField.ss']['SORTASC'] = 'Sortiraj (ascending)';
$lang['hr_HR']['ComplexTableField.ss']['SORTDESC'] = 'Sortiraj (descending)';
$lang['hr_HR']['ComplexTableField_popup.ss']['NEXT'] = 'Slijedeći';
$lang['hr_HR']['ComplexTableField_popup.ss']['PREVIOUS'] = 'Prethodni';
$lang['hr_HR']['ContentController']['DRAFT_SITE_ACCESS_RESTRICTION'] = 'Morate biti prijavljeni sa vašom CMS zaporkom kako bi ste mogli vidjeti privremeni ili arhivirani sadržaj. <a href="%s">Kliknite kako bi ste se vratili na objavljen dio stranice</a>';
$lang['hr_HR']['Controller']['FILE'] = 'Datoteka';
$lang['hr_HR']['Controller']['IMAGE'] = 'Slika';
$lang['hr_HR']['Date']['AGO'] = 'prije';
@ -70,6 +75,9 @@ $lang['hr_HR']['HtmlEditorField']['BUTTONALIGNLEFT'] = 'Lijevo poravnanje';
$lang['hr_HR']['HtmlEditorField']['BUTTONALIGNRIGHT'] = 'Desno poravnanje';
$lang['hr_HR']['HtmlEditorField']['BUTTONBOLD'] = 'Bold (Ctrl+B)';
$lang['hr_HR']['HtmlEditorField']['BUTTONCANCEL'] = 'Otkaži';
$lang['hr_HR']['HtmlEditorField']['BUTTONEDITIMAGE'] = 'Uredi sliku';
$lang['hr_HR']['HtmlEditorField']['BUTTONINSERTFLASH'] = 'Umetni Flash';
$lang['hr_HR']['HtmlEditorField']['BUTTONINSERTIMAGE'] = 'Umetni sliku';
$lang['hr_HR']['HtmlEditorField']['BUTTONINSERTLINK'] = 'Ubaci vezu';
$lang['hr_HR']['HtmlEditorField']['BUTTONITALIC'] = 'Italic (Ctrl+I)';
$lang['hr_HR']['HtmlEditorField']['BUTTONREMOVELINK'] = 'Obriši vezu';
@ -77,6 +85,7 @@ $lang['hr_HR']['HtmlEditorField']['BUTTONSTRIKE'] = 'strikethrough';
$lang['hr_HR']['HtmlEditorField']['BUTTONUNDERLINE'] = 'Underline (Ctrl+U)';
$lang['hr_HR']['HtmlEditorField']['CHARMAP'] = 'Ubaci simbol';
$lang['hr_HR']['HtmlEditorField']['COPY'] = 'Copy (Ctrl+C)';
$lang['hr_HR']['HtmlEditorField']['CREATEFOLDER'] = 'izradite mapu ( direktorij )';
$lang['hr_HR']['HtmlEditorField']['CSSCLASS'] = 'Poravnanje / Stil';
$lang['hr_HR']['HtmlEditorField']['CSSCLASSCENTER'] = 'Centralno';
$lang['hr_HR']['HtmlEditorField']['CSSCLASSLEFT'] = 'Lijevo, sa okruženjem teksta.';
@ -89,6 +98,7 @@ $lang['hr_HR']['HtmlEditorField']['EMAIL'] = 'Email adresa';
$lang['hr_HR']['HtmlEditorField']['FILE'] = 'Datoteka';
$lang['hr_HR']['HtmlEditorField']['FLASH'] = 'Ubaci flash';
$lang['hr_HR']['HtmlEditorField']['FOLDER'] = 'Direktorij';
$lang['hr_HR']['HtmlEditorField']['FOLDERCANCEL'] = 'prekini';
$lang['hr_HR']['HtmlEditorField']['FORMATADDR'] = 'Adresa';
$lang['hr_HR']['HtmlEditorField']['FORMATH1'] = 'Naslov 1 (h1)';
$lang['hr_HR']['HtmlEditorField']['FORMATH2'] = 'Naslov 2 (h2)';
@ -116,6 +126,7 @@ $lang['hr_HR']['HtmlEditorField']['LINKFILE'] = 'Downlad datoteke';
$lang['hr_HR']['HtmlEditorField']['LINKINTERNAL'] = 'Stranicu na ovom webu';
$lang['hr_HR']['HtmlEditorField']['LINKOPENNEWWIN'] = 'Otvori vezu (link) u novom prozoru?';
$lang['hr_HR']['HtmlEditorField']['LINKTO'] = 'Poveži na';
$lang['hr_HR']['HtmlEditorField']['OK'] = 'uredu';
$lang['hr_HR']['HtmlEditorField']['OL'] = 'Numbered list (OL)';
$lang['hr_HR']['HtmlEditorField']['OUTDENT'] = 'Smanji uvlačenje';
$lang['hr_HR']['HtmlEditorField']['PAGE'] = 'Stranica';
@ -123,6 +134,7 @@ $lang['hr_HR']['HtmlEditorField']['PASTE'] = 'Paste (Ctrl+V)';
$lang['hr_HR']['HtmlEditorField']['REDO'] = 'Redo (Ctrl+Y)';
$lang['hr_HR']['HtmlEditorField']['UNDO'] = 'Undo (Ctrl+Z)';
$lang['hr_HR']['HtmlEditorField']['UNLINK'] = 'Obriši link';
$lang['hr_HR']['HtmlEditorField']['UPLOAD'] = 'postavi';
$lang['hr_HR']['HtmlEditorField']['URL'] = 'URL';
$lang['hr_HR']['HtmlEditorField']['VISUALAID'] = 'Pokaži/Sakrij vodilice';
$lang['hr_HR']['ImageField']['NOTEADDIMAGES'] = 'Slike možete dodavati nakon što spremite prvi put.';
@ -230,6 +242,9 @@ $lang['hr_HR']['SiteTree']['NOTEUSEASHOMEPAGE'] = 'Koristi ovu stranicu kao poč
$lang['hr_HR']['SiteTree']['PAGESLINKING'] = 'Slijedeće stranice su vezane na ovu:';
$lang['hr_HR']['SiteTree']['PAGETITLE'] = 'Ime stranice';
$lang['hr_HR']['SiteTree']['PAGETYPE'] = 'Vrsta stranice';
$lang['hr_HR']['SiteTree']['PRIORITYLEASTIMPORTANT'] = 'Nebitno';
$lang['hr_HR']['SiteTree']['PRIORITYMOSTIMPORTANT'] = 'Najvažnije';
$lang['hr_HR']['SiteTree']['PRIORITYNOTINDEXED'] = 'Nije zapisano ( Indeksirano )';
$lang['hr_HR']['SiteTree']['REMOVEDFROMDRAFT'] = 'Obrisano sa privremene stranice';
$lang['hr_HR']['SiteTree']['SHOWINMENUS'] = 'Pokaži u izbornicima?';
$lang['hr_HR']['SiteTree']['SHOWINSEARCH'] = 'Pokaži u tražilici?';

View File

@ -4,7 +4,11 @@ i18n::include_locale_file('sapphire', 'en_US');
global $lang;
$lang['hu_HU'] = $lang['en_US'];
if(array_key_exists('hu_HU', $lang) && is_array($lang['hu_HU'])) {
$lang['hu_HU'] = array_merge($lang['en_US'], $lang['hu_HU']);
} else {
$lang['hu_HU'] = $lang['en_US'];
}
$lang['hu_HU']['BasicAuth']['ENTERINFO'] = 'Kérünk, ajd meg egy felhasználónevet és jelszót.';
$lang['hu_HU']['BasicAuth']['ERRORNOTADMIN'] = 'Ez a felhasználó nem adminisztrátor. ';

View File

@ -4,7 +4,11 @@ i18n::include_locale_file('sapphire', 'en_US');
global $lang;
$lang['it_IT'] = $lang['en_US'];
if(array_key_exists('it_IT', $lang) && is_array($lang['it_IT'])) {
$lang['it_IT'] = array_merge($lang['en_US'], $lang['it_IT']);
} else {
$lang['it_IT'] = $lang['en_US'];
}
$lang['it_IT']['BasicAuth']['ENTERINFO'] = 'Per favore inserisci un nome utente e la password.';
$lang['it_IT']['BasicAuth']['ERRORNOTADMIN'] = 'Questo utente non è amministratore.';

View File

@ -4,7 +4,11 @@ i18n::include_locale_file('sapphire', 'en_US');
global $lang;
$lang['nl_NL'] = $lang['en_US'];
if(array_key_exists('nl_NL', $lang) && is_array($lang['nl_NL'])) {
$lang['nl_NL'] = array_merge($lang['en_US'], $lang['nl_NL']);
} else {
$lang['nl_NL'] = $lang['en_US'];
}
$lang['nl_NL']['BasicAuth']['ENTERINFO'] = 'Voer een gebruikers naam en wachtwoord in.';
$lang['nl_NL']['BasicAuth']['ERRORNOTADMIN'] = 'Die gebruiker is geen beheerder.';

View File

@ -4,7 +4,11 @@ i18n::include_locale_file('sapphire', 'en_US');
global $lang;
$lang['pl_PL'] = $lang['en_US'];
if(array_key_exists('pl_PL', $lang) && is_array($lang['pl_PL'])) {
$lang['pl_PL'] = array_merge($lang['en_US'], $lang['pl_PL']);
} else {
$lang['pl_PL'] = $lang['en_US'];
}
$lang['pl_PL']['BasicAuth']['ENTERINFO'] = 'Wprowadź username i hasło';
$lang['pl_PL']['BasicAuth']['ERRORNOTADMIN'] = 'Ten użytkownik nie jest administratorem';
@ -22,6 +26,7 @@ $lang['pl_PL']['ComplexTableField.ss']['SORTASC'] = 'Sortuj rosnąco';
$lang['pl_PL']['ComplexTableField.ss']['SORTDESC'] = 'Sortuj malejąco';
$lang['pl_PL']['ComplexTableField_popup.ss']['NEXT'] = 'Następny';
$lang['pl_PL']['ComplexTableField_popup.ss']['PREVIOUS'] = 'Poprzedni';
$lang['pl_PL']['ContentController']['DRAFT_SITE_ACCESS_RESTRICTION'] = 'Musisz zalogować się za pomocą swojego hasła do CMSa, aby obejrzeć brudnopis i zarchiwizowaną treść. <a href="%s">Kliknij tutaj aby powrócić do opublikowanej strony.</a>';
$lang['pl_PL']['Controller']['FILE'] = 'Plik';
$lang['pl_PL']['Controller']['IMAGE'] = 'Obraz';
$lang['pl_PL']['Date']['AGO'] = 'temu';
@ -30,7 +35,7 @@ $lang['pl_PL']['Date']['DAY'] = 'dzień';
$lang['pl_PL']['Date']['DAYS'] = 'dni';
$lang['pl_PL']['Date']['HOUR'] = 'godzina';
$lang['pl_PL']['Date']['HOURS'] = 'godziny';
$lang['pl_PL']['Date']['MIN'] = 'minuta';
$lang['pl_PL']['Date']['MIN'] = 'min';
$lang['pl_PL']['Date']['MINS'] = 'minuty';
$lang['pl_PL']['Date']['MONTH'] = 'miesiąc';
$lang['pl_PL']['Date']['MONTHS'] = 'miesiące';
@ -41,7 +46,7 @@ $lang['pl_PL']['Date']['YEARS'] = 'lata';
$lang['pl_PL']['DateField']['VALIDDATEFORMAT'] = 'Proszę podać prawidłowy format daty (DD/MM/RRRR).';
$lang['pl_PL']['DropdownField']['CHOOSE'] = '(wybierz)';
$lang['pl_PL']['EmailField']['VALIDATION'] = 'Wprowadź adres e-mail';
$lang['pl_PL']['ErrorPage']['CODE'] = 'Błąd kodu';
$lang['pl_PL']['ErrorPage']['CODE'] = 'Kod błędu';
$lang['pl_PL']['FileIframeField']['NOTEADDFILES'] = 'Możesz dodać tylko jeden plik za pierwszym razem';
$lang['pl_PL']['ForgotPasswordEmail.ss']['HELLO'] = 'Cześć';
$lang['pl_PL']['Form']['DATENOTSET'] = '(brak ustawionej daty)';
@ -50,6 +55,7 @@ $lang['pl_PL']['Form']['LANGAOTHER'] = 'Inny język';
$lang['pl_PL']['Form']['LANGAVAIL'] = 'Dostępne języki';
$lang['pl_PL']['Form']['NOTSET'] = '(nie ustawiono)';
$lang['pl_PL']['Form']['SAVECHANGES'] = 'Zachowaj zmiany';
$lang['pl_PL']['Form']['VALIDATIONALLDATEVALUES'] = 'Proszę się upewnić, czy wartości wszystkich dat zostały ustawione';
$lang['pl_PL']['Form']['VALIDATIONBANKACC'] = 'Proszę podać prawidłowy numer bankowy';
$lang['pl_PL']['Form']['VALIDATIONCREDITNUMBER'] = 'Upewnij się, że wprowadzono prawidłowy numer karty kredytowej %s';
$lang['pl_PL']['Form']['VALIDATIONFAILED'] = 'Walidacja nie powiodła się';
@ -57,6 +63,8 @@ $lang['pl_PL']['Form']['VALIDATIONNOTUNIQUE'] = 'Wprowadzona wartość nie jest
$lang['pl_PL']['Form']['VALIDATIONPASSWORDSDONTMATCH'] = 'Hasła nie są takie same';
$lang['pl_PL']['Form']['VALIDATIONPASSWORDSNOTEMPTY'] = 'Hasło nie może być puste';
$lang['pl_PL']['Form']['VALIDATIONSTRONGPASSWORD'] = 'Hasło musi posiadać jeden unikalny znak';
$lang['pl_PL']['Form']['VALIDCURRENCY'] = 'Proszę wpisać prawidłową walutę.';
$lang['pl_PL']['GhostPage']['NOLINKED'] = 'Ta wirtualna witryna nie jest połączona z żadną stroną.';
$lang['pl_PL']['GSTNumberField']['VALIDATION'] = 'Proszę wprowadzić poprawny numer GST';
$lang['pl_PL']['HtmlEditorField']['ALTTEXT'] = 'Opis';
$lang['pl_PL']['HtmlEditorField']['ANCHOR'] = 'Wstaw/edytuj kotwicę';
@ -73,12 +81,13 @@ $lang['pl_PL']['HtmlEditorField']['BUTTONINSERTIMAGE'] = 'Wstaw obraz';
$lang['pl_PL']['HtmlEditorField']['BUTTONINSERTLINK'] = 'Wstaw link';
$lang['pl_PL']['HtmlEditorField']['BUTTONITALIC'] = 'Kursywa (Ctrl+I)';
$lang['pl_PL']['HtmlEditorField']['BUTTONREMOVELINK'] = 'Zmień link';
$lang['pl_PL']['HtmlEditorField']['BUTTONSTRIKE'] = 'przez uderzenie';
$lang['pl_PL']['HtmlEditorField']['BUTTONSTRIKE'] = 'przekreślenie';
$lang['pl_PL']['HtmlEditorField']['BUTTONUNDERLINE'] = 'Podkreślenie (Ctrl+U)';
$lang['pl_PL']['HtmlEditorField']['CHARMAP'] = 'Wstaw symbol';
$lang['pl_PL']['HtmlEditorField']['COPY'] = 'Kopiuj (Ctrl+C)';
$lang['pl_PL']['HtmlEditorField']['CREATEFOLDER'] = 'utwórz folder';
$lang['pl_PL']['HtmlEditorField']['CSSCLASS'] = 'Wyrównanie/styl';
$lang['pl_PL']['HtmlEditorField']['CSSCLASSCENTER'] = 'Wyśrodkowane';
$lang['pl_PL']['HtmlEditorField']['CSSCLASSLEFT'] = 'Tekst po lewej';
$lang['pl_PL']['HtmlEditorField']['CSSCLASSRIGHT'] = 'Tekst po prawej';
$lang['pl_PL']['HtmlEditorField']['CUT'] = 'Wytnij (Ctrl+X)';
@ -103,6 +112,7 @@ $lang['pl_PL']['HtmlEditorField']['IMAGE'] = 'Wstaw obraz';
$lang['pl_PL']['HtmlEditorField']['IMAGEDIMENSIONS'] = 'Rozmiar';
$lang['pl_PL']['HtmlEditorField']['IMAGEHEIGHTPX'] = 'Wysokość (px)';
$lang['pl_PL']['HtmlEditorField']['IMAGEWIDTHPX'] = 'Szerokość (px)';
$lang['pl_PL']['HtmlEditorField']['INDENT'] = 'Zwiększ wcięcie';
$lang['pl_PL']['HtmlEditorField']['INSERTCOLAFTER'] = 'Wstaw kolumnę później';
$lang['pl_PL']['HtmlEditorField']['INSERTCOLBEF'] = 'Wstaw kolumnę wcześniej';
$lang['pl_PL']['HtmlEditorField']['INSERTROWAFTER'] = 'Wstaw rząd później';
@ -113,20 +123,21 @@ $lang['pl_PL']['HtmlEditorField']['LINKDESCR'] = 'Opis linku';
$lang['pl_PL']['HtmlEditorField']['LINKEMAIL'] = 'Adres e-mail';
$lang['pl_PL']['HtmlEditorField']['LINKEXTERNAL'] = 'Inna strona';
$lang['pl_PL']['HtmlEditorField']['LINKFILE'] = 'Pobierz plik';
$lang['pl_PL']['HtmlEditorField']['LINKINTERNAL'] = 'Strona na Twojej stronie www';
$lang['pl_PL']['HtmlEditorField']['LINKINTERNAL'] = 'Strona na tej witrynie';
$lang['pl_PL']['HtmlEditorField']['LINKOPENNEWWIN'] = 'Otworzyć link w nowym oknie?';
$lang['pl_PL']['HtmlEditorField']['LINKTO'] = 'Linkuj do';
$lang['pl_PL']['HtmlEditorField']['OK'] = 'ok';
$lang['pl_PL']['HtmlEditorField']['OL'] = 'Numeracja';
$lang['pl_PL']['HtmlEditorField']['OL'] = 'Lista numerowana';
$lang['pl_PL']['HtmlEditorField']['OUTDENT'] = 'Zmniejsz odstęp';
$lang['pl_PL']['HtmlEditorField']['PAGE'] = 'Strona';
$lang['pl_PL']['HtmlEditorField']['PASTE'] = 'Wklej (Ctrl+V)';
$lang['pl_PL']['HtmlEditorField']['REDO'] = 'Przywróć (Ctrl+Y)';
$lang['pl_PL']['HtmlEditorField']['UNDO'] = 'Cofnięcie (Ctrl+Z)';
$lang['pl_PL']['HtmlEditorField']['UNDO'] = 'Cofnij (Ctrl+Z)';
$lang['pl_PL']['HtmlEditorField']['UNLINK'] = 'Zmień link';
$lang['pl_PL']['HtmlEditorField']['UPLOAD'] = 'wgraj';
$lang['pl_PL']['HtmlEditorField']['URL'] = 'URL';
$lang['pl_PL']['HtmlEditorField']['VISUALAID'] = 'Pokaż/schowaj wytyczne';
$lang['pl_PL']['ImageField']['NOTEADDIMAGES'] = 'Możesz dodać jedno zdjęcie zachowane za pierwszym razem';
$lang['pl_PL']['ImageField']['NOTEADDIMAGES'] = 'Po pierwszym zapisie można dodawać zdjęcia.';
$lang['pl_PL']['ImageUplaoder']['ONEFROMFILESTORE'] = 'W jednym z folderów strony';
$lang['pl_PL']['ImageUploader']['ATTACH'] = 'Załącz %s';
$lang['pl_PL']['ImageUploader']['DELETE'] = 'Usuń %s';
@ -135,6 +146,7 @@ $lang['pl_PL']['ImageUploader']['FROMFILESTORE'] = 'Ze schowka plików';
$lang['pl_PL']['ImageUploader']['ONEFROMCOMPUTER'] = 'na jednym z twoich komputerów';
$lang['pl_PL']['ImageUploader']['REALLYDELETE'] = 'Naprawdę chcesz usunąć ten %s?';
$lang['pl_PL']['ImageUploader']['REPLACE'] = 'Zastąp %s';
$lang['pl_PL']['Image_iframe.ss']['TITLE'] = 'Ładowanie Zdjęć (Iframe)';
$lang['pl_PL']['Member']['ADDRESS'] = 'Adres';
$lang['pl_PL']['Member']['BUTTONCHANGEPASSWORD'] = 'Zmień hasło';
$lang['pl_PL']['Member']['BUTTONLOGIN'] = 'Zalogowany';
@ -144,7 +156,7 @@ $lang['pl_PL']['Member']['CONFIRMNEWPASSWORD'] = 'Potwierdź nowe hasło';
$lang['pl_PL']['Member']['CONFIRMPASSWORD'] = 'Potwierdź hasło';
$lang['pl_PL']['Member']['CONTACTINFO'] = 'Informacja kontaktowa';
$lang['pl_PL']['Member']['EMAIL'] = 'E-mail';
$lang['pl_PL']['Member']['EMAILPASSWORDAPPENDIX'] = 'Twoje hasło zostało zmienione. Zatrzyaj tego maila do przyszłych potwierdzeń';
$lang['pl_PL']['Member']['EMAILPASSWORDAPPENDIX'] = 'Twoje hasło zostało zmienione. Zatrzymaj tego maila do przyszłych potwierdzeń';
$lang['pl_PL']['Member']['EMAILPASSWORDINTRO'] = 'Oto Twoje nowe hasło';
$lang['pl_PL']['Member']['EMAILSIGNUPINTRO1'] = 'Dziękujemy za rejestrację jako nowy użytkownik, szczegóły możesz zobaczyć poniżej w celu przyszłego potwierdzenia';
$lang['pl_PL']['Member']['EMAILSIGNUPINTRO2'] = 'Możesz sie zalogować na tę stronę używając danych z listy poniżej';
@ -174,6 +186,7 @@ $lang['pl_PL']['Member']['YOUROLDPASSWORD'] = 'Twoje stare hasło';
$lang['pl_PL']['MemberAuthenticator']['TITLE'] = 'E-mail i Hasło';
$lang['pl_PL']['NumericField']['VALIDATION'] = '\'%s\' nie jest liczbą, tylko liczby są akceptowane przez to pole';
$lang['pl_PL']['PhoneNumberField']['VALIDATION'] = 'Wprowadź poprawny numer telefonu';
$lang['pl_PL']['RedirectorPage']['HASBEENSETUP'] = 'Strona przekierowująca została ustawiona bez celu, do którego ma przekierowywać.';
$lang['pl_PL']['RedirectorPage']['HEADER'] = 'Ta strona przeniesie użytkowników na inną stronę';
$lang['pl_PL']['RedirectorPage']['OTHERURL'] = 'Inny adres URL strony';
$lang['pl_PL']['RedirectorPage']['REDIRECTTO'] = 'Przenieś do';
@ -199,6 +212,7 @@ $lang['pl_PL']['SiteTree']['ACCESSLOGGEDIN'] = 'Tylko zarejestrowani użytkownic
$lang['pl_PL']['SiteTree']['ACCESSONLYTHESE'] = 'Tylko Ci ludzie (wybierz z listy)';
$lang['pl_PL']['SiteTree']['ADDEDTODRAFT'] = 'Dodano do roboczej strony';
$lang['pl_PL']['SiteTree']['ALLOWCOMMENTS'] = 'Zezwolić na komentarze na stronie?';
$lang['pl_PL']['SiteTree']['APPEARSVIRTUALPAGES'] = 'Ta zawartość pojawia sie także na wirtualnych stronach w sekcjach %s.';
$lang['pl_PL']['SiteTree']['BUTTONCANCELDRAFT'] = 'Anuluj wprowadzone zmiany';
$lang['pl_PL']['SiteTree']['BUTTONCANCELDRAFTDESC'] = 'Usuń zmiany i wróć do istniejącej wersji opublikowanej strony';
$lang['pl_PL']['SiteTree']['BUTTONSAVEPUBLISH'] = 'Zapisz i opublikuj';
@ -216,14 +230,14 @@ $lang['pl_PL']['SiteTree']['LINKSCHANGEDTO'] = 'zmieniono %s na %s';
$lang['pl_PL']['SiteTree']['MENUTITLE'] = 'Sekcja nawigacji';
$lang['pl_PL']['SiteTree']['METAADVANCEDHEADER'] = 'Zaawansowane opcje ...';
$lang['pl_PL']['SiteTree']['METADESC'] = 'Opis';
$lang['pl_PL']['SiteTree']['METAEXTRA'] = 'Stałe Meta Tagi';
$lang['pl_PL']['SiteTree']['METAHEADER'] = 'Mechanizm wyszukiwania meta-tagów';
$lang['pl_PL']['SiteTree']['METAEXTRA'] = 'Własne Meta Tagi';
$lang['pl_PL']['SiteTree']['METAHEADER'] = 'Meta-tagi wyszukiwarki';
$lang['pl_PL']['SiteTree']['METAKEYWORDS'] = 'Słowa kluczowe';
$lang['pl_PL']['SiteTree']['METANOTEPRIORITY'] = 'Ręczne wprowadzenie specyfikacji dla Google SiteMaps ważności dla tej strony. To jest przewodnik dla Google, jak ważna jest strona: (wprowadź wartość od 0 do 1 gdzie 0 wprowadza stronę do indexu).';
$lang['pl_PL']['SiteTree']['METAPAGEPRIO'] = 'Priorytet Strony';
$lang['pl_PL']['SiteTree']['METATITLE'] = 'Tytuł';
$lang['pl_PL']['SiteTree']['MODIFIEDONDRAFT'] = 'Zmodyfikowano na roboczej stronie';
$lang['pl_PL']['SiteTree']['NOBACKLINKS'] = 'Strona nie została zlinkowana do żadnej stron';
$lang['pl_PL']['SiteTree']['NOBACKLINKS'] = 'Do tej strony nie prowadzą żadne odnośniki z innych stron.';
$lang['pl_PL']['SiteTree']['NOTEUSEASHOMEPAGE'] = 'Użyj tej strony jako \'strony startowej\' dla następujących domen: (oddziel domeny cudzysłowem)';
$lang['pl_PL']['SiteTree']['PAGESLINKING'] = 'Następujące strony mają adres:';
$lang['pl_PL']['SiteTree']['PAGETITLE'] = 'Nazwa strony';
@ -232,8 +246,8 @@ $lang['pl_PL']['SiteTree']['PRIORITYLEASTIMPORTANT'] = 'Najmniej ważny';
$lang['pl_PL']['SiteTree']['PRIORITYMOSTIMPORTANT'] = 'Najważniejszy';
$lang['pl_PL']['SiteTree']['PRIORITYNOTINDEXED'] = 'Nie zindexowany';
$lang['pl_PL']['SiteTree']['REMOVEDFROMDRAFT'] = 'Usunięto z roboczej strony';
$lang['pl_PL']['SiteTree']['SHOWINMENUS'] = 'Pokaz w menu?';
$lang['pl_PL']['SiteTree']['SHOWINSEARCH'] = 'Pokaz w wyszukiwarce?';
$lang['pl_PL']['SiteTree']['SHOWINMENUS'] = 'Pokazuj w menu?';
$lang['pl_PL']['SiteTree']['SHOWINSEARCH'] = 'Pokazuj w wyszukiwarce?';
$lang['pl_PL']['SiteTree']['TABACCESS'] = 'Dostęp';
$lang['pl_PL']['SiteTree']['TABBACKLINKS'] = 'Linki zwrotne';
$lang['pl_PL']['SiteTree']['TABBEHAVIOUR'] = 'Zachowanie';
@ -244,6 +258,7 @@ $lang['pl_PL']['SiteTree']['TABREPORTS'] = 'Raporty';
$lang['pl_PL']['SiteTree']['TOPLEVEL'] = 'Zawartość strony (Główny Poziom)';
$lang['pl_PL']['SiteTree']['URL'] = 'URL';
$lang['pl_PL']['SiteTree']['VALIDATIONURLSEGMENT1'] = 'Inna strona używa tego adresu URL. Adres URL musi być unikalny dla każdej strony.';
$lang['pl_PL']['SiteTree']['VALIDATIONURLSEGMENT2'] = 'Adresy URL mogą składać się jedynie z liczb, cyfr oraz znaków \'-\'.';
$lang['pl_PL']['TableField']['ISREQUIRED'] = 'W %s \'%s\' jest wymagane';
$lang['pl_PL']['TableField.ss']['CSVEXPORT'] = 'Eksportuj do CSV';
$lang['pl_PL']['ToggleCompositeField.ss']['HIDE'] = 'Ukryj';

View File

@ -4,7 +4,11 @@ i18n::include_locale_file('sapphire', 'en_US');
global $lang;
$lang['pt_BR'] = $lang['en_US'];
if(array_key_exists('pt_BR', $lang) && is_array($lang['pt_BR'])) {
$lang['pt_BR'] = array_merge($lang['en_US'], $lang['pt_BR']);
} else {
$lang['pt_BR'] = $lang['en_US'];
}
$lang['pt_BR']['BasicAuth']['ENTERINFO'] = 'Por favor entre nome de usuário e senha.';
$lang['pt_BR']['BasicAuth']['ERRORNOTADMIN'] = 'Este usuário não é um administrador';

View File

@ -4,7 +4,11 @@ i18n::include_locale_file('sapphire', 'en_US');
global $lang;
$lang['pt_PT'] = $lang['en_US'];
if(array_key_exists('pt_PT', $lang) && is_array($lang['pt_PT'])) {
$lang['pt_PT'] = array_merge($lang['en_US'], $lang['pt_PT']);
} else {
$lang['pt_PT'] = $lang['en_US'];
}
$lang['pt_PT']['BasicAuth']['ENTERINFO'] = 'Por favor insira um nome de utilizador e password.';
$lang['pt_PT']['BasicAuth']['ERRORNOTADMIN'] = 'Esse utilizador não é um administrador.';
@ -267,4 +271,391 @@ $lang['pt_PT']['VirtualPage']['CHOOSE'] = 'Escolha uma página para onde redirec
$lang['pt_PT']['VirtualPage']['EDITCONTENT'] = 'clique aqui para editar o conteúdo';
$lang['pt_PT']['VirtualPage']['HEADER'] = 'Esta é uma página virtual';
// --- New New New
// SiteTree.php
$lang['pt_PT']['SiteTree']['CHANGETO'] = 'Mudar para';
$lang['pt_PT']['SiteTree']['CURRENTLY'] = 'Actualmente';
$lang['pt_PT']['SiteTree']['CURRENT'] = 'Actual';
$lang['pt_PT']['Page']['SINGULARNAME'] = 'Página';
$lang['pt_PT']['Page']['PLURALNAME'] = 'Páginas';
$lang['pt_PT']['ErrorPage']['SINGULARNAME'] = 'Página de Erro';
$lang['pt_PT']['ErrorPage']['PLURALNAME'] = 'Páginas de Erro';
$lang['pt_PT']['UserDefinedForm']['SINGULARNAME'] = 'Formulário Definido pelo Utilizador';
$lang['pt_PT']['UserDefinedForm']['PLURALNAME'] = 'Formulários Definidos pelo Utilizador';
$lang['pt_PT']['RedirectorPage']['SINGULARNAME'] = 'Página de Redireccionamento';
$lang['pt_PT']['RedirectorPage']['PLURALNAME'] = 'Páginas de Redireccionamento';
$lang['pt_PT']['VirtualPage']['SINGULARNAME'] = 'Página Virtual';
$lang['pt_PT']['VirtualPage']['PLURALNAME'] = 'Páginas Virtuais';
$lang['pt_PT']['SubscribeForm']['SINGULARNAME'] = 'Página de Subscrição';
$lang['pt_PT']['SubscribeForm']['PLURALNAME'] = 'Páginas de Subscrição';
// --- New New New New
// forms/TreeSelectorField.php
$lang['pt_PT']['TreeSelectorField']['SAVE'] = 'gravar';
$lang['pt_PT']['TreeSelectorField']['CANCEL'] = 'cancelar';
// forms/NumericField.php
$lang['pt_PT']['NumericField']['VALIDATIONJS'] = 'não é um número. Apenas números podem ser inseridos neste campo';
// forms/HtmlEditorField.php
$lang['pt_PT']['HtmlEditorField']['CLOSE'] = 'fechar';
$lang['pt_PT']['HtmlEditorField']['LINK'] = 'Link';
$lang['pt_PT']['HtmlEditorField']['IMAGE'] = 'Imagem';
$lang['pt_PT']['HtmlEditorField']['FLASH'] = 'Flash';
// forms/GSTNumberField.php
$lang['pt_PT']['GSTNumberField']['VALIDATIONJS'] = 'Por favor insira um número GST válido';
// forms/Form.php
$lang['pt_PT']['Form']['VALIDATOR'] = 'Validador';
// forms/FormField.php
$lang['pt_PT']['FormField']['NONE'] = 'nenhum';
// forms/EmailField.php
$lang['pt_PT']['EmailField']['VALIDATIONJS'] = 'Por favor insira um endereço de email.';
// forms/EditableTextField.php
$lang['pt_PT']['EditableTextField']['TEXTBOXLENGTH'] = 'Tamanho da caixa de texto';
$lang['pt_PT']['EditableTextField']['TEXTLENGTH'] = 'Comprimento do texto';
$lang['pt_PT']['EditableTextField']['NUMBERROWS'] = 'Número de linhas';
$lang['pt_PT']['EditableTextField']['DEFAULTTEXT'] = 'Texto pré-definido';
// forms/EditableFormField.php
$lang['pt_PT']['EditableFormField']['ENTERQUESTION'] = 'Insira a questão';
$lang['pt_PT']['EditableFormField']['REQUIRED'] = 'Obrigatório?';
// forms/EditableEmailField.php
$lang['pt_PT']['EditableEmailField']['SENDCOPY'] = 'Enviar uma cópia do formulário para este email';
// forms/EditableCheckbox.php
$lang['pt_PT']['EditableCheckbox']['ANY'] = 'Qualquer um';
$lang['pt_PT']['EditableCheckbox']['SELECTED'] = 'Seleccionado';
$lang['pt_PT']['EditableCheckbox']['NOTSELECTED'] = 'Não Seleccionado';
// forms/DateField.php
$lang['pt_PT']['DateField']['VALIDATIONJS'] = 'Por favor insira uma data válida (DD/MM/AAAA).';
$lang['pt_PT']['DateField']['NODATESET'] = 'Nenhuma data definida';
$lang['pt_PT']['DateField']['TODAY'] = 'Hoje';
$lang['pt_PT']['DateField']['NOTSET'] = 'Não definido';
// forms/DataReport.php
$lang['pt_PT']['DataReport']['EXPORTCSV'] = 'Exportar para CSV';
// forms/CurrencyField.php
$lang['pt_PT']['CurrencyField']['VALIDATIONJS'] = 'Por favor insira um valor monetário correcto.';
$lang['pt_PT']['CurrencyField']['CURRENCYSYMBOL'] = '€';
// forms/CreditCardField.php
$lang['pt_PT']['CreditCardField']['VALIDATIONJS1'] = 'Por favor certifique-se que inseriu o';
$lang['pt_PT']['CreditCardField']['VALIDATIONJS2'] = 'número correctamente';
$lang['pt_PT']['CreditCardField']['FIRST'] = 'primeiro';
$lang['pt_PT']['CreditCardField']['SECOND'] = 'segundo';
$lang['pt_PT']['CreditCardField']['THIRD'] = 'terceiro';
$lang['pt_PT']['CreditCardField']['FOURTH'] = 'quarto';
// forms/ConfirmedPasswordField.php
$lang['pt_PT']['ConfirmedPasswordField']['HAVETOMATCH'] = 'As passwords teem de coincidir.';
$lang['pt_PT']['ConfirmedPasswordField']['NOEMPTY'] = 'A password não pode estar vazia.';
$lang['pt_PT']['ConfirmedPasswordField']['BETWEEN'] = 'As passwords devem ter entre %s e %s caracteres';
$lang['pt_PT']['ConfirmedPasswordField']['ATLEAST'] = 'As passwords devem ter no mínimo %s caracteres';
$lang['pt_PT']['ConfirmedPasswordField']['MAXIMUM'] = 'As passwords podem ter no máximo %s caracteres';
$lang['pt_PT']['ConfirmedPasswordField']['LEASTONE'] = 'As passwords devem conter pelo menos um numero e um caracter alfanumérico';
// forms/CompositeDateField.php
$lang['pt_PT']['CompositeDateField']['DAY'] = 'Dia';
$lang['pt_PT']['CompositeDateField']['MONTH'] = 'Mês';
$lang['pt_PT']['CompositeDateField']['VALIDATIONJS1'] = 'Por favor certifique-se que tem o';
$lang['pt_PT']['CompositeDateField']['VALIDATIONJS2'] = 'correcto';
$lang['pt_PT']['CompositeDateField']['DAYJS'] = 'dia';
$lang['pt_PT']['CompositeDateField']['MONTHJS'] = 'mês';
$lang['pt_PT']['CompositeDateField']['YEARJS'] = 'ano';
// forms/BankAccountField.php
$lang['pt_PT']['BankAccountField']['VALIDATIONJS'] = 'Por favor, insira um número bancário correcto';
// forms/editor/FieldEditor.php
$lang['pt_PT']['FieldEditor']['EMAILSUBMISSION'] = 'Enviar os dados para o email:';
$lang['pt_PT']['FieldEditor']['EMAILONSUBMIT'] = 'Enviar email após submissão dos dados:';
// parsers/BBCodeParser.php
$lang['pt_PT']['BBCodeParser']['BOLD'] = 'Texto Negrito';
$lang['pt_PT']['BBCodeParser']['BOLDEXAMPLE'] = 'Negrito';
$lang['pt_PT']['BBCodeParser']['ITALIC'] = 'Texto Itálico';
$lang['pt_PT']['BBCodeParser']['ITALICEXAMPLE'] = 'Itálico';
$lang['pt_PT']['BBCodeParser']['UNDERLINE'] = 'Texto Sublinhado';
$lang['pt_PT']['BBCodeParser']['UNDERLINEEXAMPLE'] = 'Sublinhado';
$lang['pt_PT']['BBCodeParser']['STRUCK'] = 'Texto Rasurado';
$lang['pt_PT']['BBCodeParser']['STRUCKEXAMPLE'] = 'Rasurado';
$lang['pt_PT']['BBCodeParser']['COLORED'] = 'Texto Colorido';
$lang['pt_PT']['BBCodeParser']['COLOREDEXAMPLE'] = 'texto azul';
$lang['pt_PT']['BBCodeParser']['ALIGNEMENT'] = 'Alinhamento';
$lang['pt_PT']['BBCodeParser']['ALIGNEMENTEXAMPLE'] = 'alinhado à direita';
$lang['pt_PT']['BBCodeParser']['LINK'] = 'Link';
$lang['pt_PT']['BBCodeParser']['LINKDESCRIPTION'] = 'Link para outro site';
$lang['pt_PT']['BBCodeParser']['EMAILLINK'] = 'Link de Email';
$lang['pt_PT']['BBCodeParser']['EMAILLINKDESCRIPTION'] = 'Criar um link para um endereço de email';
$lang['pt_PT']['BBCodeParser']['IMAGE'] = 'Imagem';
$lang['pt_PT']['BBCodeParser']['IMAGEDESCRIPTION'] = 'Mostrar uma imagem';
$lang['pt_PT']['BBCodeParser']['CODE'] = 'Código';
$lang['pt_PT']['BBCodeParser']['CODEDESCRIPTION'] = 'Bloco de texto não formatado';
$lang['pt_PT']['BBCodeParser']['CODEEXAMPLE'] = 'Bloco de código';
$lang['pt_PT']['BBCodeParser']['UNORDERED'] = 'Lista sem ordenação';
$lang['pt_PT']['BBCodeParser']['UNORDEREDDESCRIPTION'] = 'Lista sem ordenação';
$lang['pt_PT']['BBCodeParser']['UNORDEREDEXAMPLE1'] = 'item sem ordenação 1';
$lang['pt_PT']['BBCodeParser']['UNORDEREDEXAMPLE2'] = 'item sem ordenação 2';
// search/AdvancedSearchForm.php
$lang['pt_PT']['AdvancedSearchForm']['SEARCHBY'] = 'PROCURAR POR';
$lang['pt_PT']['AdvancedSearchForm']['ALLWORDS'] = 'Todas as palavras';
$lang['pt_PT']['AdvancedSearchForm']['EXACT'] = 'Frase exacta';
$lang['pt_PT']['AdvancedSearchForm']['ATLEAST'] = 'Pelo menos uma das palavras';
$lang['pt_PT']['AdvancedSearchForm']['WITHOUT'] = 'Sem as palavras';
$lang['pt_PT']['AdvancedSearchForm']['SORTBY'] = 'ORDENAR POR';
$lang['pt_PT']['AdvancedSearchForm']['RELEVANCE'] = 'Relevância';
$lang['pt_PT']['AdvancedSearchForm']['LASTUPDATED'] = 'Última actualização';
$lang['pt_PT']['AdvancedSearchForm']['PAGETITLE'] = 'Título da Página';
$lang['pt_PT']['AdvancedSearchForm']['LASTUPDATEDHEADER'] = 'ÚLTIMA ACTUALIZAÇÂO';
$lang['pt_PT']['AdvancedSearchForm']['FROM'] = 'De';
$lang['pt_PT']['AdvancedSearchForm']['TO'] = 'Até';
$lang['pt_PT']['AdvancedSearchForm']['GO'] = 'Ir';
// search/SearchForm.php
$lang['pt_PT']['SearchForm']['SEARCH'] = 'Procurar';
$lang['pt_PT']['SearchForm']['GO'] = 'Ir';
// security/Security.php
$lang['pt_PT']['Security']['LOGIN'] = 'Autenticação';
$lang['pt_PT']['Security']['PERMFAILURE'] = 'Esta página requer autenticação e previlégios de administrador.
Insira as sua credenciais abaixo para continuar.';
$lang['pt_PT']['Security']['ENCDISABLED1'] = 'Encriptação de passwords desligada!';
$lang['pt_PT']['Security']['ENCDISABLED2'] = 'Para encriptas as passwords, insira a seguinte linha';
$lang['pt_PT']['Security']['ENCDISABLED3'] = 'em mysite/_config.php';
$lang['pt_PT']['Security']['NOTHINGTOENCRYPT1'] = 'Sem passwords para encriptar';
$lang['pt_PT']['Security']['NOTHINGTOENCRYPT2'] = 'Todos os membros teem as passwords encriptadas!';
$lang['pt_PT']['Security']['ENCRYPT'] = 'Encriptar todas as passwords';
$lang['pt_PT']['Security']['ENCRYPTWITH'] = 'As passwords serão encriptadas com o algoritmo &quot;%s&quot;';
$lang['pt_PT']['Security']['ENCRYPTWITHSALT'] = 'com uma chave para aumentar a segurança';
$lang['pt_PT']['Security']['ENCRYPTWITHOUTSALT'] = 'sem chave para aumentar a segurança';
$lang['pt_PT']['Security']['ENCRYPTEDMEMBERS'] = 'Password encriptada para o membro';
$lang['pt_PT']['Security']['EMAIL'] = 'Email:';
$lang['pt_PT']['Security']['ID'] = 'ID:';
// security/Permission.php
$lang['pt_PT']['Permission']['FULLADMINRIGHTS'] = 'Previlégios de Administrador';
$lang['pt_PT']['Permission']['PERMSDEFINED'] = 'Estão definidas as seguintes permissões';
// core/model/Translatable.php
$lang['pt_PT']['Translatable']['TRANSLATIONS'] = 'Traduções';
$lang['pt_PT']['Translatable']['CREATE'] = 'Criar nova tradução';
$lang['pt_PT']['Translatable']['NEWLANGUAGE'] = 'Nova Língua';
$lang['pt_PT']['Translatable']['CREATEBUTTON'] = 'Criar';
$lang['pt_PT']['Translatable']['EXISTING'] = 'Traduções existentes';
// core/model/SiteTree.php
$lang['pt_PT']['SiteTree']['DEFAULTHOMETITLE'] = 'Início';
$lang['pt_PT']['SiteTree']['DEFAULTHOMECONTENT'] = '<p>Bem-vindo ao Silverstripe! Esta é a página inicial pré-definida. Pode editar esta página no <a href=\"admin/\">CMS</a>. Pode vêr a <a href=\"http://doc.silverstripe.com\">documentação de desenvolvimento</a>, ou os <a href=\"http://doc.silverstripe.com/doku.php?id=tutorials\">tutoriais.</a></p>';
$lang['pt_PT']['SiteTree']['DEFAULTABOUTTITLE'] = 'Sobre';
$lang['pt_PT']['SiteTree']['DEFAULTABOUTCONTENT'] = '<p>Pode inserir o seu conteúdo nesta página ou apaga-la e criar novas.</p>';
$lang['pt_PT']['SiteTree']['DEFAULTCONTACTTITLE'] = 'Contacte-nos';
$lang['pt_PT']['SiteTree']['DEFAULTCONTACTCONTENT'] = '<p>Pode inserir o seu conteúdo nesta página ou apaga-la e criar novas.</p>';
// core/model/ErrorPage.php
$lang['pt_PT']['ErrorPage']['DEFAULTERRORPAGETITLE'] = 'Página de Erro';
$lang['pt_PT']['ErrorPage']['DEFAULTERRORPAGECONTENT'] = '<p>Pedimos desculpa, mas aparentemente tentou aceder a uma página que não existe.</p><p>Verifique o URL que utilizou e tente novamente.</p>';
$lang['pt_PT']['ErrorPage']['404'] = '404 - Página não encontrada';
$lang['pt_PT']['ErrorPage']['500'] = '500 - Erro do servidor';
// SubmittedFormReportField.ss
$lang['pt_PT']['SubmittedFormReportField.ss']['SUBMITTED'] = 'Inserido em';
// RelationComplexTableField.ss
$lang['pt_PT']['RelationComplexTableField.ss']['ADD'] = 'Adicionar';
$lang['pt_PT']['RelationComplexTableField.ss']['SHOW'] = 'Mostrar';
$lang['pt_PT']['RelationComplexTableField.ss']['EDIT'] = 'Editar';
$lang['pt_PT']['RelationComplexTableField.ss']['DELETE'] = 'Apagar';
$lang['pt_PT']['RelationComplexTableField.ss']['NOTFOUND'] = 'Nenhum item encontrado';
// FieldEditor.ss
$lang['pt_PT']['FieldEditor.ss']['ADD'] = 'Adicionar';
$lang['pt_PT']['FieldEditor.ss']['TEXTTITLE'] = 'Adicionar campo de texto';
$lang['pt_PT']['FieldEditor.ss']['TEXT'] = 'Texto';
$lang['pt_PT']['FieldEditor.ss']['CHECKBOXTITLE'] = 'Adicionar caixa de tick';
$lang['pt_PT']['FieldEditor.ss']['CHECKBOX'] = 'Caixa de Tick';
$lang['pt_PT']['FieldEditor.ss']['DROPDOWNTITLE'] = 'Adicionar caixa de selecção';
$lang['pt_PT']['FieldEditor.ss']['DROPDOWN'] = 'Caixa de selecção';
$lang['pt_PT']['FieldEditor.ss']['RADIOSETTITLE'] = 'Adicionar conjunto de botões de rádio';
$lang['pt_PT']['FieldEditor.ss']['RADIOSET'] = 'Conjunto de Botões de Rádio';
$lang['pt_PT']['FieldEditor.ss']['EMAILTITLE'] = 'Adicionar campo de email';
$lang['pt_PT']['FieldEditor.ss']['EMAIL'] = 'Campo de email';
$lang['pt_PT']['FieldEditor.ss']['FORMHEADINGTITLE'] = 'Adicionar cabeçalho';
$lang['pt_PT']['FieldEditor.ss']['FORMHEADING'] = 'Cabeçalho';
$lang['pt_PT']['FieldEditor.ss']['DATETITLE'] = 'Adicionar Campo de Data';
$lang['pt_PT']['FieldEditor.ss']['DATE'] = 'Data';
$lang['pt_PT']['FieldEditor.ss']['FILETITLE'] = 'Adicionar Campo de envio de ficheiro';
$lang['pt_PT']['FieldEditor.ss']['FILE'] = 'Ficheiro';
$lang['pt_PT']['FieldEditor.ss']['CHECKBOXGROUPTITLE'] = 'Adicionar Grupo de caixas de tick';
$lang['pt_PT']['FieldEditor.ss']['CHECKBOXGROUP'] = 'Grupo de Caixas de tick';
$lang['pt_PT']['FieldEditor.ss']['MEMBERTITLE'] = 'Adicionar Selecção de Membros';
$lang['pt_PT']['FieldEditor.ss']['MEMBER'] = 'Selecção de Membros';
// EditableTextField.ss
$lang['pt_PT']['EditableTextField.ss']['DRAG'] = 'Arraste para reordenar os campos';
$lang['pt_PT']['EditableTextField.ss']['TEXTFIELD'] = 'Campo de texto';
$lang['pt_PT']['EditableTextField.ss']['MORE'] = 'Mais opções';
$lang['pt_PT']['EditableTextField.ss']['DELETE'] = 'Apagar este campo';
// EditableRadioOption.ss
$lang['pt_PT']['EditableRadioOption.ss']['DRAG'] = 'Arraste para reordenar os campos';
$lang['pt_PT']['EditableRadioOption.ss']['DELETE'] = 'Remover esta opção';
$lang['pt_PT']['EditableRadioOption.ss']['LOCKED'] = 'Estes campos não podem ser alterados';
// EditableRadioField.ss
$lang['pt_PT']['EditableRadioField.ss']['DRAG'] = 'Arraste para reordenar os campos';
$lang['pt_PT']['EditableRadioField.ss']['LOCKED'] = 'Estes campos não podem ser alterados';
$lang['pt_PT']['EditableRadioField.ss']['SET'] = 'Conjunto de botões de rádio';
$lang['pt_PT']['EditableRadioField.ss']['MORE'] = 'Mais opções';
$lang['pt_PT']['EditableRadioField.ss']['DELETE'] = 'Remover esta opção';
$lang['pt_PT']['EditableRadioField.ss']['REQUIRED'] = 'Este campo é obrigatório para este formulário e não pode ser apagado.';
$lang['pt_PT']['EditableRadioField.ss']['ADD'] = 'Adicionar opção';
// EditableFormHeading.ss
$lang['pt_PT']['EditableFormHeading.ss']['DRAG'] = 'Arraste para reordenar os campos';
$lang['pt_PT']['EditableFormHeading.ss']['DELETE'] = 'Remover esta opção';
$lang['pt_PT']['EditableFormHeading.ss']['MORE'] = 'Mais opções';
$lang['pt_PT']['EditableFormHeading.ss']['HEADING'] = 'Cabeçalho';
// EditableFormField.ss
$lang['pt_PT']['EditableFormField.ss']['DRAG'] = 'Arraste para reordenar os campos';
$lang['pt_PT']['EditableFormField.ss']['LOCKED'] = 'Estes campos não podem ser alterados';
$lang['pt_PT']['EditableFormField.ss']['MORE'] = 'Mais opções';
$lang['pt_PT']['EditableFormField.ss']['DELETE'] = 'Remover esta opção';
$lang['pt_PT']['EditableFormField.ss']['REQUIRED'] = 'Este campo é obrigatório para este formulário e não pode ser apagado.';
// EditableRadioOption.ss
$lang['pt_PT']['EditableFormFieldOption.ss']['DRAG'] = 'Arraste para reordenar os campos';
$lang['pt_PT']['EditableFormFieldOption.ss']['DELETE'] = 'Remover esta opção';
$lang['pt_PT']['EditableFormFieldOption.ss']['LOCKED'] = 'Estes campos não podem ser alterados';
// EditableFileField.ss
$lang['pt_PT']['EditableFileField.ss']['DRAG'] = 'Arraste para reordenar os campos';
// EditableFileField.ss
$lang['pt_PT']['EditableFileField.ss']['DRAG'] = 'Arraste para reordenar os campos';
$lang['pt_PT']['EditableFileField.ss']['FILE'] = 'Campo de envio de ficheiro';
$lang['pt_PT']['EditableFileField.ss']['MORE'] = 'Mais opções';
$lang['pt_PT']['EditableFileField.ss']['DELETE'] = 'Remover esta opção';
// EditableEmailField.ss
$lang['pt_PT']['EditableEmailField.ss']['DRAG'] = 'Arraste para reordenar os campos';
$lang['pt_PT']['EditableEmailField.ss']['EMAIL'] = 'Campo de email';
$lang['pt_PT']['EditableEmailField.ss']['MORE'] = 'Mais opções';
$lang['pt_PT']['EditableEmailField.ss']['DELETE'] = 'Remover esta opção';
$lang['pt_PT']['EditableEmailField.ss']['REQUIRED'] = 'Este campo é obrigatório para este formulário e não pode ser apagado.';
// EditableDropdown.ss
$lang['pt_PT']['EditableDropdown.ss']['LOCKED'] = 'Estes campos não podem ser alterados';
$lang['pt_PT']['EditableDropdown.ss']['DRAG'] = 'Arraste para reordenar os campos';
$lang['pt_PT']['EditableDropdown.ss']['DROPDOWN'] = 'Lista de Selecção';
$lang['pt_PT']['EditableDropdown.ss']['MORE'] = 'Mais opções';
$lang['pt_PT']['EditableDropdown.ss']['DELETE'] = 'Remover esta opção';
$lang['pt_PT']['EditableDropdown.ss']['REQUIRED'] = 'Este campo é obrigatório para este formulário e não pode ser apagado.';
// EditableDropdownOption.ss
$lang['pt_PT']['EditableDropdownOption.ss']['DRAG'] = 'Arraste para reordenar os campos';
$lang['pt_PT']['EditableDropdownOption.ss']['LOCKED'] = 'Estes campos não podem ser alterados';
$lang['pt_PT']['EditableDropdownOption.ss']['DELETE'] = 'Remover esta opção';
// EditableDateField.ss
$lang['pt_PT']['EditableDateField.ss']['DRAG'] = 'Arraste para reordenar os campos';
$lang['pt_PT']['EditableDateField.ss']['MORE'] = 'Mais opções';
$lang['pt_PT']['EditableDateField.ss']['DELETE'] = 'Remover esta opção';
$lang['pt_PT']['EditableDateField.ss']['DATE'] = 'Campo de Data';
// EditableCheckbox.ss
$lang['pt_PT']['EditableCheckbox.ss']['LOCKED'] = 'Estes campos não podem ser alterados';
$lang['pt_PT']['EditableCheckbox.ss']['DRAG'] = 'Arraste para reordenar os campos';
$lang['pt_PT']['EditableCheckbox.ss']['CHECKBOX'] = 'Caixa de tick';
$lang['pt_PT']['EditableCheckbox.ss']['MORE'] = 'Mais opções';
$lang['pt_PT']['EditableCheckbox.ss']['DELETE'] = 'Remover esta opção';
// EditableCheckboxOption.ss
$lang['pt_PT']['EditableCheckboxOption.ss']['DRAG'] = 'Arraste para reordenar os campos';
$lang['pt_PT']['EditableCheckboxOption.ss']['LOCKED'] = 'Estes campos não podem ser alterados';
$lang['pt_PT']['EditableCheckboxOption.ss']['DELETE'] = 'Remover esta opção';
// EditableCheckboxGroupField.ss
$lang['pt_PT']['EditableCheckboxGroupField.ss']['DRAG'] = 'Arraste para reordenar os campos';
$lang['pt_PT']['EditableCheckboxGroupField.ss']['MORE'] = 'Mais opções';
$lang['pt_PT']['EditableCheckboxGroupField.ss']['DELETE'] = 'Remover esta opção';
$lang['pt_PT']['EditableCheckboxGroupField.ss']['DATE'] = 'Campo de Data';
// EditableCheckboxGroupField.ss
$lang['pt_PT']['EditableCheckboxGroupField.ss']['LOCKED'] = 'Estes campos não podem ser alterados';
$lang['pt_PT']['EditableCheckboxGroupField.ss']['DRAG'] = 'Arraste para reordenar os campos';
$lang['pt_PT']['EditableCheckboxGroupField.ss']['CHECKBOXGROUP'] = 'Grupo de Caixas de tick';
$lang['pt_PT']['EditableCheckboxGroupField.ss']['MORE'] = 'Mais opções';
$lang['pt_PT']['EditableCheckboxGroupField.ss']['DELETE'] = 'Remover esta opção';
$lang['pt_PT']['EditableCheckboxGroupField.ss']['REQUIRED'] = 'Este campo é obrigatório para este formulário e não pode ser apagado.';
$lang['pt_PT']['EditableCheckboxGroupField.ss']['ADD'] = 'Adicionar opção';
// ForgotPasswordEmail.ss
$lang['pt_PT']['ForgotPasswordEmail.ss']['TEXT1'] = 'Aqui está o seu';
$lang['pt_PT']['ForgotPasswordEmail.ss']['TEXT2'] = 'link de reset da password';
$lang['pt_PT']['ForgotPasswordEmail.ss']['TEXT3'] = 'para';
// TableListField_PageControls.ss
$lang['pt_PT']['TableListField_PageControls.ss']['VIEWLAST'] = 'Ver último';
$lang['pt_PT']['TableListField_PageControls.ss']['VIEWFIRST'] = 'Ver primeiro';
$lang['pt_PT']['TableListField_PageControls.ss']['VIEWPREVIOUS'] = 'Ver anterior';
$lang['pt_PT']['TableListField_PageControls.ss']['VIEWNEXT'] = 'Ver próximo';
$lang['pt_PT']['TableListField_PageControls.ss']['DISPLAYING'] = 'A Mostrar';
$lang['pt_PT']['TableListField_PageControls.ss']['TO'] = 'até';
$lang['pt_PT']['TableListField_PageControls.ss']['OF'] = 'de';
// New2
$lang['pt_PT']['TableField.ss']['ADD'] = 'Adicionar nova linha';
$lang['pt_PT']['TableField.ss']['ADDITEM'] = 'Adicionar';
$lang['pt_PT']['TableField.ss']['DELETEROW'] = 'Apagar esta linha';
$lang['pt_PT']['TableField.ss']['DELETE'] = 'apagar';
$lang['pt_PT']['Security']['OPENIDHEADER'] = 'Credenciais OpenID/i-name';
$lang['pt_PT']['Security']['MEMBERALREADYEXISTS'] = 'Já existe um utilizador com esta identidade';
$lang['pt_PT']['Security']['OPENIDURL'] = 'OpenID URL/i-name';
$lang['pt_PT']['Security']['OPENIDDESC'] = '<p>Certifique-se que inseriu aqui as suas credenciais OpenID/i-name normalizadas
, p.ex. com protocolo e barra para a direita para o OpenID (ex. http://openid.silverstripe.com/).</p>';
$lang['pt_PT']['Security']['EDITOPENIDURL'] = 'OpenID URL/i-name (ex. http://openid.silverstripe.com/)';
$lang['pt_PT']['Security']['OPENIDURLNORMALIZATION'] = '<p>Certifique-se que inseriu aqui as suas credenciais OpenID/i-name normalizadas
, p.ex. com protocolo e barra para a direita para o OpenID (ex. http://openid.silverstripe.com/).</p>';
$lang['pt_PT']['TableListField']['CSVEXPORT'] = 'Exportar para CSV';
$lang['pt_PT']['TableListField']['PRINT'] = 'Imprimir';
$lang['pt_PT']['Permission']['FULLADMINRIGHTS'] = 'Permissões de administração total';
$lang['pt_PT']['Page']['CLASSNAME'] = 'Página';
$lang['pt_PT']['Statistics']['TRENDS'] = 'Tendências';
$lang['pt_PT']['Statistics']['LEGEND'] = 'Legenda';
$lang['pt_PT']['Statistics']['BROWSERS'] = 'Browsers';
$lang['pt_PT']['Statistics']['ID'] = 'ID';
$lang['pt_PT']['Statistics']['EMAIL'] = 'Email';
$lang['pt_PT']['Statistics']['JOINED'] = 'Creado em';
$lang['pt_PT']['Statistics']['REGISTEREDUSERS'] = 'Utilizadores Registados';
$lang['pt_PT']['Statistics']['CSVEXPORT'] = 'Exportar como CSV';
$lang['pt_PT']['Statistics']['RECENTPAGEVIEWS'] = 'Visualização Recente de Páginas';
$lang['pt_PT']['Statistics']['TIME'] = 'Data/Hora';
$lang['pt_PT']['Statistics']['BROWSER'] = 'Browser';
$lang['pt_PT']['Statistics']['OSABREV'] = 'SO';
$lang['pt_PT']['Statistics']['USER'] = 'Utilizador';
$lang['pt_PT']['Statistics']['PAGE'] = 'Página';
$lang['pt_PT']['Statistics']['PAGEVIEWS'] = 'Visualizações';
$lang['pt_PT']['Statistics']['OS'] = 'Sistemas Operativos';
$lang['pt_PT']['Statistics']['USERACTIVITY'] = 'Actividade dos Utilizadores';
?>

View File

@ -4,7 +4,11 @@ i18n::include_locale_file('sapphire', 'en_US');
global $lang;
$lang['ru_RU'] = $lang['en_US'];
if(array_key_exists('ru_RU', $lang) && is_array($lang['ru_RU'])) {
$lang['ru_RU'] = array_merge($lang['en_US'], $lang['ru_RU']);
} else {
$lang['ru_RU'] = $lang['en_US'];
}
$lang['ru_RU']['BasicAuth']['ENTERINFO'] = 'Пожалуйста, введите имя пользователя и пароль.';
$lang['ru_RU']['BasicAuth']['ERRORNOTADMIN'] = 'Такой пользователь не является администратором.';

View File

@ -4,7 +4,11 @@ i18n::include_locale_file('sapphire', 'en_US');
global $lang;
$lang['sk_SK'] = $lang['en_US'];
if(array_key_exists('sk_SK', $lang) && is_array($lang['sk_SK'])) {
$lang['sk_SK'] = array_merge($lang['en_US'], $lang['sk_SK']);
} else {
$lang['sk_SK'] = $lang['en_US'];
}
$lang['sk_SK']['BasicAuth']['ENTERINFO'] = 'Prosím zadajte používateľské meno a heslo.';
$lang['sk_SK']['BasicAuth']['ERRORNOTADMIN'] = 'Tento používateľ nie je administrátor.';

View File

@ -4,7 +4,11 @@ i18n::include_locale_file('sapphire', 'en_US');
global $lang;
$lang['sv_SE'] = $lang['en_US'];
if(array_key_exists('sv_SE', $lang) && is_array($lang['sv_SE'])) {
$lang['sv_SE'] = array_merge($lang['en_US'], $lang['sv_SE']);
} else {
$lang['sv_SE'] = $lang['en_US'];
}
$lang['sv_SE']['BasicAuth']['ENTERINFO'] = 'Var god ange användarnamn och lösenord';
$lang['sv_SE']['BasicAuth']['ERRORNOTADMIN'] = 'Den användaren är ingen administratör';
@ -124,6 +128,7 @@ $lang['sv_SE']['HtmlEditorField']['LINKOPENNEWWIN'] = 'Öppna länk i nytt föns
$lang['sv_SE']['HtmlEditorField']['LINKTO'] = 'Länka till';
$lang['sv_SE']['HtmlEditorField']['OK'] = 'ok';
$lang['sv_SE']['HtmlEditorField']['OL'] = 'Numrerad lista';
$lang['sv_SE']['HtmlEditorField']['OUTDENT'] = 'Minska indrag';
$lang['sv_SE']['HtmlEditorField']['PAGE'] = 'Sida';
$lang['sv_SE']['HtmlEditorField']['PASTE'] = 'Klistra in';
$lang['sv_SE']['HtmlEditorField']['REDO'] = 'Gör om';
@ -210,6 +215,7 @@ $lang['sv_SE']['SiteTree']['APPEARSVIRTUALPAGES'] = 'Det här innehållet finns
$lang['sv_SE']['SiteTree']['BUTTONCANCELDRAFT'] = 'Upphäv utkast-ändringar';
$lang['sv_SE']['SiteTree']['BUTTONCANCELDRAFTDESC'] = 'Radera ditt utkast och återgå till den publicerade sidan';
$lang['sv_SE']['SiteTree']['BUTTONSAVEPUBLISH'] = 'Spara & publicera';
$lang['sv_SE']['SiteTree']['BUTTONUNPUBLISH'] = 'Avpublicera';
$lang['sv_SE']['SiteTree']['BUTTONUNPUBLISHDESC'] = 'Ta bort den här sidan från den publicerade sajten';
$lang['sv_SE']['SiteTree']['EDITANYONE'] = 'Alla som kan logga in';
$lang['sv_SE']['SiteTree']['EDITHEADER'] = 'Vem kan redigera den här sidan från CMS:et';
@ -226,6 +232,7 @@ $lang['sv_SE']['SiteTree']['METADESC'] = 'Beskrivning';
$lang['sv_SE']['SiteTree']['METAEXTRA'] = 'Egna meta-taggar';
$lang['sv_SE']['SiteTree']['METAHEADER'] = 'Meta-taggar för sökmotorer';
$lang['sv_SE']['SiteTree']['METAKEYWORDS'] = 'Nyckelord';
$lang['sv_SE']['SiteTree']['METAPAGEPRIO'] = 'Sidprioritet';
$lang['sv_SE']['SiteTree']['METATITLE'] = 'Titel';
$lang['sv_SE']['SiteTree']['MODIFIEDONDRAFT'] = 'Modifierad på utkast-sajten';
$lang['sv_SE']['SiteTree']['NOBACKLINKS'] = 'Den här sidan har inte blivit länkad från någon annan sida.';

View File

@ -4,7 +4,11 @@ i18n::include_locale_file('sapphire', 'en_US');
global $lang;
$lang['tr_TR'] = $lang['en_US'];
if(array_key_exists('tr_TR', $lang) && is_array($lang['tr_TR'])) {
$lang['tr_TR'] = array_merge($lang['en_US'], $lang['tr_TR']);
} else {
$lang['tr_TR'] = $lang['en_US'];
}
$lang['tr_TR']['BasicAuth']['ENTERINFO'] = 'Lütfen kullanıcı adı ve şifrenizi giriniz.';
$lang['tr_TR']['BasicAuth']['ERRORNOTADMIN'] = 'O kullanıcı, yönetici değildir';

View File

@ -4,7 +4,11 @@ i18n::include_locale_file('sapphire', 'en_US');
global $lang;
$lang['zh_CN'] = $lang['en_US'];
if(array_key_exists('zh_CN', $lang) && is_array($lang['zh_CN'])) {
$lang['zh_CN'] = array_merge($lang['en_US'], $lang['zh_CN']);
} else {
$lang['zh_CN'] = $lang['en_US'];
}
$lang['zh_CN']['BasicAuth']['ENTERINFO'] = '请输入用户名和密码';
$lang['zh_CN']['BasicAuth']['ERRORNOTADMIN'] = '此用户没有管理员权限。';

View File

@ -4,7 +4,11 @@ i18n::include_locale_file('sapphire', 'en_US');
global $lang;
$lang['zh_TW'] = $lang['en_US'];
if(array_key_exists('zh_TW', $lang) && is_array($lang['zh_TW'])) {
$lang['zh_TW'] = array_merge($lang['en_US'], $lang['zh_TW']);
} else {
$lang['zh_TW'] = $lang['en_US'];
}
$lang['zh_TW']['BasicAuth']['ENTERINFO'] = '請輸入帳號密碼。';
$lang['zh_TW']['BasicAuth']['ERRORNOTADMIN'] = '那個使用者不是管理員。';

View File

@ -2,9 +2,50 @@
/**
* Main file that handles every page request.
*
* The main.php does a number of set-up activities for the request.
*
* - Includes the first one of the following files that it finds: (root)/_ss_environment.php, (root)/../_ss_environment.php, or (root)/../../_ss_environment.php
* - Gets an up-to-date manifest from {@link ManifestBuilder}
* - Sets up error handlers with {@link Debug::loadErrorHandlers()}
* - Calls {@link DB::connect()}, passing it the global variable $databaseConfig that should be defined in an _config.php
* - Sets up the default director rules using {@link Director::addRules()}
*
* After that, it calls {@link Director::direct()}, which is responsible for doing most of the real work.
*
* Finally, main.php will use {@link Profiler} to show a profile if the querystring variable "debug_profile" is set.
*
* CONFIGURING THE WEBSERVER
*
* To use Sapphire, every request that doesn't point directly to a file should be rewritten to sapphire/main.php?url=(url).
* For example, http://www.example.com/about-us/rss would be rewritten to http://www.example.com/sapphire/main.php?url=about-us/rss
*
* It's important that requests that point directly to a file aren't rewritten; otherwise, visitors won't be able to download
* any CSS, JS, image files, or other downloads.
*
* On Apache, RewriteEngine can be used to do this.
*
* @package sapphire
* @subpackage core
* @see Director::direct()
*/
/**
* Include _ss_environment.php file
*/
$envFiles = array('../_ss_environment.php', '../../_ss_environment.php', '../../../_ss_environment.php');
foreach($envFiles as $envFile) {
if(@file_exists($envFile)) {
include($envFile);
break;
}
}
/**
* Include Sapphire's core code
*/
require_once("core/Core.php");
header("Content-type: text/html; charset=\"utf-8\"");
if(function_exists('mb_http_output')) {
mb_http_output('UTF-8');
@ -20,6 +61,27 @@ if(isset($_REQUEST['trace'])) {
apd_set_pprof_trace();
}
// Ensure we have enough memory
$memString = ini_get("memory_limit");
switch(strtolower(substr($memString,-1))) {
case "k":
$memory = round(substr($memString,0,-1)*1024);
break;
case "m":
$memory = round(substr($memString,0,-1)*1024*1024);
break;
case "g":
$memory = round(substr($memString,0,-1)*1024*1024*1024);
break;
default:
$memory = round($memString);
}
// Check we have at least 32M
if($memory < (32 * 1024 * 1024)) {
// Increase memory limit
ini_set('memory_limit', '32M');
}
require_once("core/ManifestBuilder.php");
require_once("core/ClassInfo.php");
@ -35,14 +97,6 @@ if(Director::isDev()) {
Session::start();
$envFiles = array('../_ss_environment.php', '../../_ss_environment.php', '../../../_ss_environment.php');
foreach($envFiles as $envFile) {
if(@file_exists($envFile)) {
include($envFile);
break;
}
}
if(isset($_GET['url'])) {
$url = $_GET['url'];
@ -87,7 +141,6 @@ Debug::loadErrorHandlers();
require_once("core/model/DB.php");
if(isset($_GET['debug_profile'])) Profiler::mark('DB::connect');
Debug::show($databaseConfig);
DB::connect($databaseConfig);
if(isset($_GET['debug_profile'])) Profiler::unmark('DB::connect');

View File

@ -1,3 +1,10 @@
<?php
/**
* @package sapphire
* @subpackage core
* Alternative main.php file for servers that need the php5 extension
*/
include("main.php");
?>

View File

@ -1,5 +1,10 @@
<?php
/**
* @package sapphire
* @subpackage misc
*/
/**
* Browscap.ini parsing class with caching and update capabilities
*
@ -19,12 +24,13 @@
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
* @package Browscap
* @author Jonathan Stoppani <st.jonathan@gmail.com>
* @copyright Copyright (c) 2006 Jonathan Stoppani
* @version 0.7
* @license http://www.gnu.org/licenses/lgpl.html GNU Lesser General Public License
* @link http://garetjax.info/projects/browscap/
* @package sapphire
* @subpackage misc
*/
class Browscap
{
@ -89,7 +95,7 @@ class Browscap
* $updateMethod: The method to use to update the file, has to be a value of
* an UPDATE_* constant, null or false.
*/
public $remoteIniUrl = 'http://browsers.garykeith.com/stream.asp?BrowsCapINI';
public $remoteIniUrl = 'http://browsers.garykeith.com/stream.asp?Lite_BrowsCapINI';
public $remoteVerUrl = 'http://browsers.garykeith.com/version-date.asp';
public $timeout = 5;
public $updateInterval = 432000; // 5 days
@ -267,7 +273,7 @@ class Browscap
$browser = $value = $browser + $this->_browsers[$key];
while (array_key_exists(3, $value)) {
while (array_key_exists(3, $value) && $value[3] != null && $value[3] != '') {
$value = $this->_browsers[$value[3]];
$browser += $value;
}
@ -656,11 +662,12 @@ class Browscap
/**
* Browscap.ini parsing class exception
*
* @package Browscap
* @author Jonathan Stoppani <st.jonathan@gmail.com>
* @copyright Copyright (c) 2006 Jonathan Stoppani
* @license http://www.gnu.org/licenses/lgpl.html GNU Lesser General Public License
* @link http://garetjax.info/projects/browscap/
* @package sapphire
* @subpackage misc
*/
class Browscap_Exception extends Exception
{}

View File

@ -1,10 +1,17 @@
<?php
/**
* @package sapphire
* @subpackage misc
*/
/**
* Initial implementation of Sitemap support.
* GoogleSitemap should handle requests to 'sitemap.xml'
* the other two classes are used to render the sitemap
* @package sapphire
* @subpackage misc
*/
class GoogleSitemap extends Controller {
protected $Pages;

View File

@ -1,7 +1,14 @@
<?php
/**
* @package sapphire
* @subpackage misc
*/
/**
* Ioncube Performance Suite management
* @package sapphire
* @subpackage misc
*/
class IPS extends Controller {
function index() {

View File

@ -1,8 +1,13 @@
<?php
/**
* @package cms
*/
/**
* Statistics class for gathering and formatting of statistical data for tables and charts in
* both public and administrative contexts.
* @package cms
*/
class Statistics extends Controller {
@ -11,11 +16,13 @@ class Statistics extends Controller {
}
static function trend_chart($table, $filter = "day", $name, $type, $color) {
$trendstrl = _t('Statistics.TRENDS', 'Trends');
$legendtrl = _t('Statistics.LEGEND', 'Legend');
$top = <<<HTML
<div id="trendchart" style="display: none">
<h2>Trends</h2>
<h2>{$trendstrl}</h2>
<div><canvas id="chart" height="400" width="700"></canvas></div>
<div id="chart_legend"><legend>Legend</legend></div>
<div id="chart_legend"><legend>{$legendtrl}</legend></div>
</div>
<script type="text/javascript">\n
HTML;
@ -139,13 +146,18 @@ HTML;
static function user_record_table() {
$records = DataObject::get('Member');
$baseURL = Director::baseURL();
$registereduserstrl = _t('Statistics.REGISTEREDUSERS', 'Registered Users');
$exporttrl = _t('Statistics.CSVEXPORT', 'Export as CSV');
$idtrl = _t('Statistics.ID', 'ID');
$emailtrl = _t('Statistics.EMAIL', 'Email');
$joinedtrl = _t('Statistics.JOINED');
$top = <<<HTML
<div id="usertable" style="display: none">
<h2>Registered Users</h2>
<p><a href="$baseURL/admin/statistics/usercsv">Export as CSV</a></p>
<h2>{$registereduserstrl}</h2>
<p><a href="$baseURL/admin/statistics/usercsv">{$exporttrl}</a></p>
<table class="sortable-onload-1 rowstyle-alt no-arrow paginate-10 statstable" border="0" cellspacing="1" cellpadding="0">
<thead>
<tr><th class="sortable-numeric">ID</th><th class="sortable-text">Email</th><th class="sortable-sortDatetime">Joined</th></tr>
<tr><th class="sortable-numeric">{$idtrl}</th><th class="sortable-text">{$emailtrl}</th><th class="sortable-sortDatetime">{$joinedtrl}</th></tr>
</thead>
<tbody>
HTML;
@ -174,12 +186,19 @@ HTML;
static function get_recent_views($limit = 15) {
$records = DataObject::get('PageView', null, 'Created DESC', null, $limit);
$recentpvtrl = _t('Statistics.RECENTPAGEVIEWS', 'Recent Page Views');
$idtrl = _t('Statistics.ID', 'ID');
$timetrl = _t('Statistics.TIME', 'Time');
$browsertrl = _t('Statistics.BROWSER', 'Browser');
$ostrl = _t('Statistics.OSABREV', 'OS');
$usertrl = _t('Statistics.USER', 'User');
$pagetrl = _t('Statistics.PAGE', 'Page');
$top = <<<HTML
<div id="recentviewtable">
<h2>Recent Page Views</h2>
<h2>{$recentpvtrl}</h2>
<table class="sortable-onload-1 rowstyle-alt no-arrow paginate-10 statstable" border="0" cellspacing="1" cellpadding="0">
<thead>
<tr><th class="sortable-numeric">ID</th><th class="sortable-sortDatetime">Time</th><th class="sortable-text">Browser</th><th class="sortable-text">OS</th><th>User</th><th class="sortable-text">Page</th></tr>
<tr><th class="sortable-numeric">{$idtrl}</th><th class="sortable-sortDatetime">{$timetrl}</th><th class="sortable-text">{$browsertrl}</th><th class="sortable-text">{$ostrl}</th><th>{$usertrl}</th><th class="sortable-text">{$pagetrl}</th></tr>
</thead>
<tbody>
HTML;
@ -253,13 +272,21 @@ HTML;
$records = DataObject::get('PageView');
}
$baseURL = Director::baseURL();
$pageviewstrl = _t('Statistics.PAGEVIEWS', 'Page Views');
$idtrl = _t('Statistics.ID', 'ID');
$timetrl = _t('Statistics.TIME', 'Time');
$browsertrl = _t('Statistics.BROWSER', 'Browser');
$ostrl = _t('Statistics.OSABREV', 'OS');
$usertrl = _t('Statistics.USER', 'User');
$pagetrl = _t('Statistics.PAGE', 'Page');
$exporttrl = _t('Statistics.CSVEXPORT', 'Export as CSV');
$top = <<<HTML
<div id="viewtable" style="display: none">
<h2>Page Views</h2>
<p><a href="$baseURL/admin/statistics/viewcsv">Export as CSV</a></p>
<h2>{$pageviewstrl}</h2>
<p><a href="$baseURL/admin/statistics/viewcsv">{$exporttrl}</a></p>
<table class="sortable-onload-1 rowstyle-alt no-arrow paginate-10 statstable" border="0" cellspacing="1" cellpadding="0">
<thead>
<tr><th class="sortable-numeric">ID</th><th class="sortable-sortDatetime">Time</th><th class="sortable-text">Browser</th><th class="sortable-text">OS</th><th class="sortable-text">User</th><th class="sortable-text">Page</th></tr>
<tr><th class="sortable-numeric">{$idtrl}</th><th class="sortable-sortDatetime">{$timetrl}</th><th class="sortable-text">{$browsertrl}</th><th class="sortable-text">{$ostrl}</th><th class="sortable-text">{$usertrl}</th><th class="sortable-text">{$pagetrl}</th></tr>
</thead>
<tbody>
HTML;
@ -283,9 +310,10 @@ HTML;
}
static function browser_chart($type = "Pie", $color = "blue") {
$browserstrl = _t('Statistics.BROWSERS', 'Browsers');
$top = <<<HTML
<div id="browserchart" style="display: none">
<h2>Browsers</h2>
<h2>{$browserstrl}</h2>
<div><canvas id="bchart" height="400" width="700"></canvas></div>
</div>
@ -346,9 +374,10 @@ HTML;
}
static function os_chart($type = "Pie", $color = "blue") {
$ostrl = _t('Statistics.OS', 'Operating Systems');
$top = <<<HTML
<div id="oschart" style="display: none">
<h2>Operating Systems</h2>
<h2>{$ostrl}</h2>
<div><canvas id="ochart" height="400" width="700"></canvas></div>
</div>
@ -409,9 +438,10 @@ HTML;
}
static function activity_chart($type = "Pie", $color = "blue") {
$useracttrl = _t('Statistics.USERACTIVITY', 'User Activity');
$top = <<<HTML
<div id="uacchart" style="display: none">
<h2>User Activity</h2>
<h2>{$useracttrl}</h2>
<div><canvas id="uchart" height="400" width="700"></canvas></div>
</div>

View File

@ -1,9 +1,9 @@
;;; Provided courtesy of http://browsers.garykeith.com
;;; Created on September 7, 2007 at 2:21:50 AM GMT
;;; Created on October 28, 2007 at 11:35:15 PM GMT
[GJK_Browscap_Version]
Version=3966
Released=Fri, 07 Sep 2007 02:21:50 -0000
Version=3972
Released=Sun, 28 Oct 2007 23:35:15 -0000
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; DefaultProperties
@ -155,7 +155,6 @@ Crawler=true
[Mozilla/4.0]
Parent=Inktomi
Browser=Mozilla/4.0
[Mozilla/4.0 (compatible; MSIE 5.0; Windows NT)]
Parent=Inktomi
@ -381,9 +380,6 @@ Tables=true
Cookies=true
Crawler=true
[Mozilla/4.0 (compatible; MSIE 5.0; YANDEX)]
Parent=Yandex
[Yandex/*]
Parent=Yandex
@ -397,199 +393,6 @@ Parent=Yandex
Browser=YandexSomething
isSyndicationReader=true
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Accoona
[Accoona]
Parent=DefaultProperties
Browser=Accoona
Frames=true
IFrames=true
Tables=true
Crawler=true
[accoona*]
Parent=Accoona
Browser=Accoona
[Accoona-AI-Agent/* (crawler at accoona dot com)]
Parent=Accoona
Browser=Accoona-AI-Agent
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Best of the Web
[Best of the Web]
Parent=DefaultProperties
Browser=Best of the Web
Frames=true
Tables=true
[Mozilla/4.0 (compatible; BOTW Feed Grabber; *http://botw.org)]
Parent=Best of the Web
Browser=BOTW Feed Grabber
isSyndicationReader=true
Crawler=false
[Mozilla/4.0 (compatible; BOTW Spider; *http://botw.org)]
Parent=Best of the Web
Browser=BOTW Spider
Stripper=true
isBanned=true
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Boitho
[Boitho]
Parent=DefaultProperties
Browser=Boitho
Frames=true
Tables=true
Crawler=true
[boitho.com-dc/*]
Parent=Boitho
Browser=boitho.com-dc
[boitho.com-robot/*]
Parent=Boitho
Browser=boitho.com-robot
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Convera
[Convera]
Parent=DefaultProperties
Browser=Convera
Frames=true
Tables=true
Crawler=true
[ConveraCrawler/*]
Parent=Convera
Browser=ConveraCrawler
[ConveraMultiMediaCrawler/0.1*]
Parent=Convera
Browser=ConveraMultiMediaCrawler
Version=0.1
MajorVer=0
MinorVer=1
[CrawlConvera*]
Parent=Convera
Browser=CrawlConvera
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Entireweb
[Entireweb]
Parent=DefaultProperties
Browser=Entireweb
Frames=true
IFrames=true
Tables=true
Stripper=true
isBanned=true
Crawler=true
[Mozilla/4.0 (compatible; SpeedySpider; www.entireweb.com)]
Parent=Entireweb
[Speedy Spider (*Beta/*)]
Parent=Entireweb
[Speedy?Spider?(http://www.entireweb.com*)]
Parent=Entireweb
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Envolk
[Envolk]
Parent=DefaultProperties
Browser=Envolk
Frames=true
IFrames=true
Tables=true
Stripper=true
isBanned=true
Crawler=true
[envolk/* (?http://www.envolk.com/envolk*)]
Parent=Envolk
[envolk?ITS?spider/* (?http://www.envolk.com/envolk*)]
Parent=Envolk
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Exalead
[Exalead]
Parent=DefaultProperties
Browser=Exalead
Frames=true
Tables=true
Stripper=true
isBanned=true
Crawler=true
[Exabot-Images/1.0]
Parent=Exalead
Browser=Exabot-Images
Version=1.0
MajorVer=1
MinorVer=0
[Exabot-Test/*]
Parent=Exalead
Browser=Exabot-Test
[Exabot/2.0]
Parent=Exalead
Browser=Exabot
[Exabot/3.0]
Parent=Exalead
Browser=Exabot
Version=3.0
MajorVer=3
MinorVer=0
Platform=Liberate
[Exalead NG/*]
Parent=Exalead
Browser=Exalead NG
Stripper=true
isBanned=true
[Mozilla/5.0 (compatible; Exabot-Images/3.0;*)]
Parent=Exalead
Browser=Exabot-Images
[Mozilla/5.0 (compatible; Exabot/3.0;*)]
Parent=Exalead
Browser=Exabot
Stripper=false
isBanned=false
[Mozilla/5.0 (compatible; NGBot/*)]
Parent=Exalead
[ng/*]
Parent=Exalead
Browser=Exalead Previewer
Version=1.0
MajorVer=1
MinorVer=0
Stripper=true
isBanned=true
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Excite
[Excite]
Parent=DefaultProperties
Browser=Excite
Frames=true
Tables=true
Crawler=true
[Mozilla/4.0 (compatible; * sureseeker.com*)]
Parent=Excite
Browser=Excite sureseeker.com
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Fast/AllTheWeb
[Fast/AllTheWeb]
@ -657,90 +460,6 @@ Browser=FAST-WebCrawler/Multimedia
Parent=Fast/AllTheWeb
Browser=FastSearch Web Crawler
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Galaxy
[Galaxy]
Parent=DefaultProperties
Browser=Galaxy
Frames=true
Tables=true
Crawler=true
[GalaxyBot/*0 (http://www.galaxy.com/galaxybot.html)]
Parent=Galaxy
Browser=GalaxyBot
[Mozilla/* (compatible; MSIE *; www.galaxy.com;*)]
Parent=Galaxy
Browser=GalaxyBot
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Ilse
[Ilse]
Parent=DefaultProperties
Browser=Ilse
Frames=true
Tables=true
Crawler=true
[IlseBot/*]
Parent=Ilse
[INGRID/?.0*]
Parent=Ilse
Browser=Ilse
[Mozilla/3.0 (INGRID/*]
Parent=Ilse
Browser=Ilse
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; iVia Project
[iVia Project]
Parent=DefaultProperties
Browser=iVia Project
Frames=true
IFrames=true
Tables=true
Crawler=true
[DataFountains/DMOZ Downloader*]
Parent=iVia Project
Browser=DataFountains/DMOZ Downloader
Stripper=true
isBanned=true
[DataFountains/DMOZ Feature Vector Corpus Creator*]
Parent=iVia Project
Browser=DataFountains/DMOZ Feature Vector Corpus
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Jayde Online
[Jayde Online]
Parent=DefaultProperties
Browser=Jayde Online
Frames=true
Tables=true
Crawler=true
[ExactSeek Crawler/*]
Parent=Jayde Online
Browser=ExactSeek Crawler
[exactseek-pagereaper-* (crawler@exactseek.com)]
Parent=Jayde Online
Browser=exactseek-pagereaper
Stripper=true
isBanned=true
[exactseek.com]
Parent=Jayde Online
Browser=exactseek.com
[Jayde Crawler*]
Parent=Jayde Online
Browser=Jayde Crawler
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Lycos
[Lycos]
@ -766,44 +485,6 @@ Browser=Lycos-Spider_(modspider)
Parent=Lycos
Browser=Lycos-Spider_(T-Rex)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Naver
[Naver]
Parent=DefaultProperties
Browser=Naver
Stripper=true
isBanned=true
Crawler=true
[Cowbot-* (NHN Corp*naver.com)]
Parent=Naver
Browser=Naver Cowbot
[Mozilla/4.0 (compatible; NaverBot/*; *)]
Parent=Naver
[Mozilla/4.0 (compatible; NaverBot/*; nhnbot@naver.com)]
Parent=Naver
Browser=Naver NaverBot
[NaverBot-* (NHN Corp*naver.com)]
Parent=Naver
Browser=Naver NHN Corp
[Yeti/*]
Parent=Naver
Browser=Yeti
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Onet.pl Szukaj
[Onet.pl Szukaj]
Parent=DefaultProperties
Browser=Onet.pl Szukaj
Frames=true
IFrames=true
Tables=true
Crawler=true
[Mozilla/5.0 (compatible; OnetSzukaj/5.0*]
Parent=Onet.pl Szukaj
Browser=OnetSzukaj
@ -812,1466 +493,20 @@ Browser=OnetSzukaj
Parent=Onet.pl Szukaj
Browser=Onet.pl
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Openfind
[Openfind]
Parent=DefaultProperties
Browser=Openfind
Frames=true
Tables=true
Crawler=true
[Gaisbot/*]
Parent=Openfind
[Openbot/*]
Parent=Openfind
[Openfind data gatherer*]
Parent=Openfind
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Orbiter
[Orbiter]
Parent=DefaultProperties
Browser=Orbiter
Frames=true
Tables=true
Crawler=true
[Orbiter (?http://www.dailyorbit.com/bot.htm)]
Parent=Orbiter
[Orbiter (?http://www.thatsearchengine.com/bot.htm)]
Parent=Orbiter
Browser=Orbiter
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; PeerFactory
[PeerFactory]
Parent=DefaultProperties
Browser=PeerFactory
Frames=true
Tables=true
Stripper=true
isBanned=true
Crawler=true
[PeerFactor 404 crawler]
Parent=PeerFactory
Browser=PeerFactor 404 crawler
[PeerFactor Crawler]
Parent=PeerFactory
Browser=PeerFactor Crawler
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Pogodak!
[Pogodak]
Parent=DefaultProperties
Browser=Pogodak!
Frames=true
Tables=true
Stripper=true
isBanned=true
Crawler=true
[Mozilla/5.0 (compatible; Pogodak*)]
Parent=Pogodak
[Mozilla/5.0 (compatible; TridentSpider/*)]
Parent=Pogodak
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Relevare
[Relevare]
Parent=DefaultProperties
Browser=Relevare
Frames=true
Tables=true
Stripper=true
isBanned=true
Crawler=true
[bumblebee/*]
Parent=Relevare
Browser=Relevare
[Bumblebee@relevare.com]
Parent=Relevare
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Sensis
[Sensis]
Parent=DefaultProperties
Browser=Sensis
Frames=true
IFrames=true
Tables=true
Crawler=true
[Sensis Web Crawler (search_comments\at\sensis\dot\com\dot\au)]
Parent=Sensis
Browser=Sensis Web Crawler
[Sensis.com.au Web Crawler (search_comments\at\sensis\dot\com\dot\au)]
Parent=Sensis
Browser=Sensis.com.au Web Crawler
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Shunix
[Shunix]
Parent=DefaultProperties
Browser=Shunix
Frames=true
IFrames=true
Tables=true
Crawler=true
[Mozilla/5.0 (compatible; ShunixBot/*)]
Parent=Shunix
Browser=ShunixBot
[XunBot/*]
Parent=Shunix
Browser=Shunix XunBot
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Singing Fish
[Singing Fish]
Parent=DefaultProperties
Browser=Singing Fish
Frames=true
Tables=true
Crawler=true
[asterias/*]
Parent=Singing Fish
[Mozilla/* (compatible; *Asterias Crawler v*)*]
Parent=Singing Fish
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Snap
[Snap]
Parent=DefaultProperties
Browser=Snap
Stripper=true
isBanned=true
Crawler=true
[Mozilla/5.0 (*) Gecko/* Firefox/* SnapPreviewBot]
Parent=Snap
[snap.com beta crawler v0]
Parent=Snap
[snap.com*]
Parent=Snap
Browser=Snap
[Snapbot/*]
Parent=Snap
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Sogou
[Sogou]
Parent=DefaultProperties
Browser=Sogou
Frames=true
Tables=true
Stripper=true
isBanned=true
Crawler=true
[shaboyi spider]
Parent=Sogou
Browser=Sogou/Shaboyi Spider
[sogou js robot(*)]
Parent=Sogou
[Sogou Orion spider/*]
Parent=Sogou
Browser=Sogou Orion spider
[Sogou Pic Agent]
Parent=Sogou
Browser=Sogou/Image Crawler
[Sogou Pic Spider]
Parent=Sogou
Browser=Sogou Pic Spider
[Sogou Push Spider/*]
Parent=Sogou
Browser=Sogou Push Spider
[sogou spider]
Parent=Sogou
Browser=Sogou/Spider
[sogou test spider]
Parent=Sogou
Browser=sogou test spider
[sogou web spider*]
Parent=Sogou
Browser=sogou web spider
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Thunderstone
[Thunderstone]
Parent=DefaultProperties
Browser=Thunderstone
Frames=true
Tables=true
Stripper=true
isBanned=true
Crawler=true
[*Webinator*]
Parent=Thunderstone
Browser=Webinator
[Mozilla/* (compatible; T-H-U-N-D-E-R-S-T-O-N-E)]
Parent=Thunderstone
Browser=Texis
[T-H-U-N-D-E-R-S-T-O-N-E]
Parent=Thunderstone
Browser=Texis
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Vagabondo
[Vagabondo]
Parent=DefaultProperties
Browser=Vagabondo
Frames=true
IFrames=true
Tables=true
Crawler=true
[Mozilla/4.0 (compatible; Vagabondo/*)]
Parent=Vagabondo
Version=2.2
MajorVer=2
MinorVer=2
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; WISEnut
[WISEnut]
Parent=DefaultProperties
Browser=WISEnut
Frames=true
Tables=true
Crawler=true
[Mozilla/4.0 compatible ZyBorg/* (wn*.zyborg@looksmart.net; http://www.WISEnutbot.com)]
Parent=WISEnut
[Mozilla/4.0 compatible ZyBorg/* Dead Link Checker (*@looksmart.net; http://www.WISEnutbot.com)]
Parent=WISEnut
Browser=Dead Link Checker
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Yoono
[Yoono]
Parent=DefaultProperties
Browser=Yoono
Frames=true
Tables=true
Stripper=true
isBanned=true
Crawler=true
[Mozilla/5.0 (compatible; Yoono; http://www.yoono.com/)]
Parent=Yoono
[yoono/* web-crawler/*]
Parent=Yoono
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ZoomInfo
[ZoomInfo]
Parent=DefaultProperties
Browser=ZoomInfo
Frames=true
Tables=true
Stripper=true
isBanned=true
Crawler=true
[NextGenSearchBot 1 (for information visit http://about.zoominfo.com/PublicSite/NextGenSearchBot.asp)]
Parent=ZoomInfo
Browser=ZoomInfo
[NextGenSearchBot 1 (for information visit http://www.eliyon.com/NextGenSearchBot)]
Parent=ZoomInfo
Browser=Eliyon
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Zymboo
[Zymboo]
Parent=DefaultProperties
Browser=Zymboo
Frames=true
Tables=true
Crawler=true
[zymbot (renato@zymboo.com)]
Parent=Zymboo
Browser=zymbot
[zymbot renato@zymboo.com]
Parent=Zymboo
Browser=zymbot
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Directories
[Directories]
Parent=DefaultProperties
Browser=Directories
Frames=true
Tables=true
Crawler=true
[acontbot]
Parent=Directories
Browser=acontbot
[aipbot/*]
Parent=Directories
Browser=aipbot
[Findexa Crawler (http://www.findexa.no/gulesider/article26548.ece)]
Parent=Directories
Browser=Findexa Crawler
[FirstGov.gov Search - POC:firstgov.webmasters@gsa.gov]
Parent=Directories
Browser=FirstGov.gov Search
[http://www.istarthere.com (spider@istarthere.com)]
Parent=Directories
Browser=Istartere.com
Stripper=true
isBanned=true
[Mackster (*)]
Parent=Directories
Browser=Mackster
[Misterbot]
Parent=Directories
Browser=Misterbot
[Mozilla/4.0 (compatible; MSIE 5.0; www.galaxy.com;*)]
Parent=Directories
Browser=Galaxy/LOGIKA Search Engine
[Mozilla/5.0 (?http://www.toile.com/) ToileBot/*]
Parent=Directories
Browser=Toile
[Mozilla/5.0 (Votay bot/*)]
Parent=Directories
Browser=Votay
Stripper=true
isBanned=true
[Mozilla/6.0 (compatible; arameda.com Spider)]
Parent=Directories
Browser=Arameda
[NationalDirectory-*Spider/*]
Parent=Directories
Browser=National Directory
Stripper=true
isBanned=true
[Octopus/*]
Parent=Directories
Browser=Octopus
[OpenIntelligenceData/1.* (?http://www.worldwideweb-x.com/openData.html)]
Parent=Directories
Browser=World Wide Web Directory Project
Version=1.0
MajorVer=1
MinorVer=0
Stripper=true
isBanned=true
[Poirot]
Parent=Directories
Browser=Poirot
[silk/1.*]
Parent=Directories
Browser=Slider
Version=1.0
MajorVer=1
MinorVer=0
[WebFindBot(http://www.web-find.com)]
Parent=Directories
Browser=WebFindBot
[Best Whois (http://www.bestwhois.net/)]
Parent=DNS Tools
Browser=Best Whois
[DNSGroup/*]
Parent=DNS Tools
Browser=DNS Group Crawler
[NG-Search/*]
Parent=Exalead
Browser=NG-SearchBot
[TouchStone]
Parent=Feeds Syndicators
Browser=TouchStone
isSyndicationReader=true
[flatlandbot/*]
Parent=Flatland Industries
Browser=flatlandbot
Stripper=true
isBanned=true
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; General Crawlers
[General Crawlers]
Parent=DefaultProperties
Browser=General Crawlers
Frames=true
IFrames=true
Tables=true
Crawler=true
[*autokrawl*]
Parent=General Crawlers
Browser=autokrawl
Stripper=true
isBanned=true
[*Networking4all*]
Parent=General Crawlers
Browser=Networking4all Bot
[Aport]
Parent=General Crawlers
Browser=Aport
[ArachnetAgent*]
Parent=General Crawlers
[Art-Online.com*]
Parent=General Crawlers
Browser=Art-Online.com
[BabalooSpider/1.*]
Parent=General Crawlers
Browser=BabalooSpider
[BeijingCrawler]
Parent=General Crawlers
Browser=BeijingCrawler
Stripper=true
isBanned=true
[BilgiBot/*]
Parent=General Crawlers
Browser=BilgiBot
Stripper=true
isBanned=true
[bot/* (bot; *bot@bot.bot)]
Parent=General Crawlers
Browser=bot
Stripper=true
isBanned=true
[botlist]
Parent=General Crawlers
Browser=botlist
Stripper=true
isBanned=true
[Botswana*]
Parent=General Crawlers
Browser=Botswana
[BravoBrian BStop*]
Parent=General Crawlers
Browser=BravoBrian BStop
[BruinBot*]
Parent=General Crawlers
Browser=BruinBot
[CacheabilityEngine/*]
Parent=General Crawlers
Browser=CacheabilityEngine
[ccubee/*]
Parent=General Crawlers
Browser=ccubee
[CFM-SearchBot(http://www.cfm-search.com)]
Parent=General Crawlers
Browser=CFM-SearchBot
[CJNetworkQuality; http://www.cj.com/networkquality]
Parent=General Crawlers
Browser=CJNetworkQuality
Frames=true
Tables=true
Cookies=true
[Clushbot/*]
Parent=General Crawlers
Browser=Clushbot
Stripper=true
isBanned=true
[Comodo HTTP(S) Crawler*]
Parent=General Crawlers
Browser=Comodo HTTP Crawler
[Crawler Mozilla/4.0]
Parent=General Crawlers
Stripper=true
isBanned=true
[CrawlWave/*]
Parent=General Crawlers
Browser=CrawlWave
[CSHttpClient/*]
Parent=General Crawlers
Browser=CSHttpClient
[CydralSpider/1.9*]
Parent=General Crawlers
Browser=Cydral Web Image Search
Version=1.9
MajorVer=1
MinorVer=9
Stripper=true
isBanned=true
[Cynthia 1.0]
Parent=General Crawlers
Browser=Cynthia
Version=1.0
MajorVer=1
MinorVer=0
[DiamondBot/*]
Parent=General Crawlers
Browser=DiamondBot
Stripper=true
isBanned=true
[Diff-Engine*]
Parent=General Crawlers
[DomainsBotBot/1.*]
Parent=General Crawlers
Browser=DomainsBotBot
Stripper=true
isBanned=true
[DomainsDB.net MetaCrawler*]
Parent=General Crawlers
Browser=DomainsDB
[dragonfly(ebingbong#playstarmusic.com)]
Parent=General Crawlers
Browser=eBingBong
Stripper=true
isBanned=true
[Drupal (*)]
Parent=General Crawlers
Browser=Drupal
[DTAAgent]
Parent=General Crawlers
Browser=DTAAgent
[Dumbot (version *)]
Parent=General Crawlers
Browser=Dumbfind
[EARTHCOM.info/*]
Parent=General Crawlers
Browser=EarthCom
[EDI/* (Edacious & Intelligent*)]
Parent=General Crawlers
Browser=Edacious & Intelligent Web Crawler
Stripper=true
isBanned=true
[EmeraldShield.com*]
Parent=General Crawlers
Browser=EmeraldShield
Stripper=true
isBanned=true
[EuripBot/*]
Parent=General Crawlers
Browser=Europe Internet Portal
[eventax/*]
Parent=General Crawlers
Browser=eventax
[FANGCrawl/*]
Parent=General Crawlers
Browser=FANGCrawl
Stripper=true
isBanned=true
[favorstarbot/*]
Parent=General Crawlers
Browser=favorstarbot
Stripper=true
isBanned=true
[FRSEEKBOT]
Parent=General Crawlers
Browser=FRSEEKBOT
[Gaisbot*]
Parent=General Crawlers
Browser=Gaisbot
[GeoBot/*]
Parent=General Crawlers
Browser=GeoBot
[grub crawler]
Parent=General Crawlers
Browser=grub crawler
[HiddenMarket-*]
Parent=General Crawlers
Browser=HiddenMarket
Stripper=true
isBanned=true
[htdig/*]
Parent=General Crawlers
Browser=ht://Dig
[HTTP-Test-Program]
Parent=General Crawlers
Browser=WebBug
MajorVer=5
[HTTP/1.0]
Parent=General Crawlers
Browser=HTTP/1.0
[http://www.almaden.ibm.com/cs/crawler*]
Parent=General Crawlers
Browser=IBM's WebFountain
[ichiro/*]
Parent=General Crawlers
Browser=ichiro
[InnerpriseBot/*]
Parent=General Crawlers
Browser=InnerpriseBot
[InternetLinkAgent/*]
Parent=General Crawlers
Browser=InternetLinkAgent
[iVia Page Fetcher*]
Parent=General Crawlers
Browser=iVia Software
Stripper=true
isBanned=true
[JetBrains*]
Parent=General Crawlers
Browser=Omea Pro
[KakleBot - www.kakle.com/0.1]
Parent=General Crawlers
Browser=KakleBot
[KBeeBot/0.*]
Parent=General Crawlers
Browser=KBeeBot
Stripper=true
isBanned=true
[Keyword Density/*]
Parent=General Crawlers
Browser=Keyword Density
[LetsCrawl.com/1.0*]
Parent=General Crawlers
Browser=LetsCrawl.com
Stripper=true
isBanned=true
[Lincoln State Web Browser]
Parent=General Crawlers
Browser=Lincoln State Web Browser
Stripper=true
isBanned=true
[Links4US-Crawler,*]
Parent=General Crawlers
Browser=Links4US-Crawler
Stripper=true
isBanned=true
[Lorkyll *.* -- lorkyll@444.net]
Parent=General Crawlers
Browser=Lorkyll
Stripper=true
isBanned=true
[Lsearch/sondeur]
Parent=General Crawlers
Browser=Lsearch/sondeur
Stripper=true
isBanned=true
[MapoftheInternet.com?(?http://MapoftheInternet.com)]
Parent=General Crawlers
Browser=MapoftheInternet
Stripper=true
isBanned=true
[Marvin v0.3]
Parent=General Crawlers
Browser=MedHunt
Version=0.3
MajorVer=0
MinorVer=3
[masidani_bot_v0.6*]
Parent=General Crawlers
Browser=masidani_bot
[Metaspinner/0.01 (Metaspinner; http://www.meta-spinner.de/; support@meta-spinner.de/)]
Parent=General Crawlers
Browser=Metaspinner/0.01
Version=0.01
MajorVer=0
MinorVer=01
[metatagsdir/*]
Parent=General Crawlers
Browser=metatagsdir
Stripper=true
isBanned=true
[Miva (AlgoFeedback@miva.com)]
Parent=General Crawlers
Browser=Miva
[moget/*]
Parent=General Crawlers
Browser=Goo
[Mozdex/0.7.2*]
Parent=General Crawlers
Browser=Mozdex
[Mozilla Compatible (MS IE 3.01 WinNT)]
Parent=General Crawlers
Stripper=true
isBanned=true
[Mozilla/* (compatible; WebCapture*)]
Parent=General Crawlers
Browser=WebCapture
[Mozilla/4.0 (compatible; DepSpid/*)]
Parent=General Crawlers
Browser=DepSpid
[Mozilla/4.0 (compatible; MSIE 4.01; Vonna.com b o t)]
Parent=General Crawlers
Browser=Vonna.com
Stripper=true
isBanned=true
[Mozilla/4.0 (compatible; MSIE 4.01; Windows95)]
Parent=General Crawlers
Win32=true
[Mozilla/4.0 (compatible; MSIE 4.5; Windows 98; )]
Parent=General Crawlers
Win32=true
[Mozilla/4.0 (compatible; MyFamilyBot/*)]
Parent=General Crawlers
Browser=MyFamilyBot
[Mozilla/4.0 (compatible; N-Stealth)]
Parent=General Crawlers
Browser=N-Stealth
[Mozilla/4.0 (compatible; Scumbot/*; Linux/*)]
Parent=General Crawlers
Stripper=true
isBanned=true
[Mozilla/4.0 (compatible; Spider; Linux)]
Parent=General Crawlers
Stripper=true
isBanned=true
[Mozilla/4.1]
Parent=General Crawlers
Stripper=true
isBanned=true
[Mozilla/4.5]
Parent=General Crawlers
Stripper=true
isBanned=true
[Mozilla/5.0 (compatible; AboutUsBot/*)]
Parent=General Crawlers
Browser=AboutUsBot
[Mozilla/5.0 (compatible; BuzzRankingBot/*)]
Parent=General Crawlers
Browser=BuzzRankingBot
Stripper=true
isBanned=true
[mozilla/5.0 (compatible; genevabot http://www.healthdash.com)]
Parent=General Crawlers
Browser=Healthdash
[Mozilla/5.0 (compatible; Kyluka crawl; http://www.kyluka.com/crawl.html; crawl@kyluka.com)]
Parent=General Crawlers
Browser=Kyluka
[Mozilla/5.0 (compatible; Twingly Recon; http://www.twingly.com/)]
Parent=General Crawlers
Browser=Twingly Recon
[Mozilla/5.0 (compatible; unwrapbot/2.*; http://www.unwrap.jp*)]
Parent=General Crawlers
Browser=UnWrap
[Mozilla/5.0 (compatible; Vermut*)]
Parent=General Crawlers
Browser=Vermut
[Mozilla/5.0 (compatible; Webbot/*)]
Parent=General Crawlers
Browser=Webbot.ru
Stripper=true
isBanned=true
[n4p_bot*]
Parent=General Crawlers
Browser=n4p_bot
[nabot*]
Parent=General Crawlers
Browser=Nabot
[NetCarta_WebMapper/*]
Parent=General Crawlers
Browser=NetCarta_WebMapper
Stripper=true
isBanned=true
[neTVision AG andreas.heidoetting@thomson-webcast.net]
Parent=General Crawlers
Browser=neTVision
[NextopiaBOT*]
Parent=General Crawlers
Browser=NextopiaBOT
[nicebot]
Parent=General Crawlers
Browser=nicebot
Stripper=true
isBanned=true
[niXXieBot?Foster*]
Parent=General Crawlers
Browser=niXXiebot-Foster
[Nozilla/P.N (Just for IDS woring)]
Parent=General Crawlers
Browser=Nozilla/P.N
Stripper=true
isBanned=true
[Nudelsalat/*]
Parent=General Crawlers
Browser=Nudelsalat
Stripper=true
isBanned=true
[Ocelli/*]
Parent=General Crawlers
Browser=Ocelli
[OpenTaggerBot (http://www.opentagger.com/opentaggerbot.htm)]
Parent=General Crawlers
Browser=OpenTaggerBot
[Oracle Enterprise Search]
Parent=General Crawlers
Browser=Oracle Enterprise Search
Stripper=true
isBanned=true
[Oracle Ultra Search]
Parent=General Crawlers
Browser=Oracle Ultra Search
[Pajaczek/*]
Parent=General Crawlers
Browser=Pajaczek
Stripper=true
isBanned=true
[panscient.com]
Parent=General Crawlers
Browser=panscient.com
Stripper=true
isBanned=true
[Patwebbot (http://www.herz-power.de/technik.html)]
Parent=General Crawlers
Browser=Patwebbot
[Pete-Spider/1.*]
Parent=General Crawlers
Browser=Pete-Spider
Stripper=true
isBanned=true
[PhpDig/*]
Parent=General Crawlers
Browser=PhpDig
[PlantyNet_WebRobot*]
Parent=General Crawlers
Browser=PlantyNet
Stripper=true
isBanned=true
[PMAFind]
Parent=General Crawlers
Browser=PMAFind
Stripper=true
isBanned=true
[Poodle_predictor_1.0]
Parent=General Crawlers
Browser=Poodle Predictor
[QuickFinder Crawler]
Parent=General Crawlers
Browser=QuickFinder
Stripper=true
isBanned=true
[Radiation Retriever*]
Parent=General Crawlers
Browser=Radiation Retriever
Stripper=true
isBanned=true
[RedCarpet/*]
Parent=General Crawlers
Browser=RedCarpet
Stripper=true
isBanned=true
[RixBot (http://babelserver.org/rix)]
Parent=General Crawlers
Browser=RixBot
[SBIder/*]
Parent=General Crawlers
Browser=SiteSell
[ScollSpider/2.*]
Parent=General Crawlers
Browser=ScollSpider
Stripper=true
isBanned=true
[Search Fst]
Parent=General Crawlers
Browser=Search Fst
[searchbot admin@google.com]
Parent=General Crawlers
Browser=searchbot
Stripper=true
isBanned=true
[Seeker.lookseek.com]
Parent=General Crawlers
Browser=LookSeek
Stripper=true
isBanned=true
[semanticdiscovery/*]
Parent=General Crawlers
Browser=Semantic Discovery
[SeznamBot/*]
Parent=General Crawlers
Browser=SeznamBot
Stripper=true
isBanned=true
[shelob v1.*]
Parent=General Crawlers
Browser=shelob
Stripper=true
isBanned=true
[ShopWiki/1.0*]
Parent=General Crawlers
Browser=ShopWiki
Version=1.0
MajorVer=1
MinorVer=0
[ShowXML/1.0 libwww/5.4.0]
Parent=General Crawlers
Browser=ShowXML
Stripper=true
isBanned=true
[sitecheck.internetseer.com*]
Parent=General Crawlers
Browser=Internetseer
[SMBot/*]
Parent=General Crawlers
Browser=SMBot
[sohu*]
Parent=General Crawlers
Browser=sohu-search
Stripper=true
isBanned=true
[SpankBot*]
Parent=General Crawlers
Browser=SpankBot
Stripper=true
isBanned=true
[spider (tspyyp@tom.com)]
Parent=General Crawlers
Browser=spider (tspyyp@tom.com)
Stripper=true
isBanned=true
[Sunrise/0.*]
Parent=General Crawlers
Browser=Sunrise
Stripper=true
isBanned=true
[SurveyBot/*]
Parent=General Crawlers
Browser=SurveyBot
Stripper=true
isBanned=true
[SynapticSearch/AI Crawler 1.?]
Parent=General Crawlers
Browser=SynapticSearch
Stripper=true
isBanned=true
[SyncMgr]
Parent=General Crawlers
Browser=SyncMgr
[Tagyu Agent/1.0]
Parent=General Crawlers
Browser=Tagyu
[Talkro Web-Shot/*]
Parent=General Crawlers
Browser=Talkro Web-Shot
Stripper=true
isBanned=true
[Tecomi Bot (http://www.tecomi.com/bot.htm)]
Parent=General Crawlers
Browser=Tecomi
[TheInformant*]
Parent=General Crawlers
Browser=TheInformant
Stripper=true
isBanned=true
[Tutorial Crawler*]
Parent=General Crawlers
Stripper=true
isBanned=true
[UbiCrawler/*]
Parent=General Crawlers
Browser=UbiCrawler
[UCmore]
Parent=General Crawlers
Browser=UCmore
[User*Agent:*]
Parent=General Crawlers
Stripper=true
isBanned=true
[VadixBot]
Parent=General Crawlers
Browser=VadixBot
[VengaBot/*]
Parent=General Crawlers
Browser=VengaBot
Stripper=true
isBanned=true
[Visicom Toolbar]
Parent=General Crawlers
Browser=Visicom Toolbar
[W3C-WebCon/*]
Parent=General Crawlers
Browser=W3C-WebCon
[Webclipping.com]
Parent=General Crawlers
Browser=Webclipping.com
Stripper=true
isBanned=true
[WebCrawler_1.*]
Parent=General Crawlers
Browser=WebCrawler
[WebFilter Robot*]
Parent=General Crawlers
Browser=WebFilter Robot
[WeBoX/*]
Parent=General Crawlers
Browser=WeBoX
[WebTrends/*]
Parent=General Crawlers
Browser=WebTrends
[West Wind Internet Protocols*]
Parent=General Crawlers
Browser=Versatel
Stripper=true
isBanned=true
[WhizBang]
Parent=General Crawlers
Browser=WhizBang
[Willow Internet Crawler by Twotrees V*]
Parent=General Crawlers
Browser=Willow Internet Crawler
[WIRE/* (Linux; i686; Bot,Robot,Spider,Crawler)]
Parent=General Crawlers
Browser=WIRE
Stripper=true
isBanned=true
[www.fi crawler, contact crawler@www.fi]
Parent=General Crawlers
Browser=www.fi crawler
[Xerka WebBot v1.*]
Parent=General Crawlers
Browser=Xerka
Stripper=true
isBanned=true
[XML Sitemaps Generator*]
Parent=General Crawlers
Browser=XML Sitemaps Generator
[XSpider*]
Parent=General Crawlers
Browser=XSpider
Stripper=true
isBanned=true
[YooW!/* (?http://www.yoow.eu)]
Parent=General Crawlers
Browser=YooW!
Stripper=true
isBanned=true
[FOTOCHECKER]
Parent=Image Crawlers
Browser=FOTOCHECKER
Stripper=true
isBanned=true
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Search Engines
[Search Engines]
Parent=DefaultProperties
Browser=Search Engines
Frames=true
Tables=true
Crawler=true
[*FDSE robot*]
Parent=Search Engines
Browser=FDSE Robot
[*Fluffy the spider*]
Parent=Search Engines
Browser=SearchHippo
[Abacho*]
Parent=Search Engines
Browser=Abacho
[ah-ha.com crawler (crawler@ah-ha.com)]
Parent=Search Engines
Browser=Ah-Ha
[AIBOT/*]
Parent=Search Engines
Browser=21Seek.Com
[ALeadSoftbot/*]
Parent=Search Engines
Browser=ALeadSoftbot
[Amfibibot/*]
Parent=Search Engines
Browser=Amfibi
[AnswerBus (http://www.answerbus.com/)]
Parent=Search Engines
[antibot-V*]
Parent=Search Engines
Browser=antibot
[appie*(www.walhello.com)]
Parent=Search Engines
Browser=Walhello
[ASPSeek/*]
Parent=Search Engines
Browser=ASPSeek
[BigCliqueBOT/*]
Parent=Search Engines
Browser=BigClique.com/BigClic.com
[Blaiz-Bee/*]
Parent=Search Engines
Browser=RawGrunt
[btbot/*]
Parent=Search Engines
Browser=Bit Torrent Search Engine
[CipinetBot (http://www.cipinet.com/bot.html)]
Parent=Search Engines
Browser=CipinetBot
[cosmos*]
Parent=Search Engines
Browser=Xyleme
[Deepindex]
Parent=Search Engines
Browser=Deepindex
[DiamondBot]
Parent=Search Engines
Browser=DiamondBot
[Eule?Robot*]
Parent=Search Engines
Browser=Eule-Robot
[Faxobot/*]
Parent=Search Engines
Browser=Faxo
[Filangy/*]
Parent=Search Engines
Browser=Filangy
[Fooky.com/ScorpionBot/ScoutOut;*]
Parent=Search Engines
Browser=ScorpionBot
Stripper=true
isBanned=true
[FyberSpider*]
Parent=Search Engines
Browser=FyberSpider
Stripper=true
isBanned=true
[gazz/*(gazz@nttr.co.jp)]
Parent=Search Engines
Browser=gazz
[geniebot*]
Parent=Search Engines
Browser=GenieKnows
[GOFORITBOT (?http://www.goforit.com/about/?)]
Parent=Search Engines
Browser=GoForIt
[GoGuidesBot/*]
Parent=Search Engines
Browser=GoGuidesBot
[GroschoBot/*]
Parent=Search Engines
Browser=GroschoBot
[GurujiBot/1.*]
Parent=Search Engines
Browser=GurujiBot
Stripper=true
isBanned=true
[HenryTheMiragoRobot*]
Parent=Search Engines
Browser=Mirago
[Hotzonu/*]
Parent=Search Engines
Browser=Hotzonu
[HyperEstraier/*]
Parent=Search Engines
Browser=HyperEstraier
Stripper=true
isBanned=true
[i1searchbot/*]
Parent=Search Engines
Browser=i1searchbot
[IIITBOT/1.*]
Parent=Search Engines
Browser=Indian Language Web Search Engine
[Iltrovatore-?etaccio/*]
Parent=Search Engines
Browser=Iltrovatore-Setaccio
[InfociousBot (?http://corp.infocious.com/tech_crawler.php)]
Parent=Search Engines
Browser=InfociousBot
Stripper=true
isBanned=true
[Infoseek SideWinder/*]
Parent=Search Engines
Browser=Infoseek
[iSEEKbot/*]
Parent=Search Engines
Browser=iSEEKbot
[Kolinka Forum Search (www.kolinka.com)]
Parent=Search Engines
Browser=Kolinka Forum Search
Stripper=true
isBanned=true
[KRetrieve/]
Parent=Search Engines
Browser=KRetrieve
Stripper=true
isBanned=true
[LapozzBot/*]
Parent=Search Engines
Browser=LapozzBot
[Linknzbot*]
Parent=Search Engines
Browser=Linknzbot
[LocalcomBot/*]
Parent=Search Engines
Browser=LocalcomBot
[Mail.Ru/1.0]
Parent=Search Engines
Browser=Mail.Ru
[MaSagool/*]
Parent=Search Engines
Browser=Sagoo
Version=1.0
MajorVer=1
MinorVer=0
[miniRank/*]
Parent=Search Engines
Browser=miniRank
[MJ12bot/*]
Parent=Search Engines
Browser=Majestic-12
[Mnogosearch*]
Parent=Search Engines
Browser=Mnogosearch
[Mozilla/0.9* no dos :) (Linux)]
Parent=Search Engines
Browser=goliat
Stripper=true
isBanned=true
[Mozilla/4.0 (compatible; Arachmo)]
Parent=Search Engines
Browser=Arachmo
[Mozilla/4.0 (compatible; MSIE *; Windows NT; Girafabot; girafabot at girafa dot com; http://www.girafa.com)]
Parent=Search Engines
Browser=Girafabot
Win32=true
[Mozilla/4.0 (compatible; MSIE 5.00; Windows 98]
Parent=Search Engines
Browser=directNIC
@ -2279,425 +514,6 @@ Win32=true
Stripper=true
isBanned=true
[Mozilla/4.0(?compatible; MSIE 6.0; Qihoo *)]
Parent=Search Engines
Browser=Qihoo
[Mozilla/4.7 (compatible; WhizBang; http://www.whizbang.com/crawler)]
Parent=Search Engines
Browser=Inxight Software
[Mozilla/5.0 (*) VoilaBot BETA 1.*]
Parent=Search Engines
Browser=VoilaBot
Stripper=true
isBanned=true
[Mozilla/5.0 (compatible; ActiveTouristBot*; http://www.activetourist.com)]
Parent=Search Engines
Browser=ActiveTouristBot
[Mozilla/5.0 (compatible; Charlotte/1.0b; *)]
Parent=Search Engines
Browser=Charlotte
Beta=true
Stripper=true
isBanned=true
[Mozilla/5.0 (compatible; CXL-FatAssANT (El Robeiro); http://www.conexcol.com/FatAssANT/; ANTid:alfa; v. 0.5.1)]
Parent=Search Engines
Browser=Conexcol.com
[Mozilla/5.0 (compatible; EARTHCOM.info/*)]
Parent=Search Engines
Browser=EARTHCOM
[Mozilla/5.0 (compatible; MojeekBot/2.0; http://www.mojeek.com/bot.html)]
Parent=Search Engines
Browser=MojeekBot
Version=2.0
MajorVer=2
MinorVer=0
[Mozilla/5.0 (compatible; NLCrawler/*]
Parent=Search Engines
Browser=Northern Light Web Search
[Mozilla/5.0 (compatible; OsO;*]
Parent=Search Engines
Browser=Octopodus
Stripper=true
isBanned=true
[Mozilla/5.0 (compatible; Quantcastbot/1.*)]
Parent=Search Engines
Browser=Quantcastbot
[Mozilla/5.0 (compatible; Scrubby/*; http://www.scrubtheweb.com/abs/meta-check.html)]
Parent=Search Engines
Browser=Scrubby
Stripper=true
isBanned=true
[Mozilla/5.0 CostaCider Search*]
Parent=Search Engines
Browser=CostaCider Search
[NavissoBot]
Parent=Search Engines
Browser=NavissoBot
[Norbert the Spider(Burf.com)]
Parent=Search Engines
Browser=Norbert the Spider
[NuSearch Spider*]
Parent=Search Engines
Browser=nuSearch
[ObjectsSearch/*]
Parent=Search Engines
Browser=ObjectsSearch
[OpenISearch/1.*]
Parent=Search Engines
Browser=OpenISearch (Amazon)
[Pagebull http://www.pagebull.com/]
Parent=Search Engines
Browser=Pagebull
[PEERbot*]
Parent=Search Engines
Browser=PEERbot
[Pompos/*]
Parent=Search Engines
Browser=Pompos
[Popdexter/*]
Parent=Search Engines
Browser=Popdex
[Qweery*]
Parent=Search Engines
Browser=QweeryBot
[RedCell/* (*)]
Parent=Search Engines
Browser=RedCell
[Scrubby/*]
Parent=Search Engines
Browser=Scrub The Web
[Search-10/*]
Parent=Search Engines
Browser=Search-10
[search.ch*]
Parent=Search Engines
Browser=Swiss Search Engine
[Searchmee! Spider*]
Parent=Search Engines
Browser=Searchmee!
[Seekbot/*]
Parent=Search Engines
Browser=Seekbot
[SiteSpider (http://www.SiteSpider.com/)]
Parent=Search Engines
Browser=SiteSpider
[Spinne/*]
Parent=Search Engines
Browser=Spinne
[sproose/*]
Parent=Search Engines
Browser=Sproose
[Sqeobot/0.*]
Parent=Search Engines
Browser=Branzel
Stripper=true
isBanned=true
[SquigglebotBot/*]
Parent=Search Engines
Browser=SquigglebotBot
Stripper=true
isBanned=true
[StackRambler/*]
Parent=Search Engines
Browser=StackRambler
[SygolBot*]
Parent=Search Engines
Browser=SygolBot
[SynoBot]
Parent=Search Engines
Browser=SynoBot
[Szukacz/*]
Parent=Search Engines
Browser=Szukacz
[Tarantula/*]
Parent=Search Engines
Browser=Tarantula
Stripper=true
isBanned=true
[TerrawizBot/*]
Parent=Search Engines
Browser=TerrawizBot
Stripper=true
isBanned=true
[Tkensaku/*]
Parent=Search Engines
Browser=Tkensaku
[TMCrawler]
Parent=Search Engines
Browser=TMCrawler
Stripper=true
isBanned=true
[updated/*]
Parent=Search Engines
Browser=Updated!
[URL Spider Pro/*]
Parent=Search Engines
Browser=URL Spider Pro
[URL Spider SQL*]
Parent=Search Engines
Browser=Innerprise Enterprise Search
[VMBot/*]
Parent=Search Engines
Browser=VMBot
[wadaino.jp-crawler*]
Parent=Search Engines
Browser=wadaino.jp
Stripper=true
isBanned=true
[WebAlta Crawler/*]
Parent=Search Engines
Browser=WebAlta Crawler
Stripper=true
isBanned=true
[WebCorp/*]
Parent=Search Engines
Browser=WebCorp
Stripper=true
isBanned=true
[webcrawl.net]
Parent=Search Engines
Browser=webcrawl.net
[WISEbot/*]
Parent=Search Engines
Browser=WISEbot
Stripper=true
isBanned=true
[Wotbox/*]
Parent=Search Engines
Browser=Wotbox
[www.zatka.com]
Parent=Search Engines
Browser=Zatka
[WWWeasel Robot v*]
Parent=Search Engines
Browser=World Wide Weasel
[YadowsCrawler*]
Parent=Search Engines
Browser=YadowsCrawler
[YodaoBot/*]
Parent=Search Engines
Browser=YodaoBot
Stripper=true
isBanned=true
[ZeBot_www.ze.bz*]
Parent=Search Engines
Browser=ZE.bz
[zibber-v*]
Parent=Search Engines
Browser=Zibb
[ZipppBot/*]
Parent=Search Engines
Browser=ZipppBot
[ATA-Translation-Service]
Parent=Translators
Browser=ATA-Translation-Service
[GJK_Browser_Check]
Parent=Version Checkers
Browser=GJK_Browser_Check
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Amazon.com
[Amazon.com]
Parent=DefaultProperties
Browser=Amazon.com
Stripper=true
isBanned=true
Crawler=true
[Intelix/*]
Parent=Amazon.com
Browser=Intelix
[Spock Crawler (http://www.spock.com/crawler)]
Parent=Amazon.com
Browser=Spock Crawler
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; DYNAMIC
[DYNAMIC]
Parent=DefaultProperties
Browser=DYNAMIC
Stripper=true
isBanned=true
Crawler=true
[DYNAMIC (*; http://www.dynamicplus.it; admin@dynamicplus.it)]
Parent=DYNAMIC
Browser=DYNAMIC+
[Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; DYNAMIC*)]
Parent=DYNAMIC
Win32=true
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Flatland Industries
[Flatland Industries]
Parent=DefaultProperties
Browser=Flatland Industries
Stripper=true
isBanned=true
Crawler=true
[great-plains-web-spider/flatlandbot*]
Parent=Flatland Industries
Browser=flatlandbot
[great-plains-web-spider/gpws]
Parent=Flatland Industries
Browser=flatlandbot
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Hatena
[Hatena]
Parent=DefaultProperties
Browser=Hatena
Stripper=true
isBanned=true
Crawler=true
[Feed::Find/0.*]
Parent=Hatena
Browser=Feed::Find
isSyndicationReader=true
[Hatena Antenna/*]
Parent=Hatena
Browser=Hatena Antenna
[Hatena Bookmark/*]
Parent=Hatena
Browser=Hatena Bookmark
[Hatena RSS/*]
Parent=Hatena
Browser=Hatena RSS
isSyndicationReader=true
[HatenaScreenshot*]
Parent=Hatena
Browser=HatenaScreenshot
[URI::Fetch/0.*]
Parent=Hatena
Browser=URI::Fetch
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Hurricane Electric
[Hurricane Electric]
Parent=DefaultProperties
Browser=Hurricane Electric
Stripper=true
isBanned=true
Crawler=true
[Gigabot*]
Parent=Hurricane Electric
[GigabotSiteSearch/*]
Parent=Hurricane Electric
Browser=GigabotSiteSearch
[Jetbot/*]
Parent=Hurricane Electric
[Mozilla/4.04 (compatible; Dulance bot;*)]
Parent=Hurricane Electric
Browser=Dulance
[Mozilla/5.0 (Twiceler-*]
Parent=Hurricane Electric
Browser=Twiceler
[OmniExplorer_Bot/*]
Parent=Hurricane Electric
Browser=OmniExplorer
[plinki/0.1*]
Parent=Hurricane Electric
Browser=plinki
[Twiceler*]
Parent=Hurricane Electric
Browser=Twiceler
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; iaskspider
[iaskspider]
Parent=DefaultProperties
Browser=iaskspider
Stripper=true
isBanned=true
Crawler=true
[iaskspider*]
Parent=iaskspider
Browser=iaskspider
Stripper=true
isBanned=true
[Mozilla/5.0 (compatible; iaskspider/*; MSIE 6.0)]
Parent=iaskspider
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Internet Archive
[Internet Archive]
@ -2727,816 +543,27 @@ Browser=InternetArchive
[Mozilla/5.0 (compatible; archive.org_bot/1.*)]
Parent=Internet Archive
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Marty Anstey
[Marty Anstey]
Parent=DefaultProperties
Browser=Marty Anstey
Stripper=true
isBanned=true
Crawler=true
[Helix/1.2 (?http://www.sitesearch.ca/helix/)]
Parent=Marty Anstey
[Mozilla/2.0 (compatible; DC9FE0029G; FreeBSD 5.4-RELEASE; i386; en_US)]
Parent=Marty Anstey
[Reaper/* (?http://www.sitesearch.ca/reaper)]
Parent=Marty Anstey
Browser=Reaper
[Vortex/2.2*]
Parent=Marty Anstey
Browser=Vortex
Stripper=true
isBanned=true
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Microsoft_Internet_Explorer
[Microsoft_Internet_Explorer]
Parent=DefaultProperties
Browser=Microsoft_Internet_Explorer
Stripper=true
isBanned=true
Crawler=true
[Microsoft_Internet_Explorer_5.00.*]
Parent=Microsoft_Internet_Explorer
Stripper=true
isBanned=true
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Nutch
[Nutch]
Parent=DefaultProperties
Browser=Nutch
Stripper=true
isBanned=true
Crawler=true
[*Nutch*]
Parent=Nutch
Stripper=true
isBanned=true
[CazoodleBot/*]
Parent=Nutch
Browser=CazoodleBot
[LOOQ/0.1*]
Parent=Nutch
Browser=LOOQ
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Webaroo
[Webaroo]
Parent=DefaultProperties
Browser=Webaroo
[PiyushBot (Piyush Web Miner;*)]
Parent=Webaroo
Browser=PiyushBot
[PsBot (PsBot;*)]
Parent=Webaroo
Browser=PsBot
[pulseBot (pulse Web Miner)]
Parent=Webaroo
Browser=pulseBot
[RufusBot (Rufus Web Miner;*)]
Parent=Webaroo
Browser=RufusBot
[SumeetBot (Sumeet Bot; *)]
Parent=Webaroo
Browser=SumeetBot
[WebarooBot (Webaroo Bot;*)]
Parent=Webaroo
Browser=WebarooBot
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; WebCollage
[WebCollage]
Parent=DefaultProperties
Browser=WebCollage
Stripper=true
isBanned=true
Crawler=true
[mywebcollage/*]
Parent=WebCollage
[webcollage*/*]
Parent=WebCollage
Browser=WebCollage
[BlueCoat ProxySG]
Parent=Blue Coat Systems
Browser=BlueCoat ProxySG
[CerberianDrtrs/*]
Parent=Blue Coat Systems
Browser=Cerberian
[Inne: Mozilla/4.0 (compatible; Cerberian Drtrs*)]
Parent=Blue Coat Systems
Browser=Cerberian
[Mozilla/4.0 (compatible; Cerberian Drtrs*)]
Parent=Blue Coat Systems
Browser=Cerberian
[Mozilla/4.0 (compatible; MSIE 6.0; Bluecoat DRTR)]
Parent=Blue Coat Systems
Browser=Bluecoat
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Copyright/Plagiarism
[Copyright/Plagiarism]
Parent=DefaultProperties
Browser=Copyright/Plagiarism
Stripper=true
isBanned=true
Crawler=true
[BDFetch]
Parent=Copyright/Plagiarism
Browser=BDFetch
[CopyRightCheck*]
Parent=Copyright/Plagiarism
Browser=CopyRightCheck
[FairAd Client*]
Parent=Copyright/Plagiarism
Browser=FairAd Client
[IPiumBot laurion(dot)com]
Parent=Copyright/Plagiarism
Browser=IPiumBot
[IWAgent/*]
Parent=Copyright/Plagiarism
Browser=Brand Protect
[oBot]
Parent=Copyright/Plagiarism
Browser=oBot
[SlySearch/*]
Parent=Copyright/Plagiarism
Browser=SlySearch
[TurnitinBot/*]
Parent=Copyright/Plagiarism
Browser=TurnitinBot
[TutorGigBot/*]
Parent=Copyright/Plagiarism
Browser=TutorGig
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; DNS Tools
[DNS Tools]
Parent=DefaultProperties
Browser=DNS Tools
Crawler=true
[Domain Dossier utility*]
Parent=DNS Tools
Browser=Domain Dossier
[Mozilla/5.0 (compatible; DNS-Digger/*)]
Parent=DNS Tools
Browser=DNS-Digger
[Mozilla/5.0 (compatible; DNS-Digger/*)]
Parent=DNS Tools
Browser=DNS-Digger
[OpenDNS Domain Crawler noc@opendns.com]
Parent=DNS Tools
Browser=OpenDNS Domain Crawler
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Download Managers
[Download Managers]
Parent=DefaultProperties
Browser=Download Managers
Frames=true
IFrames=true
Tables=true
Stripper=true
isBanned=true
Crawler=true
[AutoMate5]
Parent=Download Managers
Browser=AutoMate5
[Beamer*]
Parent=Download Managers
Browser=Beamer
[BitBeamer/*]
Parent=Download Managers
Browser=BitBeamer
[BitTorrent/*]
Parent=Download Managers
Browser=BitTorrent
[DA *]
Parent=Download Managers
Browser=Download Accelerator
[Download Demon*]
Parent=Download Managers
Browser=Download Demon
[Download Express*]
Parent=Download Managers
Browser=Download Express
[Download Master*]
Parent=Download Managers
Browser=Download Master
[Download Ninja*]
Parent=Download Managers
Browser=Download Ninja
[Download Wonder*]
Parent=Download Managers
Browser=Download Wonder
[DownloadSession*]
Parent=Download Managers
Browser=DownloadSession
[EasyDL/*]
Parent=Download Managers
Browser=EasyDL
[FDM 1.x]
Parent=Download Managers
Browser=Free Download Manager
[FlashGet]
Parent=Download Managers
Browser=FlashGet
[FreshDownload/*]
Parent=Download Managers
Browser=FreshDownload
[GetRight/*]
Parent=Download Managers
Browser=GetRight
[GetRightPro/*]
Parent=Download Managers
Browser=GetRightPro
[GetSmart/*]
Parent=Download Managers
Browser=GetSmart
[Go!Zilla*]
Parent=Download Managers
Browser=GoZilla
[Gozilla/*]
Parent=Download Managers
Browser=Gozilla
[Internet Ninja*]
Parent=Download Managers
Browser=Internet Ninja
[Kontiki Client*]
Parent=Download Managers
Browser=Kontiki Client
[lftp/3.2.1]
Parent=Download Managers
Browser=lftp
[LightningDownload/*]
Parent=Download Managers
Browser=LightningDownload
[LMQueueBot/*]
Parent=Download Managers
Browser=LMQueueBot
[MetaProducts Download Express/*]
Parent=Download Managers
Browser=Download Express
[Mozilla/4.0 (compatible; Getleft*)]
Parent=Download Managers
Browser=Getleft
[Myzilla]
Parent=Download Managers
Browser=Myzilla
[Net Vampire/*]
Parent=Download Managers
Browser=Net Vampire
[Net_Vampire*]
Parent=Download Managers
Browser=Net_Vampire
[NetAnts*]
Parent=Download Managers
Browser=NetAnts
[NetPumper*]
Parent=Download Managers
Browser=NetPumper
[NetSucker*]
Parent=Download Managers
Browser=NetSucker
[NetZip Downloader*]
Parent=Download Managers
Browser=NetZip Downloader
[NexTools WebAgent*]
Parent=Download Managers
Browser=NexTools WebAgent
[Offline Downloader*]
Parent=Download Managers
Browser=Offline Downloader
[P3P Client]
Parent=Download Managers
Browser=P3P Client
[PageDown*]
Parent=Download Managers
Browser=PageDown
[PicaLoader*]
Parent=Download Managers
Browser=PicaLoader
[Prozilla*]
Parent=Download Managers
Browser=Prozilla
[RealDownload/*]
Parent=Download Managers
Browser=RealDownload
[sEasyDL/*]
Parent=Download Managers
Browser=EasyDL
[shareaza*]
Parent=Download Managers
Browser=shareaza
[SmartDownload/*]
Parent=Download Managers
Browser=SmartDownload
[SpeedDownload/*]
Parent=Download Managers
Browser=Speed Download
[Star*Downloader/*]
Parent=Download Managers
Browser=StarDownloader
[STEROID Download]
Parent=Download Managers
Browser=STEROID Download
[SuperBot/*]
Parent=Download Managers
Browser=SuperBot
[Vegas95/*]
Parent=Download Managers
Browser=Vegas95
[WebZIP*]
Parent=Download Managers
Browser=WebZIP
[Wget*]
Parent=Download Managers
Browser=Wget
[WinTools]
Parent=Download Managers
Browser=WinTools
[Xaldon WebSpider*]
Parent=Download Managers
Browser=Xaldon WebSpider
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; E-Mail Harvesters
[E-Mail Harvesters]
Parent=DefaultProperties
Browser=E-Mail Harvesters
Frames=true
IFrames=true
Tables=true
Stripper=true
isBanned=true
Crawler=true
[*E-Mail Address Extractor*]
Parent=E-Mail Harvesters
Browser=E-Mail Address Extractor
[*Larbin*]
Parent=E-Mail Harvesters
Browser=Larbin
[*www4mail/*]
Parent=E-Mail Harvesters
Browser=www4mail
[8484 Boston Project*]
Parent=E-Mail Harvesters
Browser=8484 Boston Project
[CherryPicker*/*]
Parent=E-Mail Harvesters
Browser=CherryPickerElite
[Chilkat/*]
Parent=E-Mail Harvesters
Browser=Chilkat
[ContactBot/*]
Parent=E-Mail Harvesters
Browser=ContactBot
[eCatch*]
Parent=E-Mail Harvesters
Browser=eCatch
[EmailCollector*]
Parent=E-Mail Harvesters
Browser=E-Mail Collector
[EMAILsearcher]
Parent=E-Mail Harvesters
Browser=EMAILsearcher
[EmailSiphon*]
Parent=E-Mail Harvesters
Browser=E-Mail Siphon
[EmailWolf*]
Parent=E-Mail Harvesters
Browser=EMailWolf
[Epsilon SoftWorks' MailMunky]
Parent=E-Mail Harvesters
Browser=MailMunky
[EVE-minibrowser/*]
Parent=E-Mail Harvesters
Browser=EVE-minibrowser
[ExtractorPro*]
Parent=E-Mail Harvesters
Browser=ExtractorPro
[Franklin Locator*]
Parent=E-Mail Harvesters
Browser=Franklin Locator
[Missigua Locator*]
Parent=E-Mail Harvesters
Browser=Missigua Locator
[Mozilla/4.0 (compatible; Advanced Email Extractor*)]
Parent=E-Mail Harvesters
Browser=Advanced Email Extractor
[Netprospector*]
Parent=E-Mail Harvesters
Browser=Netprospector
[ProWebWalker*]
Parent=E-Mail Harvesters
Browser=ProWebWalker
[sna-0.0.*]
Parent=E-Mail Harvesters
Browser=Mike Elliott's E-Mail Harvester
[WebEnhancer*]
Parent=E-Mail Harvesters
Browser=WebEnhancer
[WebMiner*]
Parent=E-Mail Harvesters
Browser=WebMiner
[ZIBB Crawler (email address / WWW address)]
Parent=E-Mail Harvesters
Browser=ZIBB Crawler
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Feeds Blogs
[Feeds Blogs]
Parent=DefaultProperties
Browser=Feeds Blogs
isSyndicationReader=true
Crawler=true
[Bloglines Title Fetch/*]
Parent=Feeds Blogs
Browser=Bloglines Title Fetch
[Bloglines/* (http://www.bloglines.com*)]
Parent=Feeds Blogs
Browser=BlogLines Web
[BlogPulseLive (support@blogpulse.com)]
Parent=Feeds Blogs
Browser=BlogPulseLive
[blogsearchbot-pumpkin-2]
Parent=Feeds Blogs
Browser=blogsearchbot-pumpkin
isSyndicationReader=false
[Irish Blogs Aggregator/*1.0*]
Parent=Feeds Blogs
Browser=Irish Blogs Aggregator
Version=1.0
MajorVer=1
MinorVer=0
[kinjabot (http://www.kinja.com; *)]
Parent=Feeds Blogs
Browser=kinjabot
[Net::Trackback/*]
Parent=Feeds Blogs
Browser=Net::Trackback
[Reblog*]
Parent=Feeds Blogs
Browser=Reblog
[WordPress/*]
Parent=Feeds Blogs
Browser=WordPress
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Feeds Syndicators
[Feeds Syndicators]
Parent=DefaultProperties
Browser=Feeds Syndicators
isSyndicationReader=true
[*LinkLint*]
Parent=Feeds Syndicators
Browser=LinkLint
[*NetNewsWire/*]
Parent=Feeds Syndicators
[*NetVisualize*]
Parent=Feeds Syndicators
Browser=NetVisualize
[Akregator/*]
Parent=Feeds Syndicators
Browser=Akregator
[AppleSyndication/*]
Parent=Feeds Syndicators
Browser=Safari RSS
Platform=MacOSX
[Cocoal.icio.us/* (*)*]
Parent=Feeds Syndicators
Browser=Cocoal.icio.us
Stripper=true
isBanned=true
[Feed43 Proxy/* (*)]
Parent=Feeds Syndicators
Browser=Feed For Free
[FeedBurner/*]
Parent=Feeds Syndicators
Browser=FeedBurner
[FeedDemon/* (*)]
Parent=Feeds Syndicators
Browser=FeedDemon
Platform=Win32
[FeedDigest/* (*)]
Parent=Feeds Syndicators
Browser=FeedDigest
[Feedreader * (Powered by Newsbrain)]
Parent=Feeds Syndicators
Browser=Newsbrain
[Feedshow/* (*)]
Parent=Feeds Syndicators
Browser=Feedshow
[Feedster Crawler/?.0; Feedster, Inc.]
Parent=Feeds Syndicators
Browser=Feedster
[GreatNews/1.0]
Parent=Feeds Syndicators
Browser=GreatNews
Version=1.0
MajorVer=1
MinorVer=0
[Gregarius/*]
Parent=Feeds Syndicators
Browser=Gregarius
[intraVnews/*]
Parent=Feeds Syndicators
Browser=intraVnews
[JetBrains Omea Reader*]
Parent=Feeds Syndicators
Browser=Omea Reader
Stripper=true
isBanned=true
[MagpieRSS/* (*)]
Parent=Feeds Syndicators
Browser=MagpieRSS
[Mozilla/5.0 (*; Rojo *; http://www.rojo.com/corporate/help/agg; *)*]
Parent=Feeds Syndicators
Browser=Rojo
[Mozilla/5.0 (*aggregator:TailRank; http://tailrank.com/robot)*]
Parent=Feeds Syndicators
Browser=TailRank
[Mozilla/5.0 (compatible; MSIE 6.0; Podtech Network; crawler_admin@podtech.net)]
Parent=Feeds Syndicators
Browser=Podtech Network
[Mozilla/5.0 (compatible; newstin.com;*)]
Parent=Feeds Syndicators
Browser=NewsTin
[Mozilla/5.0 (compatible; Newz Crawler *; http://www.newzcrawler.com/?)]
Parent=Feeds Syndicators
Browser=Newz Crawler
[Mozilla/5.0 (RSS Reader Panel)]
Parent=Feeds Syndicators
Browser=RSS Reader Panel
[Mozilla/5.0 (X11; U; Linux*; *; rv:1.*; aggregator:FeedParser; *) Gecko/*]
Parent=Feeds Syndicators
Browser=FeedParser
[Mozilla/5.0 (X11; U; Linux*; *; rv:1.*; aggregator:NewsMonster; *) Gecko/*]
Parent=Feeds Syndicators
Browser=NewsMonster
[Mozilla/5.0 (X11; U; Linux*; *; rv:1.*; aggregator:Rojo; *) Gecko/*]
Parent=Feeds Syndicators
Browser=Rojo
[Mozilla/6.0 (MSIE 6.0; *RSSMicro.com RSS/Atom Feed Robot)]
Parent=Feeds Syndicators
Browser=RSS Micro
[Netvibes (*)]
Parent=Feeds Syndicators
Browser=Netvibes
[NewsAlloy/* (*)]
Parent=Feeds Syndicators
Browser=NewsAlloy
[Omnipelagos*]
Parent=Feeds Syndicators
Browser=Omnipelagos
[Particls]
Parent=Feeds Syndicators
Browser=Particls
[Protopage/* (*)]
Parent=Feeds Syndicators
Browser=Protopage
[PubSub-RSS-Reader/* (*)]
Parent=Feeds Syndicators
Browser=PubSub-RSS-Reader
[RSS Menu/*]
Parent=Feeds Syndicators
Browser=RSS Menu
[RssBandit/*]
Parent=Feeds Syndicators
Browser=RssBandit
[RssBar/1.2*]
Parent=Feeds Syndicators
Browser=RssBar
Version=1.2
MajorVer=1
MinorVer=2
[SharpReader/*]
Parent=Feeds Syndicators
Browser=SharpReader
[SimplePie/*]
Parent=Feeds Syndicators
Browser=SimplePie
[Strategic Board Bot (?http://www.strategicboard.com)]
Parent=Feeds Syndicators
Browser=Strategic Board Bot
Stripper=true
isBanned=true
[TargetYourNews.com bot]
Parent=Feeds Syndicators
Browser=TargetYourNews
[Technoratibot/*]
Parent=Feeds Syndicators
Browser=Technoratibot
[Windows-RSS-Platform/1.0*]
Parent=Feeds Syndicators
Browser=Windows-RSS-Platform
Version=1.0
MajorVer=1
MinorVer=0
Win32=true
[Wizz RSS News Reader]
Parent=Feeds Syndicators
Browser=Wizz
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; General RSS
[General RSS]
Parent=DefaultProperties
Browser=General RSS
[Mozilla/5.0 (compatible) GM RSS Panel]
Parent=General RSS
Browser=RSS Panel
[Mozilla/5.0 http://www.inclue.com; graeme@inclue.com]
Parent=General RSS
Browser=Inclue
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Validation Checkers
[HTML Validators]
Parent=DefaultProperties
Browser=HTML Validators
Frames=true
IFrames=true
Tables=true
Crawler=true
[(HTML Validator http://www.searchengineworld.com/validator/)]
Parent=HTML Validators
Browser=Search Engine World HTML Validator
[FeedValidator/1.3]
Parent=HTML Validators
Browser=FeedValidator
Version=1.3
MajorVer=1
MinorVer=3
[Jigsaw/* W3C_CSS_Validator_JFouffa/*]
Parent=HTML Validators
Browser=Jigsaw CSS Validator
@ -3553,81 +580,22 @@ Browser=W3C Validator
Parent=HTML Validators
Browser=W3C Line Mode
[Weblide/2.0 beta8*]
Parent=HTML Validators
Browser=Weblide
Version=2.0
MajorVer=2
MinorVer=0
Beta=true
[WebmasterWorld StickyMail Server Header Checker*]
Parent=HTML Validators
Browser=WebmasterWorld Server Header Checker
[WWWC/*]
Parent=HTML Validators
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Image Crawlers
[Image Crawlers]
Parent=DefaultProperties
Browser=Image Crawlers
Frames=true
IFrames=true
Tables=true
Stripper=true
isBanned=true
Crawler=true
[*PhotoStickies/*]
Parent=Image Crawlers
Browser=PhotoStickies
[Camcrawler*]
Parent=Image Crawlers
Browser=Camcrawler
[Der gro\xdfe BilderSauger*]
Parent=Image Crawlers
Browser=Gallery Grabber
[Extreme Picture Finder]
Parent=Image Crawlers
Browser=Extreme Picture Finder
[FLATARTS_FAVICO]
Parent=Image Crawlers
Browser=FlatArts Favorites Icon Tool
[HTML2JPG Blackbox, http://www.html2jpg.com]
Parent=Image Crawlers
Browser=HTML2JPG
[IconSurf/2.*]
Parent=Image Crawlers
Browser=IconSurf
[Mister PIX*]
Parent=Image Crawlers
Browser=Mister PIX
[Mozilla/5.0 (Macintosh; U; *Mac OS X; *) AppleWebKit/* (*) Pandora/2.*]
Parent=Image Crawlers
Browser=Pandora
[naoFavicon4IE*]
Parent=Image Crawlers
Browser=naoFavicon4IE
[pixfinder/*]
Parent=Image Crawlers
Browser=pixfinder
[rssImagesBot/0.1 (*http://herbert.groot.jebbink.nl/?app=rssImages)]
Parent=Image Crawlers
Browser=rssImagesBot
[Web Image Collector*]
Parent=Image Crawlers
Browser=Web Image Collector
@ -3636,262 +604,38 @@ Browser=Web Image Collector
Parent=Image Crawlers
Browser=Custo
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Link Checkers
[Link Checkers]
Parent=DefaultProperties
Browser=Link Checkers
Frames=true
IFrames=true
Tables=true
Crawler=true
[!Susie (http://www.sync2it.com/susie)]
Parent=Link Checkers
Browser=!Susie
[*AgentName/*]
Parent=Link Checkers
Browser=AgentName
[*Linkman*]
Parent=Link Checkers
Browser=Linkman
[*LinksManager.com*]
Parent=Link Checkers
Browser=LinksManager
[*Powermarks/*]
Parent=Link Checkers
Browser=Powermarks
[*W3C-checklink/*]
Parent=Link Checkers
Browser=W3C Link Checker
[*Web Link Validator*]
Parent=Link Checkers
Browser=Web Link Validator
[*Zeus*]
Parent=Link Checkers
Browser=Zeus
Stripper=true
isBanned=true
[ActiveBookmark *]
Parent=Link Checkers
Browser=ActiveBookmark
[Bookdog/*]
Parent=Link Checkers
Browser=Bookdog
[Bookmark Buddy*]
Parent=Link Checkers
Browser=Bookmark Buddy
[Bookmark Renewal Check Agent*]
Parent=Link Checkers
Browser=Bookmark Renewal Check Agent
[Bookmark search tool*]
Parent=Link Checkers
Browser=Bookmark search tool
[Bookmark-Manager]
Parent=Link Checkers
Browser=Bookmark-Manager
[Checkbot*]
Parent=Link Checkers
Browser=Checkbot
[CheckLinks/*]
Parent=Link Checkers
Browser=CheckLinks
[CyberSpyder Link Test/*]
Parent=Link Checkers
Browser=CyberSpyder Link Test
[DLC/*]
Parent=Link Checkers
Browser=DLC
[DocWeb Link Crawler (http://doc.php.net)]
Parent=Link Checkers
Browser=DocWeb Link Crawler
[FavOrg]
Parent=Link Checkers
Browser=FavOrg
[Favorites Sweeper v.3.*]
Parent=Link Checkers
Browser=Favorites Sweeper
[FindLinks/*]
Parent=Link Checkers
Browser=FindLinks
[Funnel Web Profiler*]
Parent=Link Checkers
Browser=Funnel Web Profiler
[Html Link Validator (www.lithopssoft.com)]
Parent=Link Checkers
Browser=HTML Link Validator
[IECheck]
Parent=Link Checkers
Browser=IECheck
[JCheckLinks/*]
Parent=Link Checkers
Browser=JCheckLinks
[JRTwine Software Check Favorites Utility]
Parent=Link Checkers
Browser=JRTwine
[Link Valet Online*]
Parent=Link Checkers
Browser=Link Valet
Stripper=true
isBanned=true
[LinkAlarm/*]
Parent=Link Checkers
Browser=LinkAlarm
[Linkbot*]
Parent=Link Checkers
Browser=Linkbot
[LinkChecker/*]
Parent=Link Checkers
Browser=LinkChecker
[LinkextractorPro*]
Parent=Link Checkers
Browser=LinkextractorPro
Stripper=true
isBanned=true
[LinkLint-checkonly/*]
Parent=Link Checkers
Browser=LinkLint
[LinkScan/*]
Parent=Link Checkers
Browser=LinkScan
[LinkSweeper/*]
Parent=Link Checkers
Browser=LinkSweeper
[LinkWalker*]
Parent=Link Checkers
Browser=LinkWalker
[MetaGer-LinkChecker]
Parent=Link Checkers
Browser=MetaGer-LinkChecker
[Mozilla/* (compatible; linktiger/*; *http://www.linktiger.com*)]
Parent=Link Checkers
Browser=LinkTiger
Stripper=true
isBanned=true
[Mozilla/4.0 (Compatible); URLBase*]
Parent=Link Checkers
Browser=URLBase
[Mozilla/4.0 (compatible; Link Utility; http://net-promoter.com)]
Parent=Link Checkers
Browser=NetPromoter Link Utility
[Mozilla/4.0 (compatible; MSIE 6.0; Windows 98) Web Link Validator*]
Parent=Link Checkers
Browser=Web Link Validator
Win32=true
[Mozilla/4.0 (compatible; MSIE 7.0; Win32) Link Commander 3.0]
Parent=Link Checkers
Browser=Link Commander
Version=3.0
MajorVer=3
MinorVer=0
Platform=Win32
[Mozilla/4.0 (compatible; SuperCleaner*;*)]
Parent=Link Checkers
Browser=SuperCleaner
[Mozilla/5.0 gURLChecker/*]
Parent=Link Checkers
Browser=gURLChecker
Stripper=true
isBanned=true
[Newsgroupreporter LinkCheck]
Parent=Link Checkers
Browser=Newsgroupreporter LinkCheck
[onCHECK Linkchecker von www.scientec.de fuer www.onsinn.de]
Parent=Link Checkers
Browser=onCHECK Linkchecker
[online link validator (http://www.dead-links.com/)]
Parent=Link Checkers
Browser=Dead-Links.com
Stripper=true
isBanned=true
[REL Link Checker*]
Parent=Link Checkers
Browser=REL Link Checker
[RLinkCheker*]
Parent=Link Checkers
Browser=RLinkCheker
[Robozilla/*]
Parent=Link Checkers
Browser=Robozilla
[RPT-HTTPClient/*]
Parent=Link Checkers
Browser=RPT-HTTPClient
Stripper=true
isBanned=true
[SafariBookmarkChecker*(?http://www.coriolis.ch/)]
Parent=Link Checkers
Browser=SafariBookmarkChecker
Platform=MacOSX
CSS=2
CssVersion=2
supportsCSS=true
[Simpy/* (Simpy; http://www.simpy.com/?ref=bot; feedback at simpy dot com)]
Parent=Link Checkers
Browser=Simpy
[SiteBar/*]
Parent=Link Checkers
Browser=SiteBar
[Susie (http://www.sync2it.com/bms/susie.php]
Parent=Link Checkers
Browser=Susie
[URLBase/6.*]
Parent=Link Checkers
[VSE/*]
Parent=Link Checkers
Browser=VSE Link Tester
@ -3900,768 +644,40 @@ Browser=VSE Link Tester
Parent=Link Checkers
Browser=WebTrends Link Analyzer
[WorQmada/*]
Parent=Link Checkers
Browser=WorQmada
[Xenu* Link Sleuth*]
Parent=Link Checkers
Browser=Xenu's Link Sleuth
Stripper=true
isBanned=true
[Z-Add Link Checker*]
Parent=Link Checkers
Browser=Z-Add Link Checker
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Microsoft
[Microsoft]
Parent=DefaultProperties
Browser=Microsoft
Stripper=true
isBanned=true
[Live (http://www.live.com/)]
Parent=Microsoft
Browser=Microsoft Live
Stripper=false
isBanned=false
isSyndicationReader=true
[MFC Foundation Class Library*]
Parent=Microsoft
Browser=MFC Foundation Class Library
[MFHttpScan]
Parent=Microsoft
Browser=MFHttpScan
[Microsoft BITS/*]
Parent=Microsoft
Browser=BITS
[Microsoft Data Access Internet Publishing Provider Cache Manager]
Parent=Microsoft
Browser=MS IPP
[Microsoft Data Access Internet Publishing Provider DAV*]
Parent=Microsoft
Browser=MS IPP DAV
[Microsoft Data Access Internet Publishing Provider Protocol Discovery]
Parent=Microsoft
Browser=MS IPPPD
[Microsoft Internet Explorer]
Parent=Microsoft
Browser=Fake IE
[Microsoft Office Existence Discovery]
Parent=Microsoft
Browser=Microsoft Office Existence Discovery
[Microsoft Office Protocol Discovery]
Parent=Microsoft
Browser=MS OPD
[Microsoft Office/* (*Picture Manager*)]
Parent=Microsoft
Browser=Microsoft Office Picture Manager
[Microsoft URL Control*]
Parent=Microsoft
Browser=Microsoft URL Control
[Microsoft Visio MSIE]
Parent=Microsoft
Browser=Microsoft Visio
[Microsoft-WebDAV-MiniRedir/*]
Parent=Microsoft
Browser=Microsoft-WebDAV
[MSN Feed Manager]
Parent=Microsoft
Browser=MSN Feed Manager
Stripper=false
isBanned=false
isSyndicationReader=true
[MSProxy/*]
Parent=Microsoft
Browser=MS Proxy
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Miscellaneous Browsers
[Miscellaneous Browsers]
Parent=DefaultProperties
Browser=Miscellaneous Browsers
Frames=true
Tables=true
Cookies=true
[*Amiga*]
Parent=Miscellaneous Browsers
Browser=Amiga
Platform=Amiga
[*avantbrowser*]
Parent=Miscellaneous Browsers
Browser=Avant Browser
[Ace Explorer]
Parent=Miscellaneous Browsers
Browser=Ace Explorer
[Enigma Browser*]
Parent=Miscellaneous Browsers
Browser=Enigma Browser
[Godzilla/* (Basic*; *; Commodore C=64; *; rv:1.*)*]
Parent=Miscellaneous Browsers
Browser=Godzilla
[GreenBrowser]
Parent=Miscellaneous Browsers
Browser=GreenBrowser
Frames=true
IFrames=true
Tables=true
Cookies=true
BackgroundSounds=true
VBScript=true
JavaApplets=true
JavaScript=true
ActiveXControls=true
CSS=2
CssVersion=2
supportsCSS=true
[Kopiczek/* (WyderOS*; *)]
Parent=Miscellaneous Browsers
Browser=Kopiczek
Platform=WyderOS
IFrames=true
JavaApplets=true
JavaScript=true
CSS=2
CssVersion=2
supportsCSS=true
[Mozilla/* (*) - BrowseX (*)]
Parent=Miscellaneous Browsers
Browser=BrowseX
[Mozilla/* (Win32;*Escape?*; ?)]
Parent=Miscellaneous Browsers
Browser=Escape
Platform=Win32
[Mozilla/4.0 (compatible; ibisBrowser)]
Parent=Miscellaneous Browsers
Browser=ibisBrowser
[Mozilla/5.0 (Macintosh; ?; PPC Mac OS X;*) AppleWebKit/* (*) HistoryHound/*]
Parent=Miscellaneous Browsers
Browser=HistoryHound
[NetRecorder*]
Parent=Miscellaneous Browsers
Browser=NetRecorder
[NetSurfer*]
Parent=Miscellaneous Browsers
Browser=NetSurfer
[ogeb browser , Version 1.1.0]
Parent=Miscellaneous Browsers
Browser=ogeb browser
Version=1.1
MajorVer=1
MinorVer=1
[SCEJ PSP BROWSER 0102pspNavigator]
Parent=Miscellaneous Browsers
Browser=Wipeout Pure
[Sleipnir*]
Parent=Miscellaneous Browsers
Browser=Sleipnir
[SlimBrowser]
Parent=Miscellaneous Browsers
Browser=SlimBrowser
[WWW_Browser/*]
Parent=Miscellaneous Browsers
Browser=WWW Browser
Version=1.69
MajorVer=1
MinorVer=69
Platform=Win16
CSS=3
CssVersion=3
supportsCSS=true
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Offline Browsers
[Offline Browsers]
Parent=DefaultProperties
Browser=Offline Browsers
Frames=true
Tables=true
Cookies=true
Stripper=true
isBanned=true
Crawler=true
[*Check&Get*]
Parent=Offline Browsers
Browser=Check&Get
[*HTTrack*]
Parent=Offline Browsers
Browser=HTTrack
[*MSIECrawler*]
Parent=Offline Browsers
Browser=IE Offline Browser
[*TweakMASTER*]
Parent=Offline Browsers
Browser=TweakMASTER
[BackStreet Browser *]
Parent=Offline Browsers
Browser=BackStreet Browser
[Go-Ahead-Got-It*]
Parent=Offline Browsers
Browser=Go Ahead Got-It
[iGetter/*]
Parent=Offline Browsers
Browser=iGetter
[Teleport*]
Parent=Offline Browsers
Browser=Teleport
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Online Scanners
[Online Scanners]
Parent=DefaultProperties
Browser=Online Scanners
Stripper=true
isBanned=true
[Morfeus Fucking Scanner]
Parent=Online Scanners
Browser=Morfeus Fucking Scanner
[Mozilla/4.0 (compatible; Trend Micro tmdr 1.*]
Parent=Online Scanners
Browser=Trend Micro
[Titanium 2005 (4.02.01)]
Parent=Online Scanners
Browser=Panda Antivirus Titanium
[virus_detector*]
Parent=Online Scanners
Browser=Secure Computing Corporation
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Proxy Servers
[Proxy Servers]
Parent=DefaultProperties
Browser=Proxy Servers
Stripper=true
isBanned=true
[*squid*]
Parent=Proxy Servers
Browser=Squid
[Anonymisiert*]
Parent=Proxy Servers
Browser=Anonymizied
[Anonymizer/*]
Parent=Proxy Servers
Browser=Anonymizer
[Anonymizied*]
Parent=Proxy Servers
Browser=Anonymizied
[Anonymous*]
Parent=Proxy Servers
Browser=Anonymous
[Anonymous/*]
Parent=Proxy Servers
Browser=Anonymous
[CE-Preload]
Parent=Proxy Servers
Browser=CE-Preload
[http://Anonymouse.org/*]
Parent=Proxy Servers
Browser=Anonymouse
[IE/6.01 (CP/M; 8-bit*)]
Parent=Proxy Servers
Browser=Squid
[Mozilla/* (TuringOS; Turing Machine; 0.0)]
Parent=Proxy Servers
Browser=Anonymizer
[Mozilla/4.0 (compatible; MSIE ?.0; SaferSurf*)]
Parent=Proxy Servers
Browser=SaferSurf
[Mozilla/5.0 (compatible; del.icio.us-thumbnails/*; *) KHTML/* (like Gecko)]
Parent=Proxy Servers
Browser=Yahoo!
Stripper=true
isBanned=true
Crawler=true
[Nutscrape]
Parent=Proxy Servers
Browser=Squid
[Nutscrape/* (CP/M; 8-bit*)]
Parent=Proxy Servers
Browser=Squid
[Privoxy/*]
Parent=Proxy Servers
Browser=Privoxy
[ProxyTester*]
Parent=Proxy Servers
Browser=ProxyTester
Stripper=true
isBanned=true
Crawler=true
[SilentSurf*]
Parent=Proxy Servers
Browser=SilentSurf
[Space*Bison/*]
Parent=Proxy Servers
Browser=Proxomitron
[Sqworm/*]
Parent=Proxy Servers
Browser=Websense
[SurfControl]
Parent=Proxy Servers
Browser=SurfControl
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Research Projects
[Research Projects]
Parent=DefaultProperties
Browser=Research Projects
Stripper=true
isBanned=true
Crawler=true
[*research*]
Parent=Research Projects
[AcadiaUniversityWebCensusClient]
Parent=Research Projects
Browser=AcadiaUniversityWebCensusClient
[Amico Alpha * (*) Gecko/* AmicoAlpha/*]
Parent=Research Projects
Browser=Amico Alpha
[annotate_google; http://ponderer.org/*]
Parent=Research Projects
Browser=Annotate Google
[CMS crawler (?http://buytaert.net/crawler/)]
Parent=Research Projects
[e-SocietyRobot(http://www.yama.info.waseda.ac.jp/~yamana/es/)]
Parent=Research Projects
Browser=e-SocietyRobot
[Forschungsportal/*]
Parent=Research Projects
Browser=Forschungsportal
[Gulper Web *]
Parent=Research Projects
Browser=Gulper Web Bot
[HooWWWer/*]
Parent=Research Projects
Browser=HooWWWer
[http://buytaert.net/crawler]
Parent=Research Projects
[inetbot/* (?http://www.inetbot.com/bot.html)]
Parent=Research Projects
Browser=inetbot
[IRLbot/*]
Parent=Research Projects
Browser=IRLbot
[Lachesis]
Parent=Research Projects
Browser=Lachesis
[Mozilla/5.0 (compatible; nextthing.org/*)]
Parent=Research Projects
Browser=nextthing.org
Version=1.0
MajorVer=1
MinorVer=0
[Mozilla/5.0 (compatible; Theophrastus/*)]
Parent=Research Projects
Browser=Theophrastus
[Mozilla/5.0 (compatible; Webscan v0.*; http://otc.dyndns.org/webscan/)]
Parent=Research Projects
Browser=Webscan
[MQbot*]
Parent=Research Projects
Browser=MQbot
[OutfoxBot/*]
Parent=Research Projects
Browser=OutfoxBot
[polybot?*]
Parent=Research Projects
Browser=Polybot
[Shim?Crawler*]
Parent=Research Projects
Browser=Shim Crawler
[Steeler/*]
Parent=Research Projects
Browser=Steeler
[Taiga web spider]
Parent=Research Projects
Browser=Taiga
[Theme Spider*]
Parent=Research Projects
Browser=Theme Spider
[UofTDB_experiment* (leehyun@cs.toronto.edu)]
Parent=Research Projects
Browser=UofTDB Experiment
[USyd-NLP-Spider*]
Parent=Research Projects
Browser=USyd-NLP-Spider
[woriobot*]
Parent=Research Projects
Browser=woriobot
[wwwster/* (Beta, mailto:gue@cis.uni-muenchen.de)]
Parent=Research Projects
Browser=wwwster
Beta=true
[Zao-Crawler]
Parent=Research Projects
Browser=Zao-Crawler
[Zao/*]
Parent=Research Projects
Browser=Zao
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Rippers
[Rippers]
Parent=DefaultProperties
Browser=Rippers
Frames=true
IFrames=true
Tables=true
Stripper=true
isBanned=true
Crawler=true
[*grub-client*]
Parent=Rippers
Browser=grub-client
[*ickHTTP*]
Parent=Rippers
Browser=IP*Works
[*java*]
Parent=Rippers
[*libwww-perl*]
Parent=Rippers
Browser=libwww-perl
[*WebGrabber*]
Parent=Rippers
[*WinHttpRequest*]
Parent=Rippers
Browser=WinHttp
[3D-FTP/*]
Parent=Rippers
Browser=3D-FTP
[3wGet/*]
Parent=Rippers
Browser=3wGet
[ActiveRefresh*]
Parent=Rippers
Browser=ActiveRefresh
[Artera (Version *)]
Parent=Rippers
Browser=Artera
[AutoHotkey]
Parent=Rippers
Browser=AutoHotkey
[b2w/*]
Parent=Rippers
Browser=b2w
[BasicHTTP/*]
Parent=Rippers
Browser=BasicHTTP
[BlockNote.Net]
Parent=Rippers
Browser=BlockNote.Net
[CAST]
Parent=Rippers
Browser=CAST
[CFNetwork/*]
Parent=Rippers
Browser=CFNetwork
[CFSCHEDULE*]
Parent=Rippers
Browser=ColdFusion Task Scheduler
[CobWeb/*]
Parent=Rippers
Browser=CobWeb
[ColdFusion*]
Parent=Rippers
Browser=ColdFusion
[Crawl_Application]
Parent=Rippers
Browser=Crawl_Application
[curl/*]
Parent=Rippers
Browser=cURL
[Custo*]
Parent=Rippers
Browser=Custo
[DataCha0s/*]
Parent=Rippers
Browser=DataCha0s
[DeepIndexer*]
Parent=Rippers
Browser=DeepIndexer
[DISCo Pump *]
Parent=Rippers
Browser=DISCo Pump
[eStyleSearch * (compatible; MSIE 6.0; Windows NT 5.0)]
Parent=Rippers
Browser=eStyleSearch
Win32=true
[ezic.com http agent *]
Parent=Rippers
Browser=Ezic.com
[fetch libfetch/*]
Parent=Rippers
[FGet*]
Parent=Rippers
Browser=FGet
[Flaming AttackBot*]
Parent=Rippers
Browser=Flaming AttackBot
[Foobot*]
Parent=Rippers
Browser=Foobot
[GameSpyHTTP/*]
Parent=Rippers
Browser=GameSpyHTTP
[gnome-vfs/*]
Parent=Rippers
Browser=gnome-vfs
[Harvest/*]
Parent=Rippers
Browser=Harvest
[hcat/*]
Parent=Rippers
Browser=hcat
[HLoader]
Parent=Rippers
Browser=HLoader
[Holmes/*]
Parent=Rippers
Browser=Holmes
[HTMLParser/*]
Parent=Rippers
Browser=HTMLParser
[http generic]
Parent=Rippers
Browser=http generic
[httpclient*]
Parent=Rippers
[httperf/*]
Parent=Rippers
Browser=httperf
[HttpSession]
Parent=Rippers
Browser=HttpSession
[httpunit/*]
Parent=Rippers
Browser=HttpUnit
[ICE_GetFile]
Parent=Rippers
Browser=ICE_GetFile
[iexplore.exe]
Parent=Rippers
[Inet - Eureka App]
Parent=Rippers
Browser=Inet - Eureka App
[INetURL/*]
Parent=Rippers
Browser=INetURL
[InetURL:/*]
Parent=Rippers
Browser=InetURL
[Internet Exploiter/*]
Parent=Rippers
[Internet Explore *]
Parent=Rippers
Browser=Fake IE
[Internet Explorer *]
Parent=Rippers
Browser=Fake IE
[IP*Works!*/*]
Parent=Rippers
Browser=IP*Works!
[IrssiUrlLog/*]
Parent=Rippers
Browser=IrssiUrlLog
[JPluck/*]
Parent=Rippers
Browser=JPluck
[Kapere (http://www.kapere.com)]
Parent=Rippers
Browser=Kapere
[LeechFTP]
Parent=Rippers
Browser=LeechFTP
[LeechGet*]
Parent=Rippers
Browser=LeechGet
[libcurl-agent/*]
Parent=Rippers
Browser=libcurl
[libWeb/clsHTTP*]
Parent=Rippers
Browser=libWeb/clsHTTP
[lwp*]
Parent=Rippers
[MFC_Tear_Sample]
Parent=Rippers
Browser=MFC_Tear_Sample
[Moozilla]
Parent=Rippers
Browser=Moozilla
[MovableType/*]
Parent=Rippers
Browser=MovableType Web Log
[Mozilla/2.0 (compatible; NEWT ActiveX; Win32)]
Parent=Rippers
Browser=NEWT ActiveX
Platform=Win32
[Mozilla/3.0 (compatible)]
Parent=Rippers
[Mozilla/3.0 (compatible; Indy Library)]
Parent=Rippers
Cookies=true
[Mozilla/3.01 (compatible;)]
Parent=Rippers
@ -4672,605 +688,28 @@ Browser=Novell BorderManager
[Mozilla/4.0 (compatible;)]
Parent=Rippers
[Mozilla/5.0 (compatible; IPCheck Server Monitor*)]
Parent=Rippers
Browser=IPCheck Server Monitor
[OCN-SOC/*]
Parent=Rippers
Browser=OCN-SOC
[Offline Explorer*]
Parent=Rippers
Browser=Offline Explorer
[Open Web Analytics Bot*]
Parent=Rippers
Browser=Open Web Analytics Bot
[OSSProxy*]
Parent=Rippers
Browser=OSSProxy
[Pageload*]
Parent=Rippers
Browser=PageLoad
[pavuk/*]
Parent=Rippers
Browser=Pavuk
[PEAR HTTP_Request*]
Parent=Rippers
Browser=PEAR-PHP
[PHP*]
Parent=Rippers
Browser=PHP
[PigBlock (Windows NT 5.1; U)*]
Parent=Rippers
Browser=PigBlock
Win32=true
[Pockey*]
Parent=Rippers
Browser=Pockey-GetHTML
[POE-Component-Client-HTTP/*]
Parent=Rippers
Browser=POE-Component-Client-HTTP
[PycURL/*]
Parent=Rippers
Browser=PycURL
[Python*]
Parent=Rippers
Browser=Python
[RepoMonkey*]
Parent=Rippers
Browser=RepoMonkey
[SBL-BOT*]
Parent=Rippers
Browser=BlackWidow
[ScoutAbout*]
Parent=Rippers
Browser=ScoutAbout
[sherlock/*]
Parent=Rippers
Browser=Sherlock
[SiteParser/*]
Parent=Rippers
Browser=SiteParser
[SiteSnagger*]
Parent=Rippers
Browser=SiteSnagger
[SiteSucker/*]
Parent=Rippers
Browser=SiteSucker
[SiteWinder*]
Parent=Rippers
Browser=SiteWinder
[Snoopy*]
Parent=Rippers
Browser=Snoopy
[SOFTWING_TEAR_AGENT*]
Parent=Rippers
Browser=AspTear
[SuperHTTP/*]
Parent=Rippers
Browser=SuperHTTP
[Tcl http client package*]
Parent=Rippers
Browser=Tcl http client package
[Twisted PageGetter]
Parent=Rippers
Browser=Twisted PageGetter
[URL2File/*]
Parent=Rippers
Browser=URL2File
[UtilMind HTTPGet]
Parent=Rippers
Browser=UtilMind HTTPGet
[VCI WebViewer*]
Parent=Rippers
Browser=VCI WebViewer
[W3CRobot/*]
Parent=Rippers
Browser=W3CRobot
[Web Downloader*]
Parent=Rippers
Browser=Web Downloader
[Web Downloader/*]
Parent=Rippers
Browser=Web Downloader
[Web Magnet*]
Parent=Rippers
Browser=Web Magnet
[WebAuto/*]
Parent=Rippers
[webbandit/*]
Parent=Rippers
Browser=webbandit
[WebCopier*]
Parent=Rippers
Browser=WebCopier
[WebDownloader*]
Parent=Rippers
Browser=WebDownloader
[WebFetch]
Parent=Rippers
Browser=WebFetch
[webfetch/*]
Parent=Rippers
Browser=WebFetch
[WebGatherer*]
Parent=Rippers
Browser=WebGatherer
[WebGet]
Parent=Rippers
Browser=WebGet
[WebReaper*]
Parent=Rippers
Browser=WebReaper
[WebRipper]
Parent=Rippers
Browser=WebRipper
[WebSauger*]
Parent=Rippers
Browser=WebSauger
[Website Downloader*]
Parent=Rippers
Browser=Website Downloader
[Website eXtractor*]
Parent=Rippers
Browser=Website eXtractor
[Website Quester]
Parent=Rippers
Browser=Website Quester
[WebsiteExtractor*]
Parent=Rippers
Browser=Website eXtractor
[WebSnatcher*]
Parent=Rippers
Browser=WebSnatcher
[Webster Pro*]
Parent=Rippers
Browser=Webster Pro
[WebStripper*]
Parent=Rippers
Browser=WebStripper
[WebWhacker*]
Parent=Rippers
Browser=WebWhacker
[WinScripter iNet Tools]
Parent=Rippers
Browser=WinScripter iNet Tools
[WWW-Mechanize/*]
Parent=Rippers
Browser=WWW-Mechanize
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Site Monitors
[Site Monitors]
Parent=DefaultProperties
Browser=Site Monitors
Cookies=true
Stripper=true
isBanned=true
Crawler=true
[*EasyRider*]
Parent=Site Monitors
Browser=EasyRider
[*maxamine.com--robot*]
Parent=Site Monitors
Browser=maxamine.com--robot
Stripper=true
isBanned=true
[*Netcraft Web Server Survey*]
Parent=Site Monitors
Browser=Netcraft
Stripper=true
isBanned=true
[*Netcraft Webserver Survey*]
Parent=Site Monitors
Browser=Netcraft Webserver Survey
Stripper=true
isBanned=true
[*WebMon ?.*]
Parent=Site Monitors
Browser=WebMon
[Kenjin Spider*]
Parent=Site Monitors
Browser=Kenjin Spider
[Kevin http://*]
Parent=Site Monitors
Browser=Kevin
Stripper=true
isBanned=true
[Mozilla/4.0 (compatible; ChangeDetection/*]
Parent=Site Monitors
Browser=ChangeDetection
[Myst Monitor Service v*]
Parent=Site Monitors
Browser=Myst Monitor Service
[Net Probe]
Parent=Site Monitors
Browser=Net Probe
[NetMechanic*]
Parent=Site Monitors
Browser=NetMechanic
[NetReality*]
Parent=Site Monitors
Browser=NetReality
[Pingdom GIGRIB*]
Parent=Site Monitors
Browser=Pingdom
[Site Valet Online*]
Parent=Site Monitors
Browser=Site Valet
Stripper=true
isBanned=true
[SITECHECKER]
Parent=Site Monitors
Browser=SITECHECKER
[sitemonitor@dnsvr.com/*]
Parent=Site Monitors
Browser=ZoneEdit Failover Monitor
Stripper=false
isBanned=false
[UpTime Checker*]
Parent=Site Monitors
Browser=UpTime Checker
[URL Control*]
Parent=Site Monitors
Browser=URL Control
[URL_Access/*]
Parent=Site Monitors
[URLCHECK]
Parent=Site Monitors
Browser=URLCHECK
[URLy Warning*]
Parent=Site Monitors
Browser=URLy Warning
[Webcheck *]
Parent=Site Monitors
Browser=Webcheck
Version=1.0
MajorVer=1
MinorVer=0
[WebPatrol/*]
Parent=Site Monitors
Browser=WebPatrol
[websitepulse checker/*]
Parent=Site Monitors
Browser=websitepulse checker
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Social Bookmarkers
[Social Bookmarkers]
Parent=DefaultProperties
Browser=Social Bookmarkers
Frames=true
Tables=true
Cookies=true
JavaScript=true
[Cocoal.icio.us/1.0 (v43) (Mac OS X; http://www.scifihifi.com/cocoalicious)]
Parent=Social Bookmarkers
Browser=Cocoalicious
[WinkBot/*]
Parent=Social Bookmarkers
Browser=WinkBot
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Translators
[Translators]
Parent=DefaultProperties
Browser=Translators
Frames=true
Tables=true
Cookies=true
[Seram Server]
Parent=Translators
Browser=Seram Server
[TeragramWebcrawler/*]
Parent=Translators
Browser=TeragramWebcrawler
Version=1.0
MajorVer=1
MinorVer=0
[WebIndexer/* (Web Indexer; *)]
Parent=Translators
Browser=WorldLingo
[WebTrans]
Parent=Translators
Browser=WebTrans
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Version Checkers
[Version Checkers]
Parent=DefaultProperties
Browser=Version Checkers
Crawler=true
[Automated Browscap.ini Updater. To report issues contact us at http://www.skycomp.ca]
Parent=Version Checkers
Browser=Automated Browscap.ini Updater
[BMC Link Validator (http://www.briansmodelcars.com/links/)]
Parent=Version Checkers
Browser=BMC Link Validator
MajorVer=1
MinorVer=0
Platform=Win2000
[Browscap updater]
Parent=Version Checkers
Browser=Browscap updater
[BrowscapUpdater1.0]
Parent=Version Checkers
[Browser Capabilities Project (http://browsers.garykeith.com; http://browsers.garykeith.com/sitemail/contact-me.asp)]
Parent=Version Checkers
Browser=Gary Keith's Version Checker
[Browser Capabilities Project AutoDownloader; created by Tom Kelleher Consulting, Inc. (tkelleher.com); used with special permission from Gary Joel Keith; uses Microsoft's WinHTTP component]
Parent=Version Checkers
Browser=TKC AutoDownloader
[browsers.garykeith.com browscap.ini bot BETA]
Parent=Version Checkers
[Code Sample Web Client]
Parent=Version Checkers
Browser=Code Sample Web Client
[Mono Browser Capabilities Updater*]
Parent=Version Checkers
Browser=Mono Browser Capabilities Updater
Stripper=true
isBanned=true
[Subtext Version 1.9* - http://subtextproject.com/ (Microsoft Windows NT 5.2.*)]
Parent=Version Checkers
Browser=Subtext
[TherapeuticResearch]
Parent=Version Checkers
Browser=TherapeuticResearch
[UpdateBrowscap*]
Parent=Version Checkers
Browser=UpdateBrowscap
[www.garykeith.com browscap.ini bot*]
Parent=Version Checkers
Browser=clarkson.edu
[www.substancia.com AutoHTTPAgent (ver *)]
Parent=Version Checkers
Browser=Substância
[psbot/*]
Parent=Webaroo
Browser=PSBot
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Become
[Become]
Parent=DefaultProperties
Browser=Become
Frames=true
Tables=true
isSyndicationReader=true
Crawler=true
[*BecomeBot/*]
Parent=Become
Browser=BecomeBot
[*BecomeBot@exava.com*]
Parent=Become
Browser=BecomeBot
[*Exabot@exava.com*]
Parent=Become
Browser=Exabot
[MonkeyCrawl/*]
Parent=Become
Browser=MonkeyCrawl
[Mozilla/5.0 (compatible; BecomeJPBot/2.3; *)]
Parent=Become
Browser=BecomeJPBot
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Blue Coat Systems
[Blue Coat Systems]
Parent=DefaultProperties
Browser=Blue Coat Systems
Stripper=true
isBanned=true
Crawler=true
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; NameProtect
[NameProtect]
Parent=DefaultProperties
Browser=NameProtect
Stripper=true
isBanned=true
Crawler=true
[abot/*]
Parent=NameProtect
Browser=NameProtect
[NP/*]
Parent=NameProtect
Browser=NameProtect
[NPBot*]
Parent=NameProtect
Browser=NameProtect
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; NewsGator
[NewsGator]
Parent=DefaultProperties
Browser=NewsGator
isSyndicationReader=true
[MarsEdit*]
Parent=NewsGator
Browser=MarsEdit
[NetNewsWire*/*]
Parent=NewsGator
Browser=NetNewsWire
Platform=MacOSX
[NewsFire/*]
Parent=NewsGator
Browser=NewsFire
[NewsGator FetchLinks extension/*]
Parent=NewsGator
Browser=NewsGator FetchLinks
[NewsGator/*]
Parent=NewsGator
Browser=NewsGator
Stripper=true
isBanned=true
[NewsGatorOnline/*]
Parent=NewsGator
Browser=NewsGatorOnline
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; The Planet's Vulnerability Scanning
[The Planet]
Parent=DefaultProperties
Browser=The Planet's Vulnerability Scanning
[*; system(id);*]
Parent=The Planet
[Fastream NETFile Server]
Parent=The Planet
[mercuryboard_user_agent_sql_injection.nasl*]
Parent=The Planet
[Mozilla/4.0 (compatible; gallery_203.nasl; Googlebot)]
Parent=The Planet
[Mozilla/4.75 * (X11, U]
Parent=The Planet
[Mozilla/7 * (X11; U; Linux 2.6.1 ia64)]
Parent=The Planet
[NESSUS::SOAP]
Parent=The Planet
Browser=NESSUS::SOAP
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Jakarta Project
[Jakarta Project]
Parent=DefaultProperties
Browser=Jakarta Project
Platform=JAVA
Stripper=true
isBanned=true
Crawler=true
[Jakarta Commons-HttpClient/*]
Parent=Jakarta Project
Browser=Jakarta Commons-HttpClient
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Media Players
[Media Players]
Parent=DefaultProperties
Browser=Media Players
Cookies=true
[iTunes/* (Windows; ?)]
Parent=Media Players
Browser=iTunes
@ -5322,13 +761,6 @@ isBanned=true
Parent=Media Players
Browser=WinAmp
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; QuickTime
[QuickTime]
Parent=DefaultProperties
Browser=QuickTime
Cookies=true
[QuickTime (qtver=6.0*;cpu=PPC;os=Mac 10.*)]
Parent=QuickTime
Version=6.0
@ -6152,106 +1584,6 @@ MinorVer=1
Platform=Win2003
Win32=true
[QuickTime/7.0.* (qtver=7.0.*;*;os=Mac 10.*)*]
Parent=QuickTime
Version=7.0
MajorVer=7
MinorVer=0
Platform=MacOSX
[QuickTime/7.1.* (qtver=7.1.*;*;os=Mac 10.*)*]
Parent=QuickTime
Version=7.1
MajorVer=7
MinorVer=1
Platform=MacOSX
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Windows Media Player
[Windows Media Player]
Parent=DefaultProperties
Browser=Windows Media Player
Cookies=true
[NSPlayer/10.*]
Parent=Windows Media Player
Version=10.0
MajorVer=10
MinorVer=0
[NSPlayer/11.* WMFSDK/11.*]
Parent=Windows Media Player
Browser=Windows Media Player
Version=11.0
MajorVer=11
MinorVer=0
[NSPlayer/4.*]
Parent=Windows Media Player
Browser=Windows Media Player
Version=4.0
MajorVer=4
MinorVer=0
[NSPlayer/7.*]
Parent=Windows Media Player
Browser=Windows Media Player
Version=7.0
MajorVer=7
MinorVer=0
[NSPlayer/8.*]
Parent=Windows Media Player
Browser=Windows Media Player
Version=8.0
MajorVer=8
MinorVer=0
[NSPlayer/9.*]
Parent=Windows Media Player
Browser=Windows Media Player
Version=9.0
MajorVer=9
MinorVer=0
[Windows-Media-Player/10.*]
Parent=Windows Media Player
Browser=Windows-Media-Player
Version=10.0
MajorVer=10
MinorVer=0
Win32=true
[Windows-Media-Player/11.*]
Parent=Windows Media Player
Version=11.0
MajorVer=11
MinorVer=0
Win32=true
[Windows-Media-Player/7.*]
Parent=Windows Media Player
Browser=Windows Media Player
Version=7.0
MajorVer=7
MinorVer=0
Win32=true
[Windows-Media-Player/8.*]
Parent=Windows Media Player
Browser=Windows Media Player
Version=8.0
MajorVer=8
MinorVer=0
Win32=true
[Windows-Media-Player/9.*]
Parent=Windows Media Player
Version=9.0
MajorVer=9
MinorVer=0
Win32=true
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; AvantGo
[AvantGo]
@ -6264,109 +1596,9 @@ JavaScript=true
WAP=true
isMobileDevice=true
[AvantGo*]
[*AvantGo*]
Parent=AvantGo
[Mozilla/?.0 (*; U; AvantGo 3.?)]
Parent=AvantGo
Version=3.0
MajorVer=3
MinorVer=0
[Mozilla/?.0 (*; U; AvantGo 4.?)]
Parent=AvantGo
Version=4.0
MajorVer=4
MinorVer=0
[Mozilla/?.0 (*; U; AvantGo 5.?)]
Parent=AvantGo
Version=5.0
MajorVer=5
MinorVer=0
[Mozilla/?.0 (*; U; AvantGo 6.?)]
Parent=AvantGo
Version=6.0
MajorVer=6
MinorVer=0
[Mozilla/?.0 (compatible; AvantGo 3.?)]
Parent=AvantGo
Version=3.0
MajorVer=3
MinorVer=0
[Mozilla/?.0 (compatible; AvantGo 3.?; *)]
Parent=AvantGo
Version=3.0
MajorVer=3
MinorVer=0
[Mozilla/?.0 (compatible; AvantGo 3.?; FreeBSD)]
Parent=AvantGo
Version=3.0
MajorVer=3
MinorVer=0
Platform=FreeBSD
[Mozilla/?.0 (compatible; AvantGo 4.?)]
Parent=AvantGo
Version=4.0
MajorVer=4
MinorVer=0
[Mozilla/?.0 (compatible; AvantGo 4.?; *)]
Parent=AvantGo
Version=4.0
MajorVer=4
MinorVer=0
[Mozilla/?.0 (compatible; AvantGo 4.?; FreeBSD)]
Parent=AvantGo
Version=4.0
MajorVer=4
MinorVer=0
Platform=FreeBSD
[Mozilla/?.0 (compatible; AvantGo 5.?)]
Parent=AvantGo
Version=5.0
MajorVer=5
MinorVer=0
[Mozilla/?.0 (compatible; AvantGo 5.?; *)]
Parent=AvantGo
Version=5.0
MajorVer=5
MinorVer=0
[Mozilla/?.0 (compatible; AvantGo 5.?; FreeBSD)]
Parent=AvantGo
Version=5.0
MajorVer=5
MinorVer=0
Platform=FreeBSD
[Mozilla/?.0 (compatible; AvantGo 6.?)]
Parent=AvantGo
Version=6.0
MajorVer=6
MinorVer=0
[Mozilla/?.0 (compatible; AvantGo 6.?; *)]
Parent=AvantGo
Version=6.0
MajorVer=6
MinorVer=0
[Mozilla/?.0 (compatible; AvantGo 6.?; FreeBSD)]
Parent=AvantGo
Version=6.0
MajorVer=6
MinorVer=0
Platform=FreeBSD
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; BlackBerry
[BlackBerry]
@ -6379,186 +1611,11 @@ JavaScript=true
WAP=true
isMobileDevice=true
[BlackBerry7*/3.5.*]
[*BlackBerry*]
Parent=BlackBerry
Version=3.5
MajorVer=3
MinorVer=5
[BlackBerry7*/3.6.*]
[*BlackBerrySimulator/*]
Parent=BlackBerry
Version=3.6
MajorVer=3
MinorVer=6
[BlackBerry7*/3.7.*]
Parent=BlackBerry
Version=3.7
MajorVer=3
MinorVer=7
[BlackBerry7*/3.8.*]
Parent=BlackBerry
Version=3.8
MajorVer=3
MinorVer=8
[BlackBerry7*/3.9.*]
Parent=BlackBerry
Version=3.9
MajorVer=3
MinorVer=9
[BlackBerry7*/4.0.*]
Parent=BlackBerry
Version=4.0
MajorVer=4
MinorVer=0
[BlackBerry7*/4.1.*]
Parent=BlackBerry
Version=4.1
MajorVer=4
MinorVer=1
[BlackBerry8*/3.5.*]
Parent=BlackBerry
Version=3.5
MajorVer=3
MinorVer=5
[BlackBerry8*/3.6.*]
Parent=BlackBerry
Version=3.6
MajorVer=3
MinorVer=6
[BlackBerry8*/3.7.*]
Parent=BlackBerry
Version=3.7
MajorVer=3
MinorVer=7
[BlackBerry8*/3.8.*]
Parent=BlackBerry
Version=3.8
MajorVer=3
MinorVer=8
[BlackBerry8*/3.9.*]
Parent=BlackBerry
Version=3.9
MajorVer=3
MinorVer=9
[BlackBerry8*/4.0.*]
Parent=BlackBerry
Version=4.0
MajorVer=4
MinorVer=0
[BlackBerry8*/4.1.*]
Parent=BlackBerry
Version=4.1
MajorVer=4
MinorVer=1
[BlackBerry8*/4.2.*]
Parent=BlackBerry
Version=4.2
MajorVer=4
MinorVer=2
[BlackBerrySimulator/3.5.*]
Parent=BlackBerry
Version=3.5
MajorVer=3
MinorVer=5
[BlackBerrySimulator/3.6.*]
Parent=BlackBerry
Version=3.6
MajorVer=3
MinorVer=6
[BlackBerrySimulator/3.7.*]
Parent=BlackBerry
Version=3.7
MajorVer=3
MinorVer=7
[BlackBerrySimulator/3.8.*]
Parent=BlackBerry
Version=3.8
MajorVer=3
MinorVer=8
[BlackBerrySimulator/3.9.*]
Parent=BlackBerry
Version=3.9
MajorVer=3
MinorVer=9
[BlackBerrySimulator/4.0.*]
Parent=BlackBerry
Version=4.0
MajorVer=4
MinorVer=0
[BlackBerrySimulator/4.1.*]
Parent=BlackBerry
Version=4.1
MajorVer=4
MinorVer=1
[Mozilla/?.0 (compatible; MSIE ?.*; Windows*) BlackBerry7*/3.5.*]
Parent=BlackBerry
Version=3.5
MajorVer=3
MinorVer=5
Win32=true
[Mozilla/?.0 (compatible; MSIE ?.*; Windows*) BlackBerry7*/3.6.*]
Parent=BlackBerry
Version=3.6
MajorVer=3
MinorVer=6
Win32=true
[Mozilla/?.0 (compatible; MSIE ?.*; Windows*) BlackBerry7*/3.7.*]
Parent=BlackBerry
Version=3.7
MajorVer=3
MinorVer=7
Win32=true
[Mozilla/?.0 (compatible; MSIE ?.*; Windows*) BlackBerry7*/3.8.*]
Parent=BlackBerry
Version=3.8
MajorVer=3
MinorVer=8
Win32=true
[Mozilla/?.0 (compatible; MSIE ?.*; Windows*) BlackBerry7*/3.9.*]
Parent=BlackBerry
Version=3.9
MajorVer=3
MinorVer=9
Win32=true
[Mozilla/?.0 (compatible; MSIE ?.*; Windows*) BlackBerry7*/4.0.*]
Parent=BlackBerry
Version=4.0
MajorVer=4
MinorVer=0
Win32=true
[Mozilla/?.0 (compatible; MSIE ?.*; Windows*) BlackBerry7*/4.1.*]
Parent=BlackBerry
Version=4.1
MajorVer=4
MinorVer=1
Win32=true
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Handspring Blazer
@ -6572,65 +1629,8 @@ Cookies=true
WAP=true
isMobileDevice=true
[Mozilla/4.0 (compatible; MSIE 6.0; Windows 9?; PalmSource/*; Blazer/3.*) ??;???x???]
[*Blazer*]
Parent=Blazer
Version=3.0
MajorVer=3
MinorVer=0
Win32=true
[Mozilla/4.0 (compatible; MSIE 6.0; Windows 9?; PalmSource/*; Blazer/4.*) ??;???x???]
Parent=Blazer
Version=4.0
MajorVer=4
MinorVer=0
Win32=true
[Mozilla/4.0 (compatible; MSIE 6.0; Windows 9?; PalmSource/*; Blazer/5.*) ??;???x???]
Parent=Blazer
Version=5.0
MajorVer=5
MinorVer=0
Win32=true
[Mozilla/4.0 (compatible; MSIE 6.0; Windows 9?; PalmSource; Blazer 3.*) ??;???x???]
Parent=Blazer
Version=3.0
MajorVer=3
MinorVer=0
Win32=true
[Mozilla/4.0 (compatible; MSIE 6.0; Windows 9?; PalmSource; Blazer 4.*) ??;???x???]
Parent=Blazer
Version=4.0
MajorVer=4
MinorVer=0
Win32=true
[Mozilla/4.0 (compatible; MSIE 6.0; Windows 9?; PalmSource; Blazer 5.*) ??;???x???]
Parent=Blazer
Version=5.0
MajorVer=5
MinorVer=0
Win32=true
[UPG1 UP/?.0 (*compatible; Blazer 3.*)]
Parent=Blazer
Version=3.0
MajorVer=3
MinorVer=0
[UPG1 UP/?.0 (*compatible; Blazer 4.*)]
Parent=Blazer
Version=4.0
MajorVer=4
MinorVer=0
[UPG1 UP/?.0 (*compatible; Blazer 5.*)]
Parent=Blazer
Version=5.0
MajorVer=5
MinorVer=0
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Danger
@ -6648,17 +1648,8 @@ CSS=1
CssVersion=1
supportsCSS=true
[Mozilla/5.0 (*Danger hiptop 1.0*)]
[Mozilla/* (*Danger hiptop *.*)]
Parent=Danger
Version=1.0
MajorVer=1
MinorVer=0
[Mozilla/5.0 (*Danger hiptop 2.0*)]
Parent=Danger
Version=2.0
MajorVer=2
MinorVer=0
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; DoCoMo
@ -6672,25 +1663,9 @@ JavaScript=true
WAP=true
isMobileDevice=true
[DoCoMo/1.0*]
[DoCoMo/*]
Parent=DoCoMo
Version=1.0
MajorVer=1
MinorVer=0
Platform=WAP
CSS=1
CssVersion=1
supportsCSS=true
[DoCoMo/2.0*]
Parent=DoCoMo
Version=2.0
MajorVer=2
MinorVer=0
Platform=WAP
CSS=1
CssVersion=1
supportsCSS=true
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Doris
@ -6726,11 +1701,9 @@ CSS=2
CssVersion=2
supportsCSS=true
[Mozilla/5.0 (iPhone; ?; *Mac OS X*) AppleWebKit/* (*) Version/3.0* Mobile/* Safari/*]
[Mozilla/* (iPhone; ?; *Mac OS X*) AppleWebKit/* (*) Version/*.* Mobile/* Safari/*]
Parent=iPhone
Version=3.0
MajorVer=3
MinorVer=0
Platform=MacOSX
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; jig
@ -6744,14 +1717,10 @@ JavaScript=true
WAP=true
isMobileDevice=true
[Mozilla/4.0 (jig browser web; *)]
[Mozilla/* (jig browser*; *)]
Parent=jig
Browser=jig browser web
[Mozilla/4.0 (jig browser; *)]
Parent=jig
Browser=jig browser
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; KDDI
[KDDI]
@ -6770,25 +1739,7 @@ CSS=1
CssVersion=1
supportsCSS=true
[KDDI-CA?? UP.Browser/* (GUI) MMP/*]
Parent=KDDI
[KDDI-Googlebot-Mobile]
Parent=KDDI
[KDDI-HI?? UP.Browser/* (GUI) MMP/*]
Parent=KDDI
[KDDI-KC?? UP.Browser/* (GUI) MMP/*]
Parent=KDDI
[KDDI-PT?? UP.Browser/* (GUI) MMP/*]
Parent=KDDI
[KDDI-SA?? UP.Browser/* (GUI) MMP/*]
Parent=KDDI
[KDDI-SN?? UP.Browser/* (GUI) MMP/*]
[KDDI-* UP.Browser/* (GUI) MMP/*]
Parent=KDDI
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Motorola Internet Browser
@ -6802,131 +1753,17 @@ Cookies=true
WAP=true
isMobileDevice=true
[MOT-1*/* UP.Browser/*]
Parent=Motorola Internet Browser
[MOT-8700_/* UP.Browser/*]
Parent=Motorola Internet Browser
[MOT-A-0A/* UP.Browser/*]
Parent=Motorola Internet Browser
[MOT-A-2B/* UP.Browser/*]
Parent=Motorola Internet Browser
[MOT-A-88/* UP.Browser/*]
Parent=Motorola Internet Browser
[MOT-C???/* MIB/*]
Parent=Motorola Internet Browser
[MOT-GATW_/* UP.Browser/*]
Parent=Motorola Internet Browser
[MOT-L6/* MIB/*]
Parent=Motorola Internet Browser
[MOT-L7/* MIB/*]
Parent=Motorola Internet Browser
[MOT-M*/* UP.Browser/*]
Parent=Motorola Internet Browser
[MOT-MP*/* Mozilla/4.0 (compatible; MSIE *; Windows CE; *)]
Parent=Motorola Internet Browser
Win32=true
[MOT-SAP4_/* UP.Browser/*]
Parent=Motorola Internet Browser
[MOT-T7*/* MIB/*]
Parent=Motorola Internet Browser
[MOT-T721*]
Parent=Motorola Internet Browser
[MOT-TA02/* MIB/*]
Parent=Motorola Internet Browser
[MOT-V*/* MIB/*]
Parent=Motorola Internet Browser
[MOT-V*/* UP.Browser/*]
Parent=Motorola Internet Browser
[MOT-V3/* MIB/*]
Parent=Motorola Internet Browser
[MOT-V4*/* MIB/*]
Parent=Motorola Internet Browser
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Motorola Internet Browser
[Motorola Web Browser]
Parent=DefaultProperties
Browser=Motorola Internet Browser
Frames=true
Tables=true
Cookies=true
WAP=true
isMobileDevice=true
[MOT-1*/* UP.Browser/*]
[MOT-*/*]
Parent=Motorola Web Browser
[MOT-8700_/* UP.Browser/*]
Parent=Motorola Web Browser
[MOT-A-0A/* UP.Browser/*]
Parent=Motorola Web Browser
[MOT-A-2B/* UP.Browser/*]
Parent=Motorola Web Browser
[MOT-A-88/* UP.Browser/*]
Parent=Motorola Web Browser
[MOT-C???/* MIB/*]
Parent=Motorola Web Browser
[MOT-GATW_/* UP.Browser/*]
Parent=Motorola Web Browser
[MOT-L6/* MIB/*]
Parent=Motorola Web Browser
[MOT-L7/* MIB/*]
Parent=Motorola Web Browser
[MOT-M*/* UP.Browser/*]
Parent=Motorola Web Browser
[MOT-MP*/* Mozilla/4.0 (compatible; MSIE *; Windows CE; *)]
[MOT-MP*/* Mozilla/* (compatible; MSIE *; Windows CE; *)]
Parent=Motorola Web Browser
Win32=true
[MOT-SAP4_/* UP.Browser/*]
[MOT-T*/*]
Parent=Motorola Web Browser
[MOT-T7*/* MIB/*]
Parent=Motorola Web Browser
[MOT-T721*]
Parent=Motorola Web Browser
[MOT-TA02/* MIB/*]
Parent=Motorola Web Browser
[MOT-V*/* MIB/*]
Parent=Motorola Web Browser
[MOT-V*/* UP.Browser/*]
Parent=Motorola Web Browser
[MOT-V3/* MIB/*]
Parent=Motorola Web Browser
[MOT-V4*/* MIB/*]
[MOT-V*/*]
Parent=Motorola Web Browser
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; MSN Mobile Proxy
@ -6943,7 +1780,7 @@ ActiveXControls=true
WAP=true
isMobileDevice=true
[Mozilla/4.0 (compatible; MSIE 4.01; Windows NT; MSN Mobile Proxy)]
[Mozilla/* (compatible; MSIE *; Windows*; MSN Mobile Proxy)]
Parent=MSN Mobile Proxy
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; NetFront
@ -6958,147 +1795,8 @@ JavaScript=true
WAP=true
isMobileDevice=true
[*NetFront/3.2]
[*NetFront/*]
Parent=NetFront
Version=3.2
MajorVer=3
MinorVer=2
WAP=true
isMobileDevice=true
[Mozilla/* (*)*NetFront/3.0*]
Parent=NetFront
Version=3.0
MajorVer=3
MinorVer=0
[Mozilla/* (*)*NetFront/3.1*]
Parent=NetFront
Version=3.1
MajorVer=3
MinorVer=1
[Mozilla/* (*)*NetFront/3.2*]
Parent=NetFront
Version=3.2
MajorVer=3
MinorVer=2
[Mozilla/* (*)*NetFront/3.3*]
Parent=NetFront
Version=3.3
MajorVer=3
MinorVer=3
[Mozilla/* (compatible; MSIE *; Windows *) NetFront/3.0*]
Parent=NetFront
Version=3.0
MajorVer=3
MinorVer=0
Win32=true
[Mozilla/* (compatible; MSIE *; Windows *) NetFront/3.1*]
Parent=NetFront
Version=3.1
MajorVer=3
MinorVer=1
Win32=true
[Mozilla/* (compatible; MSIE *; Windows *) NetFront/3.2*]
Parent=NetFront
Version=3.2
MajorVer=3
MinorVer=2
Win32=true
[Mozilla/* (compatible; MSIE *; Windows *) NetFront/3.3*]
Parent=NetFront
Version=3.3
MajorVer=3
MinorVer=3
Win32=true
[Mozilla/* (MobilePhone*) NetFront/3.0*]
Parent=NetFront
Version=3.0
MajorVer=3
MinorVer=0
[Mozilla/* (MobilePhone*) NetFront/3.1*]
Parent=NetFront
Version=3.1
MajorVer=3
MinorVer=1
[Mozilla/* (MobilePhone*) NetFront/3.2*]
Parent=NetFront
Version=3.2
MajorVer=3
MinorVer=2
[Mozilla/* (MobilePhone*) NetFront/3.3*]
Parent=NetFront
Version=3.3
MajorVer=3
MinorVer=3
[Mozilla/* (SmartPhone*) NetFront/3.0*]
Parent=NetFront
Version=3.0
MajorVer=3
MinorVer=0
[Mozilla/* (SmartPhone*) NetFront/3.1*]
Parent=NetFront
Version=3.1
MajorVer=3
MinorVer=1
[Mozilla/* (SmartPhone*) NetFront/3.2*]
Parent=NetFront
Version=3.2
MajorVer=3
MinorVer=2
[Mozilla/* (SmartPhone*) NetFront/3.3*]
Parent=NetFront
Version=3.3
MajorVer=3
MinorVer=3
[Mozilla/* (Windows; U; NT4.0; *) NetFront/3.0*]
Parent=NetFront
Version=3.0
MajorVer=3
MinorVer=0
Win32=true
[Mozilla/* (Windows; U; NT4.0; *) NetFront/3.1*]
Parent=NetFront
Version=3.1
MajorVer=3
MinorVer=1
Win32=true
[Mozilla/* (Windows; U; NT4.0; *) NetFront/3.2*]
Parent=NetFront
Version=3.2
MajorVer=3
MinorVer=2
Win32=true
[Mozilla/* (Windows; U; NT4.0; *) NetFront/3.3*]
Parent=NetFront
Version=3.3
MajorVer=3
MinorVer=3
Win32=true
[SAMSUNG-SGH-* Configuration/CLDC-?.? NetFront/3.2]
Parent=NetFront
Version=3.2
MajorVer=3
MinorVer=2
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Nokia
@ -7110,68 +1808,12 @@ Cookies=true
WAP=true
isMobileDevice=true
[Mozilla/5.0 (SymbianOS/*; U; *) AppleWebKit/413 (KHTML, like Gecko) Safari/413]
[*Nokia*/*]
Parent=Nokia
[Nokia????/* SymbianOS/* Series60/*]
[Mozilla/* (SymbianOS/*; ?; *) AppleWebKit/* (KHTML, like Gecko) Safari/*]
Parent=Nokia
Platform=SymbianOS
Frames=true
JavaScript=true
[Nokia????/1.0 (*) Profile/MIDP-?.? Configuration/CLDC-?.?*]
Parent=Nokia
Frames=false
JavaScript=false
[Nokia????/1.0 (*)*]
Parent=Nokia
Frames=false
JavaScript=false
[Nokia????/2.0 (*) Profile/MIDP-?.? Configuration/CLDC-?.?*]
Parent=Nokia
[Nokia????/2.0 (*) SymbianOS/* Series60/* Profile/MIDP-?.? Configuration/CLDC-?.?*]
Parent=Nokia
[Nokia????/4.* Series60/* Profile/MIDP-?.? Configuration/CLDC-?.?*]
Parent=Nokia
[Nokia?????/* (*) Profile/MIDP-?.? Configuration/CLDC-?.?*]
Parent=Nokia
[Nokia7650/* SymbianOS/* Series60/*]
Parent=Nokia
Platform=SymbianOS
Frames=true
JavaScript=true
[NokiaN70-1/*/SN* Series60/* Profile/MIDP-?.? Configuration/CLDC-?.?*]
Parent=Nokia
Frames=true
JavaScript=true
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Obigo
[Obigo]
Parent=DefaultProperties
Browser=Obigo
Frames=true
Tables=true
Cookies=true
JavaScript=true
WAP=true
isMobileDevice=true
[AU-MIC/* MMP/*]
Parent=Obigo
[LG-LX??? AU-MIC-LX??0/* MMP/*]
Parent=Obigo
[Samsung-SPHA* AU-MIC* MMP/*]
Parent=Obigo
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Openwave Mobile Browser
@ -7188,12 +1830,6 @@ WAP=true
isMobileDevice=true
isSyndicationReader=true
[*UP.Browser/*]
Parent=Openwave Mobile Browser
[*UP.Link/*]
Parent=Openwave Mobile Browser
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Opera
[Opera]
@ -7207,38 +1843,20 @@ JavaScript=true
WAP=true
isMobileDevice=true
[Mozilla/4.* (compatible; MSIE 6.0; Symbian OS; *Opera*]
[Mozilla/*(WILLCOM;KYOCERA/*) Opera *]
Parent=Opera
[Mozilla/4.* (compatible; MSIE *.*; Symbian*; *Opera*]
Parent=Opera
Platform=SymbianOS
[Mozilla/4.* (compatible; MSIE 6.0; SymbianOS; *Opera*]
Parent=Opera
[Opera/* (*Opera Mini/1.*)*]
Parent=Opera
Version=1.2
MajorVer=1
MinorVer=2
[Opera/* (*Opera Mini/2.*)*]
Parent=Opera
Version=2.0
MajorVer=2
MinorVer=0
CSS=1
CssVersion=1
supportsCSS=true
[Opera/* (*Opera Mini/3.*)*]
Parent=Opera
Version=3.0
MajorVer=3
MinorVer=0
[Opera/* (Nintendo Wii*)]
[Opera/* (*Nintendo Wii*)]
Parent=Opera
Browser=Wii Web Browser
[Opera/* (*Opera Mini/*)*]
Parent=Opera
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Playstation
[Playstation]
@ -7251,24 +1869,13 @@ Cookies=true
WAP=true
isMobileDevice=true
[Mozilla/4.0 (PSP (PlayStation Portable); 2.00)]
Parent=Playstation
Version=2.0
MajorVer=2
MinorVer=0
[Mozilla/5.0 (PLAYSTATION 3; 1.00)]
[Mozilla/* (PLAYSTATION *; *)]
Parent=Playstation
Browser=PlayStation 3
Version=1.0
MajorVer=1
MinorVer=1
Frames=false
[Sony PS2 (Linux)]
[Mozilla/* (PSP (PlayStation Portable); *)]
Parent=Playstation
Browser=Sony PS2
Platform=Linux
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Pocket PC
@ -7288,77 +1895,25 @@ CSS=1
CssVersion=1
supportsCSS=true
[HTC-*/* Mozilla/4.0 (compatible; MSIE 5.5; Windows CE*)*]
[*(compatible; MSIE *.*; Windows CE; PPC; *)]
Parent=Pocket PC
[HTC-*/* Mozilla/* (compatible; MSIE *.*; Windows CE*)*]
Parent=Pocket PC
Version=5.5
MajorVer=5
MinorVer=5
Win32=true
[HTC-*/* Mozilla/4.0 (compatible; MSIE 6.0; Windows CE*)*]
[Mozilla/* (compatible; MSPIE *.*; *Windows CE*)*]
Parent=Pocket PC
Version=6.0
MajorVer=6
MinorVer=0
Win32=true
[Mozilla/1.1 (compatible; MSPIE 2.0; *Windows CE*)*]
Parent=Pocket PC
Version=2.0
MajorVer=2
MinorVer=0
Win32=true
[Mozilla/2.0 (compatible; MSIE 3.0*; *Windows CE*)*]
Parent=Pocket PC
Version=3.0
MajorVer=3
MinorVer=0
Win32=true
[Mozilla/4.0 (compatible; MSIE 4.0*; *Windows CE*)*]
Parent=Pocket PC
Version=4.01
MajorVer=4
MinorVer=01
Win32=true
[Mozilla/4.0 (compatible; MSIE 5.5*; Windows CE*)*]
Parent=Pocket PC
Version=5.5
MajorVer=5
MinorVer=5
Win32=true
[Mozilla/4.0 (compatible; MSIE 6.0*; Windows CE*)*]
Parent=Pocket PC
Version=6.0
MajorVer=6
MinorVer=0
Win32=true
[Mozilla/4.0 (compatible; MSIE 7.0; Windows CE*)*]
Parent=Pocket PC
Version=7.0
MajorVer=7
MinorVer=0
Beta=true
Win32=true
[SIE-*/* (compatible; MSIE 4.01; Windows CE; PPC; 240x320)]
[T-Mobile* Mozilla/* (compatible; MSIE *.*; Windows CE; *)]
Parent=Pocket PC
[T-Mobile Dash Mozilla/4.0 (compatible; MSIE 4.*; Windows CE; Smartphone; 320x240)]
[Vodafone* Mozilla/* (compatible; MSIE *.*; Windows CE; *)*]
Parent=Pocket PC
[Vodafone/*/Mozilla/4.0 (compatible; MSIE*; Windows CE;*)*]
[Windows CE (Pocket PC) - Version *.*]
Parent=Pocket PC
[Windows CE (Pocket PC) - Version 4.2*]
Parent=Pocket PC
Version=4.01
MajorVer=4
MinorVer=01
Win32=true
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; SEMC Browser
@ -7374,9 +1929,6 @@ CSS=1
CssVersion=1
supportsCSS=true
[*SEMC-Browser/*]
Parent=SEMC Browser
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; SonyEricsson
[SonyEricsson]
@ -7388,11 +1940,14 @@ Cookies=true
JavaScript=true
WAP=true
isMobileDevice=true
CSS=1
CssVersion=1
supportsCSS=true
[Ericsson*]
[*Ericsson*]
Parent=SonyEricsson
[SonyEricsson*]
[*SonyEricsson*]
Parent=SonyEricsson
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Netbox
@ -7408,11 +1963,6 @@ CSS=1
CssVersion=1
supportsCSS=true
[Mozilla/3.01 (compatible; Netbox/*; Linux*)]
Parent=Netbox
Browser=Netbox
Platform=Linux
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; PowerTV
[PowerTV]
@ -7524,166 +2074,15 @@ CSS=1
CssVersion=1
supportsCSS=true
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Amaya
[Amaya]
Parent=DefaultProperties
Browser=Amaya
Tables=true
Cookies=true
[amaya/7.*]
Parent=Amaya
Version=7.0
MajorVer=7
MinorVer=0
[amaya/8.0*]
Parent=Amaya
Version=8.0
MajorVer=8
MinorVer=0
CSS=2
CssVersion=2
supportsCSS=true
[amaya/8.1*]
Parent=Amaya
Version=8.1
MajorVer=8
MinorVer=1
CSS=2
CssVersion=2
supportsCSS=true
[amaya/8.2*]
Parent=Amaya
Version=8.2
MajorVer=8
MinorVer=2
CSS=2
CssVersion=2
supportsCSS=true
[amaya/8.3*]
Parent=Amaya
Version=8.3
MajorVer=8
MinorVer=3
CSS=2
CssVersion=2
supportsCSS=true
[amaya/8.4*]
Parent=Amaya
Version=8.4
MajorVer=8
MinorVer=4
CSS=2
CssVersion=2
supportsCSS=true
[amaya/8.5*]
Parent=Amaya
Version=8.5
MajorVer=8
MinorVer=5
CSS=2
CssVersion=2
supportsCSS=true
[amaya/8.6*]
Parent=Amaya
Version=8.6
MajorVer=8
MinorVer=6
CSS=2
CssVersion=2
supportsCSS=true
[amaya/8.7*]
Parent=Amaya
Version=8.7
MajorVer=8
MinorVer=7
CSS=2
CssVersion=2
supportsCSS=true
[amaya/8.8*]
Parent=Amaya
Version=8.8
MajorVer=8
MinorVer=8
CSS=2
CssVersion=2
supportsCSS=true
[amaya/8.9*]
Parent=Amaya
Version=8.9
MajorVer=8
MinorVer=9
CSS=2
CssVersion=2
supportsCSS=true
[amaya/9.0*]
Parent=Amaya
Version=9.0
MajorVer=8
MinorVer=0
CSS=2
CssVersion=2
supportsCSS=true
[amaya/9.1*]
Parent=Amaya
Version=9.1
MajorVer=9
MinorVer=1
CSS=2
CssVersion=2
supportsCSS=true
[amaya/9.2*]
Parent=Amaya
Version=9.2
MajorVer=9
MinorVer=2
CSS=2
CssVersion=2
supportsCSS=true
[amaya/9.3*]
Parent=Amaya
Version=9.3
MajorVer=9
MinorVer=3
[amaya/9.4*]
Parent=Amaya
Version=9.4
MajorVer=9
MinorVer=4
[amaya/9.5*]
Parent=Amaya
Version=9.5
MajorVer=9
MinorVer=5
[Emacs-w3m/*]
Parent=Emacs/W3
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Links
[Links]
Parent=DefaultProperties
Browser=Links
Frames=true
Tables=true
[Links (0.9*; CYGWIN_NT-5.1*)]
Parent=Links
Browser=Links
@ -7821,14 +2220,6 @@ MajorVer=2
MinorVer=1
Platform=OpenBSD
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Lynx
[Lynx]
Parent=DefaultProperties
Browser=Lynx
Frames=true
Tables=true
[Lynx *]
Parent=Lynx
Browser=Lynx
@ -7875,14 +2266,6 @@ Version=2.8
MajorVer=2
MinorVer=8
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; w3m
[w3m]
Parent=DefaultProperties
Browser=w3m
Frames=true
Tables=true
[w3m/0.1*]
Parent=w3m
Browser=w3m
@ -7920,542 +2303,6 @@ MajorVer=0
MinorVer=5
Cookies=true
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ELinks 0.10
[ELinks 0.10]
Parent=DefaultProperties
Browser=ELinks
Version=0.10
MinorVer=10
Frames=true
Tables=true
[ELinks (0.10*; *AIX*)]
Parent=ELinks 0.10
Platform=AIX
[ELinks (0.10*; *BeOS*)]
Parent=ELinks 0.10
Platform=BeOS
[ELinks (0.10*; *CygWin*)]
Parent=ELinks 0.10
Platform=CygWin
[ELinks (0.10*; *Darwin*)]
Parent=ELinks 0.10
Platform=Darwin
[ELinks (0.10*; *Digital Unix*)]
Parent=ELinks 0.10
Platform=Digital Unix
[ELinks (0.10*; *FreeBSD*)]
Parent=ELinks 0.10
Platform=FreeBSD
[ELinks (0.10*; *HPUX*)]
Parent=ELinks 0.10
Platform=HP-UX
[ELinks (0.10*; *IRIX*)]
Parent=ELinks 0.10
Platform=IRIX
[ELinks (0.10*; *Linux*)]
Parent=ELinks 0.10
Platform=Linux
[ELinks (0.10*; *NetBSD*)]
Parent=ELinks 0.10
Platform=NetBSD
[ELinks (0.10*; *OpenBSD*)]
Parent=ELinks 0.10
Platform=OpenBSD
[ELinks (0.10*; *OS/2*)]
Parent=ELinks 0.10
Platform=OS/2
[ELinks (0.10*; *RISC*)]
Parent=ELinks 0.10
Platform=RISC OS
[ELinks (0.10*; *Solaris*)]
Parent=ELinks 0.10
Platform=Solaris
[ELinks (0.10*; *Unix*)]
Parent=ELinks 0.10
Platform=Unix
[ELinks/0.10* (*AIX*)]
Parent=ELinks 0.10
Platform=AIX
[ELinks/0.10* (*BeOS*)]
Parent=ELinks 0.10
Platform=BeOS
[ELinks/0.10* (*CygWin*)]
Parent=ELinks 0.10
Platform=CygWin
[ELinks/0.10* (*Darwin*)]
Parent=ELinks 0.10
Platform=Darwin
[ELinks/0.10* (*Digital Unix*)]
Parent=ELinks 0.10
Platform=Digital Unix
[ELinks/0.10* (*FreeBSD*)]
Parent=ELinks 0.10
Platform=FreeBSD
[ELinks/0.10* (*HPUX*)]
Parent=ELinks 0.10
Platform=HP-UX
[ELinks/0.10* (*IRIX*)]
Parent=ELinks 0.10
Platform=IRIX
[ELinks/0.10* (*Linux*)]
Parent=ELinks 0.10
Platform=Linux
[ELinks/0.10* (*NetBSD*)]
Parent=ELinks 0.10
Platform=NetBSD
[ELinks/0.10* (*OpenBSD*)]
Parent=ELinks 0.10
Platform=OpenBSD
[ELinks/0.10* (*OS/2*)]
Parent=ELinks 0.10
Platform=OS/2
[ELinks/0.10* (*RISC*)]
Parent=ELinks 0.10
Platform=RISC OS
[ELinks/0.10* (*Solaris*)]
Parent=ELinks 0.10
Platform=Solaris
[ELinks/0.10* (*Unix*)]
Parent=ELinks 0.10
Platform=Unix
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ELinks 0.11
[ELinks 0.11]
Parent=DefaultProperties
Browser=ELinks
Version=0.11
MinorVer=11
Frames=true
Tables=true
[ELinks (0.11*; *AIX*)]
Parent=ELinks 0.11
Platform=AIX
[ELinks (0.11*; *BeOS*)]
Parent=ELinks 0.11
Platform=BeOS
[ELinks (0.11*; *CygWin*)]
Parent=ELinks 0.11
Platform=CygWin
[ELinks (0.11*; *Darwin*)]
Parent=ELinks 0.11
Platform=Darwin
[ELinks (0.11*; *Digital Unix*)]
Parent=ELinks 0.11
Platform=Digital Unix
[ELinks (0.11*; *FreeBSD*)]
Parent=ELinks 0.11
Platform=FreeBSD
[ELinks (0.11*; *HPUX*)]
Parent=ELinks 0.11
Platform=HP-UX
[ELinks (0.11*; *IRIX*)]
Parent=ELinks 0.11
Platform=IRIX
[ELinks (0.11*; *Linux*)]
Parent=ELinks 0.11
Platform=Linux
[ELinks (0.11*; *NetBSD*)]
Parent=ELinks 0.11
Platform=NetBSD
[ELinks (0.11*; *OpenBSD*)]
Parent=ELinks 0.11
Platform=OpenBSD
[ELinks (0.11*; *OS/2*)]
Parent=ELinks 0.11
Platform=OS/2
[ELinks (0.11*; *RISC*)]
Parent=ELinks 0.11
Platform=RISC OS
[ELinks (0.11*; *Solaris*)]
Parent=ELinks 0.11
Platform=Solaris
[ELinks (0.11*; *Unix*)]
Parent=ELinks 0.11
Platform=Unix
[ELinks/0.11* (*AIX*)]
Parent=ELinks 0.11
Platform=AIX
[ELinks/0.11* (*BeOS*)]
Parent=ELinks 0.11
Platform=BeOS
[ELinks/0.11* (*CygWin*)]
Parent=ELinks 0.11
Platform=CygWin
[ELinks/0.11* (*Darwin*)]
Parent=ELinks 0.11
Platform=Darwin
[ELinks/0.11* (*Digital Unix*)]
Parent=ELinks 0.11
Platform=Digital Unix
[ELinks/0.11* (*FreeBSD*)]
Parent=ELinks 0.11
Platform=FreeBSD
[ELinks/0.11* (*HPUX*)]
Parent=ELinks 0.11
Platform=HP-UX
[ELinks/0.11* (*IRIX*)]
Parent=ELinks 0.11
Platform=IRIX
[ELinks/0.11* (*Linux*)]
Parent=ELinks 0.11
Platform=Linux
[ELinks/0.11* (*NetBSD*)]
Parent=ELinks 0.11
Platform=NetBSD
[ELinks/0.11* (*OpenBSD*)]
Parent=ELinks 0.11
Platform=OpenBSD
[ELinks/0.11* (*OS/2*)]
Parent=ELinks 0.11
Platform=OS/2
[ELinks/0.11* (*RISC*)]
Parent=ELinks 0.11
Platform=RISC OS
[ELinks/0.11* (*Solaris*)]
Parent=ELinks 0.11
Platform=Solaris
[ELinks/0.11* (*Unix*)]
Parent=ELinks 0.11
Platform=Unix
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ELinks 0.12
[ELinks 0.12]
Parent=DefaultProperties
Browser=ELinks
Version=0.12
MinorVer=12
Frames=true
Tables=true
[ELinks (0.12*; *AIX*)]
Parent=ELinks 0.12
Platform=AIX
[ELinks (0.12*; *BeOS*)]
Parent=ELinks 0.12
Platform=BeOS
[ELinks (0.12*; *CygWin*)]
Parent=ELinks 0.12
Platform=CygWin
[ELinks (0.12*; *Darwin*)]
Parent=ELinks 0.12
Platform=Darwin
[ELinks (0.12*; *Digital Unix*)]
Parent=ELinks 0.12
Platform=Digital Unix
[ELinks (0.12*; *FreeBSD*)]
Parent=ELinks 0.12
Platform=FreeBSD
[ELinks (0.12*; *HPUX*)]
Parent=ELinks 0.12
Platform=HP-UX
[ELinks (0.12*; *IRIX*)]
Parent=ELinks 0.12
Platform=IRIX
[ELinks (0.12*; *Linux*)]
Parent=ELinks 0.12
Platform=Linux
[ELinks (0.12*; *NetBSD*)]
Parent=ELinks 0.12
Platform=NetBSD
[ELinks (0.12*; *OpenBSD*)]
Parent=ELinks 0.12
Platform=OpenBSD
[ELinks (0.12*; *OS/2*)]
Parent=ELinks 0.12
Platform=OS/2
[ELinks (0.12*; *RISC*)]
Parent=ELinks 0.12
Platform=RISC OS
[ELinks (0.12*; *Solaris*)]
Parent=ELinks 0.12
Platform=Solaris
[ELinks (0.12*; *Unix*)]
Parent=ELinks 0.12
Platform=Unix
[ELinks/0.12* (*AIX*)]
Parent=ELinks 0.12
Platform=AIX
[ELinks/0.12* (*BeOS*)]
Parent=ELinks 0.12
Platform=BeOS
[ELinks/0.12* (*CygWin*)]
Parent=ELinks 0.12
Platform=CygWin
[ELinks/0.12* (*Darwin*)]
Parent=ELinks 0.12
Platform=Darwin
[ELinks/0.12* (*Digital Unix*)]
Parent=ELinks 0.12
Platform=Digital Unix
[ELinks/0.12* (*FreeBSD*)]
Parent=ELinks 0.12
Platform=FreeBSD
[ELinks/0.12* (*HPUX*)]
Parent=ELinks 0.12
Platform=HP-UX
[ELinks/0.12* (*IRIX*)]
Parent=ELinks 0.12
Platform=IRIX
[ELinks/0.12* (*Linux*)]
Parent=ELinks 0.12
Platform=Linux
[ELinks/0.12* (*NetBSD*)]
Parent=ELinks 0.12
Platform=NetBSD
[ELinks/0.12* (*OpenBSD*)]
Parent=ELinks 0.12
Platform=OpenBSD
[ELinks/0.12* (*OS/2*)]
Parent=ELinks 0.12
Platform=OS/2
[ELinks/0.12* (*RISC*)]
Parent=ELinks 0.12
Platform=RISC OS
[ELinks/0.12* (*Solaris*)]
Parent=ELinks 0.12
Platform=Solaris
[ELinks/0.12* (*Unix*)]
Parent=ELinks 0.12
Platform=Unix
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ELinks 0.9
[ELinks 0.9]
Parent=DefaultProperties
Browser=ELinks
Version=0.9
MinorVer=9
Frames=true
Tables=true
[ELinks (0.9*; *AIX*)]
Parent=ELinks 0.9
Platform=AIX
[ELinks (0.9*; *BeOS*)]
Parent=ELinks 0.9
Platform=BeOS
[ELinks (0.9*; *CygWin*)]
Parent=ELinks 0.9
Platform=CygWin
[ELinks (0.9*; *Darwin*)]
Parent=ELinks 0.9
Platform=Darwin
[ELinks (0.9*; *Digital Unix*)]
Parent=ELinks 0.9
Platform=Digital Unix
[ELinks (0.9*; *FreeBSD*)]
Parent=ELinks 0.9
Platform=FreeBSD
[ELinks (0.9*; *HPUX*)]
Parent=ELinks 0.9
Platform=HP-UX
[ELinks (0.9*; *IRIX*)]
Parent=ELinks 0.9
Platform=IRIX
[ELinks (0.9*; *Linux*)]
Parent=ELinks 0.9
Platform=Linux
[ELinks (0.9*; *NetBSD*)]
Parent=ELinks 0.9
Platform=NetBSD
[ELinks (0.9*; *OpenBSD*)]
Parent=ELinks 0.9
Platform=OpenBSD
[ELinks (0.9*; *OS/2*)]
Parent=ELinks 0.9
Platform=OS/2
[ELinks (0.9*; *RISC*)]
Parent=ELinks 0.9
Platform=RISC OS
[ELinks (0.9*; *Solaris*)]
Parent=ELinks 0.9
Platform=Solaris
[ELinks (0.9*; *Unix*)]
Parent=ELinks 0.9
Platform=Unix
[ELinks/0.9* (*AIX*)]
Parent=ELinks 0.9
Platform=AIX
[ELinks/0.9* (*BeOS*)]
Parent=ELinks 0.9
Platform=BeOS
[ELinks/0.9* (*CygWin*)]
Parent=ELinks 0.9
Platform=CygWin
[ELinks/0.9* (*Darwin*)]
Parent=ELinks 0.9
Platform=Darwin
[ELinks/0.9* (*Digital Unix*)]
Parent=ELinks 0.9
Platform=Digital Unix
[ELinks/0.9* (*FreeBSD*)]
Parent=ELinks 0.9
Platform=FreeBSD
[ELinks/0.9* (*HPUX*)]
Parent=ELinks 0.9
Platform=HP-UX
[ELinks/0.9* (*IRIX*)]
Parent=ELinks 0.9
Platform=IRIX
[ELinks/0.9* (*Linux*)]
Parent=ELinks 0.9
Platform=Linux
[ELinks/0.9* (*NetBSD*)]
Parent=ELinks 0.9
Platform=NetBSD
[ELinks/0.9* (*OpenBSD*)]
Parent=ELinks 0.9
Platform=OpenBSD
[ELinks/0.9* (*OS/2*)]
Parent=ELinks 0.9
Platform=OS/2
[ELinks/0.9* (*RISC*)]
Parent=ELinks 0.9
Platform=RISC OS
[ELinks/0.9* (*Solaris*)]
Parent=ELinks 0.9
Platform=Solaris
[ELinks/0.9* (*Unix*)]
Parent=ELinks 0.9
Platform=Unix
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; AppleWebKit
[AppleWebKit]
Parent=DefaultProperties
Browser=AppleWebKit
Frames=true
IFrames=true
Tables=true
Cookies=true
BackgroundSounds=true
JavaApplets=true
JavaScript=true
CSS=2
CssVersion=2
supportsCSS=true
[Mozilla/5.0 (Macintosh; *Mac OS X*) AppleWebKit/* (KHTML, like Gecko)]
Parent=AppleWebKit
@ -8541,54 +2388,6 @@ Cookies=true
JavaApplets=true
JavaScript=true
[Mozilla/5.0 (Macintosh; U; *Mac OS X*; *; rv:1.*) Gecko/* Chimera/*]
Parent=Chimera
Platform=MacOSX
[Mozilla/5.0 Gecko/* Chimera/*]
Parent=Chimera
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Dillo
[Dillo]
Parent=DefaultProperties
Browser=Dillo
Platform=Linux
Frames=true
IFrames=true
Tables=true
Cookies=true
CSS=2
CssVersion=2
supportsCSS=true
[Dillo/0.6*]
Parent=Dillo
Version=0.6
MajorVer=0
MinorVer=6
[Dillo/0.7*]
Parent=Dillo
Version=0.7
MajorVer=0
MinorVer=7
[Dillo/0.8*]
Parent=Dillo
Version=0.8
MajorVer=0
MinorVer=8
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Emacs/W3
[Emacs/W3]
Parent=DefaultProperties
Browser=Emacs/W3
Frames=true
Tables=true
Cookies=true
[Emacs/W3/2.* (Unix*]
Parent=Emacs/W3
Version=2.0
@ -8631,58 +2430,6 @@ MajorVer=4
MinorVer=0
Platform=Linux
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; fantomas
[fantomas]
Parent=DefaultProperties
Browser=fantomas
Frames=true
IFrames=true
Tables=true
Cookies=true
JavaScript=true
[Mozilla/4.0 (cloakBrowser)]
Parent=fantomas
Browser=fantomas cloakBrowser
[Mozilla/4.0 (fantomas shadowMaker Browser)]
Parent=fantomas
Browser=fantomas shadowMaker Browser
[Mozilla/4.0 (fantomBrowser)]
Parent=fantomas
Browser=fantomas fantomBrowser
[Mozilla/4.0 (fantomCrew Browser)]
Parent=fantomas
Browser=fantomas fantomCrew Browser
[Mozilla/4.0 (stealthBrowser)]
Parent=fantomas
Browser=fantomas stealthBrowser
[multiBlocker browser*]
Parent=fantomas
Browser=fantomas multiBlocker browser
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; FrontPage
[FrontPage]
Parent=DefaultProperties
Browser=FrontPage
Frames=true
IFrames=true
Tables=true
Cookies=true
JavaScript=true
[Mozilla/?* (compatible; MS FrontPage*)]
Parent=FrontPage
[MSFrontPage/*]
Parent=FrontPage
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Galeon
[Galeon]
@ -8698,90 +2445,6 @@ CSS=2
CssVersion=2
supportsCSS=true
[Mozilla/5.0 (X11; U; Linux*) Gecko/* Galeon/1.0*]
Parent=Galeon
Version=1.0
MajorVer=1
MinorVer=0
Platform=Linux
[Mozilla/5.0 (X11; U; Linux*) Gecko/* Galeon/1.1*]
Parent=Galeon
Version=1.1
MajorVer=1
MinorVer=1
Platform=Linux
[Mozilla/5.0 (X11; U; Linux*) Gecko/* Galeon/1.2*]
Parent=Galeon
Version=1.2
MajorVer=1
MinorVer=2
Platform=Linux
[Mozilla/5.0 (X11; U; Linux*) Gecko/* Galeon/1.3*]
Parent=Galeon
Version=1.3
MajorVer=1
MinorVer=3
Platform=Linux
[Mozilla/5.0 (X11; U; Linux*; Debian/*) Gecko/* Galeon/1.0*]
Parent=Galeon
Version=1.0
MajorVer=1
MinorVer=0
Platform=Debian
[Mozilla/5.0 (X11; U; Linux*; Debian/*) Gecko/* Galeon/1.1*]
Parent=Galeon
Version=1.1
MajorVer=1
MinorVer=1
Platform=Debian
[Mozilla/5.0 (X11; U; Linux*; Debian/*) Gecko/* Galeon/1.2*]
Parent=Galeon
Version=1.2
MajorVer=1
MinorVer=2
Platform=Debian
[Mozilla/5.0 (X11; U; Linux*; Debian/*) Gecko/* Galeon/1.3*]
Parent=Galeon
Version=1.3
MajorVer=1
MinorVer=3
Platform=Debian
[Mozilla/5.0 Galeon/1.0* (X11; Linux*)*]
Parent=Galeon
Version=1.0
MajorVer=1
MinorVer=0
Platform=Linux
[Mozilla/5.0 Galeon/1.1* (X11; Linux*)*]
Parent=Galeon
Version=1.1
MajorVer=1
MinorVer=1
Platform=Linux
[Mozilla/5.0 Galeon/1.2* (X11; Linux*)*]
Parent=Galeon
Version=1.2
MajorVer=1
MinorVer=2
Platform=Linux
[Mozilla/5.0 Galeon/1.3* (X11; Linux*)*]
Parent=Galeon
Version=1.3
MajorVer=1
MinorVer=3
Platform=Linux
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; HP Secure Web Browser
[HP Secure Web Browser]
@ -8798,60 +2461,6 @@ CSS=2
CssVersion=2
supportsCSS=true
[Mozilla/5.0 (X11; U; OpenVMS*; *; rv:1.0*) Gecko/*]
Parent=HP Secure Web Browser
Version=1.0
MajorVer=1
MinorVer=0
[Mozilla/5.0 (X11; U; OpenVMS*; *; rv:1.1*) Gecko/*]
Parent=HP Secure Web Browser
Version=1.1
MajorVer=1
MinorVer=1
[Mozilla/5.0 (X11; U; OpenVMS*; *; rv:1.2*) Gecko/*]
Parent=HP Secure Web Browser
Version=1.2
MajorVer=1
MinorVer=2
[Mozilla/5.0 (X11; U; OpenVMS*; *; rv:1.3*) Gecko/*]
Parent=HP Secure Web Browser
Version=1.3
MajorVer=1
MinorVer=3
[Mozilla/5.0 (X11; U; OpenVMS*; *; rv:1.4*) Gecko/*]
Parent=HP Secure Web Browser
Version=1.4
MajorVer=1
MinorVer=4
[Mozilla/5.0 (X11; U; OpenVMS*; *; rv:1.5*) Gecko/*]
Parent=HP Secure Web Browser
Version=1.5
MajorVer=1
MinorVer=5
[Mozilla/5.0 (X11; U; OpenVMS*; *; rv:1.6*) Gecko/*]
Parent=HP Secure Web Browser
Version=1.6
MajorVer=1
MinorVer=6
[Mozilla/5.0 (X11; U; OpenVMS*; *; rv:1.7*) Gecko/*]
Parent=HP Secure Web Browser
Version=1.7
MajorVer=1
MinorVer=7
[Mozilla/5.0 (X11; U; OpenVMS*; *; rv:1.8*) Gecko/*]
Parent=HP Secure Web Browser
Version=1.8
MajorVer=1
MinorVer=8
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; IBrowse
[IBrowse]
@ -8863,54 +2472,12 @@ Tables=true
Cookies=true
JavaScript=true
[Arexx (compatible; MSIE 6.0; AmigaOS5.0) IBrowse 4.0]
Parent=IBrowse
Version=4.0
MajorVer=4
MinorVer=0
[IBrowse/1.22 (AmigaOS *)]
Parent=IBrowse
Version=1.22
MajorVer=1
MinorVer=22
[IBrowse/2.1 (AmigaOS *)]
Parent=IBrowse
Version=2.1
MajorVer=2
MinorVer=1
[IBrowse/2.2 (AmigaOS *)]
Parent=IBrowse
Version=2.2
MajorVer=2
MinorVer=2
[IBrowse/2.3 (AmigaOS *)]
Parent=IBrowse
Version=2.2
MajorVer=2
MinorVer=3
[Mozilla/* (Win98; I) IBrowse/2.1 (AmigaOS 3.1)]
Parent=IBrowse
Version=2.1
MajorVer=2
MinorVer=1
[Mozilla/* (Win98; I) IBrowse/2.2 (AmigaOS 3.1)]
Parent=IBrowse
Version=2.2
MajorVer=2
MinorVer=2
[Mozilla/* (Win98; I) IBrowse/2.3 (AmigaOS 3.1)]
Parent=IBrowse
Version=2.3
MajorVer=2
MinorVer=3
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; iCab
[iCab]
@ -9062,81 +2629,6 @@ MajorVer=2
MinorVer=9
Platform=MacPPC
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; iSiloX
[iSiloX]
Parent=DefaultProperties
Browser=iSiloX
Frames=true
IFrames=true
Tables=true
Cookies=true
JavaScript=true
Crawler=true
CSS=2
CssVersion=2
supportsCSS=true
[iSiloX/4.0* MacOS]
Parent=iSiloX
Version=4.0
MajorVer=4
MinorVer=0
Platform=MacPPC
[iSiloX/4.0* Windows/32]
Parent=iSiloX
Version=4.0
MajorVer=4
MinorVer=0
Platform=Win32
Win32=true
[iSiloX/4.1* MacOS]
Parent=iSiloX
Version=4.1
MajorVer=4
MinorVer=1
Platform=MacPPC
[iSiloX/4.1* Windows/32]
Parent=iSiloX
Version=4.1
MajorVer=4
MinorVer=1
Platform=Win32
Win32=true
[iSiloX/4.2* MacOS]
Parent=iSiloX
Version=4.2
MajorVer=4
MinorVer=2
Platform=MacPPC
[iSiloX/4.2* Windows/32]
Parent=iSiloX
Version=4.2
MajorVer=4
MinorVer=2
Platform=Win32
Win32=true
[iSiloX/4.3* MacOS]
Parent=iSiloX
Version=4.3
MajorVer=4
MinorVer=4
Platform=MacOSX
[iSiloX/4.3* Windows/32]
Parent=iSiloX
Version=4.3
MajorVer=4
MinorVer=3
Platform=Win32
Win32=true
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; K-Meleon
[K-Meleon]
@ -9152,230 +2644,6 @@ CSS=2
CssVersion=2
supportsCSS=true
[Mozilla/5.0 (Windows; *; Win95; *; rv:1.*) Gecko/* K-Meleon/0.7*]
Parent=K-Meleon
Version=0.7
MajorVer=0
MinorVer=7
Platform=Win95
Win32=true
[Mozilla/5.0 (Windows; *; Win95; *; rv:1.*) Gecko/* K-Meleon/0.8*]
Parent=K-Meleon
Version=0.8
MajorVer=0
MinorVer=8
Platform=Win95
Win32=true
[Mozilla/5.0 (Windows; *; Win95; *; rv:1.*) Gecko/* K-Meleon/0.9*]
Parent=K-Meleon
Version=0.9
MajorVer=0
MinorVer=9
Platform=Win95
Win32=true
[Mozilla/5.0 (Windows; *; Win95; *; rv:1.*) Gecko/* K-Meleon/1.0*]
Parent=K-Meleon
Version=1.0
MajorVer=1
MinorVer=0
Platform=Win95
Win32=true
[Mozilla/5.0 (Windows; *; Win98; *; rv:1.*) Gecko/* K-Meleon 0.7*]
Parent=K-Meleon
Version=0.7
MajorVer=0
MinorVer=7
Platform=Win98
Win32=true
[Mozilla/5.0 (Windows; *; Win98; *; rv:1.*) Gecko/* K-Meleon/0.8*]
Parent=K-Meleon
Version=0.8
MajorVer=0
MinorVer=8
Platform=Win95
Win32=true
[Mozilla/5.0 (Windows; *; Win98; *; rv:1.*) Gecko/* K-Meleon/0.9*]
Parent=K-Meleon
Version=0.9
MajorVer=0
MinorVer=9
Platform=Win95
Win32=true
[Mozilla/5.0 (Windows; *; Win98; *; rv:1.*) Gecko/* K-Meleon/1.0*]
Parent=K-Meleon
Version=1.0
MajorVer=1
MinorVer=0
Platform=Win98
Win32=true
[Mozilla/5.0 (Windows; *; Windows NT 5.0; *; rv:1.*) Gecko/* K-Meleon?0.7*]
Parent=K-Meleon
Version=0.7
MajorVer=0
MinorVer=7
Platform=Win2000
Win32=true
[Mozilla/5.0 (Windows; *; Windows NT 5.0; *; rv:1.*) Gecko/* K-Meleon?0.8*]
Parent=K-Meleon
Version=0.8
MajorVer=0
MinorVer=8
Platform=Win2000
Win32=true
[Mozilla/5.0 (Windows; *; Windows NT 5.0; *; rv:1.*) Gecko/* K-Meleon?0.9*]
Parent=K-Meleon
Version=0.9
MajorVer=0
MinorVer=9
Platform=Win2000
Win32=true
[Mozilla/5.0 (Windows; *; Windows NT 5.0; *; rv:1.*) Gecko/* K-Meleon?1.0*]
Parent=K-Meleon
Version=1.0
MajorVer=1
MinorVer=0
Platform=Win2000
Win32=true
[Mozilla/5.0 (Windows; *; Windows NT 5.1; *; rv:1.*) Gecko/* K-Meleon/0.7*]
Parent=K-Meleon
Version=0.7
MajorVer=0
MinorVer=7
Platform=WinXP
Win32=true
[Mozilla/5.0 (Windows; *; Windows NT 5.1; *; rv:1.*) Gecko/* K-Meleon/0.8*]
Parent=K-Meleon
Version=0.8
MajorVer=0
MinorVer=8
Platform=WinXP
Win32=true
[Mozilla/5.0 (Windows; *; Windows NT 5.1; *; rv:1.*) Gecko/* K-Meleon/0.9*]
Parent=K-Meleon
Version=0.9
MajorVer=0
MinorVer=9
Platform=WinXP
Win32=true
[Mozilla/5.0 (Windows; *; Windows NT 5.1; *; rv:1.*) Gecko/* K-Meleon/1.0*]
Parent=K-Meleon
Version=1.0
MajorVer=1
MinorVer=0
Platform=WinXP
Win32=true
[Mozilla/5.0 (Windows; *; Windows NT 5.2; *; rv:1.*) Gecko/* K-Meleon/0.7*]
Parent=K-Meleon
Version=0.7
MajorVer=0
MinorVer=7
Platform=Win2003
Win32=true
[Mozilla/5.0 (Windows; *; Windows NT 5.2; *; rv:1.*) Gecko/* K-Meleon/0.8*]
Parent=K-Meleon
Version=0.8
MajorVer=0
MinorVer=8
Platform=Win2003
Win32=true
[Mozilla/5.0 (Windows; *; Windows NT 5.2; *; rv:1.*) Gecko/* K-Meleon/0.9*]
Parent=K-Meleon
Version=0.9
MajorVer=0
MinorVer=9
Platform=Win2003
Win32=true
[Mozilla/5.0 (Windows; *; Windows NT 5.2; *; rv:1.*) Gecko/* K-Meleon/1.0*]
Parent=K-Meleon
Version=1.0
MajorVer=1
MinorVer=0
Platform=Win2003
Win32=true
[Mozilla/5.0 (Windows; *; WinNT4.0; *; rv:1.*) Gecko/* K-Meleon/0.7*]
Parent=K-Meleon
Version=0.7
MajorVer=0
MinorVer=7
Platform=WinNT
Win32=true
[Mozilla/5.0 (Windows; *; WinNT4.0; *; rv:1.*) Gecko/* K-Meleon/0.8*]
Parent=K-Meleon
Version=0.8
MajorVer=0
MinorVer=8
Platform=WinNT
Win32=true
[Mozilla/5.0 (Windows; *; WinNT4.0; *; rv:1.*) Gecko/* K-Meleon/0.9*]
Parent=K-Meleon
Version=0.9
MajorVer=0
MinorVer=9
Platform=WinNT
Win32=true
[Mozilla/5.0 (Windows; *; WinNT4.0; *; rv:1.*) Gecko/* K-Meleon/1.0*]
Parent=K-Meleon
Version=1.0
MajorVer=1
MinorVer=0
Platform=WinNT
Win32=true
[Mozilla/5.0 (X11; *; Linux*; *; rv:1.*) Gecko/* K-Meleon?0.7*]
Parent=K-Meleon
Version=0.7
MajorVer=0
MinorVer=7
Platform=Linux
Win32=false
[Mozilla/5.0 (X11; *; Linux*; *; rv:1.*) Gecko/* K-Meleon?0.8*]
Parent=K-Meleon
Version=0.8
MajorVer=0
MinorVer=8
Platform=Linux
Win32=false
[Mozilla/5.0 (X11; *; Linux*; *; rv:1.*) Gecko/* K-Meleon?0.9*]
Parent=K-Meleon
Version=0.9
MajorVer=0
MinorVer=9
Platform=Linux
Win32=false
[Mozilla/5.0 (X11; *; Linux*; *; rv:1.*) Gecko/* K-Meleon?1.0*]
Parent=K-Meleon
Version=1.0
MajorVer=1
MinorVer=0
Platform=Linux
Win32=false
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Konqueror
[Konqueror]
@ -9542,88 +2810,6 @@ Platform=OpenBSD
Parent=Konqueror
IFrames=false
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Lycoris Desktop/LX
[Lycoris Desktop/LX]
Parent=DefaultProperties
Browser=Lycoris Desktop/LX
Frames=true
IFrames=true
Tables=true
Cookies=true
JavaApplets=true
JavaScript=true
Crawler=true
[Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.*: Desktop/LX Amethyst) Gecko/*]
Parent=Lycoris Desktop/LX
Version=1.1
MajorVer=1
MinorVer=1
Platform=Linux
[Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.*; Desktop/LX Amethyst) Gecko/*]
Parent=Lycoris Desktop/LX
Version=1.0
MajorVer=1
MinorVer=0
Platform=Linux
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Mosaic
[Mosaic]
Parent=DefaultProperties
Browser=Mosaic
Frames=true
IFrames=true
Tables=true
Cookies=true
JavaApplets=true
JavaScript=true
[Mozilla/4.0 (VMS_Mosaic)]
Parent=Mosaic
Platform=OpenVMS
[VMS_Mosaic/3.7*]
Parent=Mosaic
Version=3.7
MajorVer=3
MinorVer=7
Platform=OpenVMS
[VMS_Mosaic/3.8*]
Parent=Mosaic
Version=3.8
MajorVer=3
MinorVer=8
Platform=OpenVMS
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; NetPositive
[NetPositive]
Parent=DefaultProperties
Browser=NetPositive
Platform=BeOS
Frames=true
IFrames=true
Tables=true
Cookies=true
JavaApplets=true
JavaScript=true
[*NetPositive/2.2*]
Parent=NetPositive
Version=2.2
MajorVer=2
MinorVer=2
[*NetPositive/2.2*BeOS*]
Parent=NetPositive
Version=2.2
MajorVer=2
MinorVer=2
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; OmniWeb
[OmniWeb]
@ -9640,184 +2826,48 @@ CSS=2
CssVersion=2
supportsCSS=true
[Mozilla/* (compatible; MSIE *; Mac_PowerPC) OmniWeb/4.0*]
Parent=OmniWeb
Version=4.0
MajorVer=4
MinorVer=0
Platform=MacPPC
[Mozilla/* (compatible; MSIE *; Mac_PowerPC) OmniWeb/4.1*]
Parent=OmniWeb
Version=4.1
MajorVer=4
MinorVer=1
Platform=MacPPC
[Mozilla/* (compatible; MSIE *; Mac_PowerPC) OmniWeb/4.2*]
Parent=OmniWeb
Version=4.2
MajorVer=4
MinorVer=2
Platform=MacPPC
[Mozilla/* (compatible; MSIE *; Mac_PowerPC) OmniWeb/4.3*]
Parent=OmniWeb
Version=4.3
MajorVer=4
MinorVer=3
Platform=MacPPC
[Mozilla/* (compatible; MSIE *; Mac_PowerPC) OmniWeb/4.4*]
Parent=OmniWeb
Version=4.4
MajorVer=4
MinorVer=4
Platform=MacPPC
[Mozilla/* (compatible; MSIE *; Windows *) OmniWeb/4.0*]
Parent=OmniWeb
Version=4.0
MajorVer=4
MinorVer=0
Platform=Win32
Win32=true
[Mozilla/* (compatible; MSIE *; Windows *) OmniWeb/4.1*]
Parent=OmniWeb
Version=4.1
MajorVer=4
MinorVer=1
Platform=Win32
Win32=true
[Mozilla/* (compatible; MSIE *; Windows *) OmniWeb/4.2*]
Parent=OmniWeb
Version=4.2
MajorVer=4
MinorVer=2
Platform=Win32
Win32=true
[Mozilla/* (compatible; MSIE *; Windows *) OmniWeb/4.3*]
Parent=OmniWeb
Version=4.3
MajorVer=4
MinorVer=3
Platform=Win32
Win32=true
[Mozilla/* (compatible; MSIE *; Windows *) OmniWeb/4.4*]
Parent=OmniWeb
Version=4.4
MajorVer=4
MinorVer=4
Platform=Win32
Win32=true
[Mozilla/* (compatible; OmniWeb/4.0*; Mac_PowerPC)]
Parent=OmniWeb
Version=4.0
MajorVer=4
MinorVer=0
Platform=MacPPC
[Mozilla/* (compatible; OmniWeb/4.1*; Mac_PowerPC)]
Parent=OmniWeb
Version=4.1
MajorVer=4
MinorVer=1
Platform=MacPPC
[Mozilla/* (compatible; OmniWeb/4.2*; Mac_PowerPC)]
Parent=OmniWeb
Version=4.2
MajorVer=4
MinorVer=2
Platform=MacPPC
[Mozilla/* (compatible; OmniWeb/4.3*; Mac_PowerPC)]
Parent=OmniWeb
Version=4.3
MajorVer=4
MinorVer=3
Platform=MacPPC
[Mozilla/* (compatible; OmniWeb/4.4*; Mac_PowerPC)]
Parent=OmniWeb
Version=4.4
MajorVer=4
MinorVer=4
Platform=MacPPC
[Mozilla/* (Macintosh; I; PPC) OmniWeb/4.0*]
Parent=OmniWeb
Version=4.0
Platform=MacPPC
[Mozilla/* (Macintosh; I; PPC) OmniWeb/4.1*]
Parent=OmniWeb
Version=4.1
MajorVer=4
MinorVer=1
Platform=MacPPC
[Mozilla/* (Macintosh; I; PPC) OmniWeb/4.2*]
Parent=OmniWeb
Version=4.2
MajorVer=4
MinorVer=2
Platform=MacPPC
[Mozilla/* (Macintosh; I; PPC) OmniWeb/4.3*]
Parent=OmniWeb
Version=4.3
MajorVer=4
MinorVer=3
Platform=MacPPC
[Mozilla/* (Macintosh; I; PPC) OmniWeb/4.4*]
Parent=OmniWeb
Version=4.4
MajorVer=4
MinorVer=4
Platform=MacPPC
[Mozilla/5.0 (Macintosh; U; *Mac OS X; *) AppleWebKit/125.4 (KHTML, like Gecko, Safari) OmniWeb/v563.*]
Parent=OmniWeb
Version=5.1
MajorVer=5
MinorVer=1
Platform=MacOSX
[Mozilla/5.0 (Macintosh; U; *Mac OS X; *) AppleWebKit/420* (KHTML, like Gecko, Safari*) OmniWeb/v5*]
Parent=OmniWeb
Version=5.5
MajorVer=5
MinorVer=5
Platform=MacOSX
[Mozilla/5.0 (Macintosh; U; *Mac OS X; *) AppleWebKit/420* (KHTML, like Gecko, Safari/420) OmniWeb/v6*]
Parent=OmniWeb
Version=5.5
MajorVer=5
MinorVer=5
Platform=MacOSX
[Mozilla/5.0 (Macintosh; U; *Mac OS X; *) AppleWebKit/85 (KHTML, like Gecko) OmniWeb/v496*]
[Mozilla/* (Macintosh; ?; *Mac OS X; *) AppleWebKit/* (*) OmniWeb/v4*]
Parent=OmniWeb
Version=4.5
MajorVer=4
MinorVer=5
Platform=MacOSX
[Mozilla/5.0 (Macintosh; U; *Mac OS X; *) AppleWebKit/85 (KHTML, like Gecko) OmniWeb/v558.*]
[Mozilla/* (Macintosh; ?; *Mac OS X; *) AppleWebKit/* (*) OmniWeb/v5*]
Parent=OmniWeb
Version=5.
MajorVer=5
MinorVer=0
Platform=MacOSX
[Mozilla/* (Macintosh; ?; *Mac OS X; *) AppleWebKit/* (*) OmniWeb/v6*]
Parent=OmniWeb
Version=6.0
MajorVer=6
MinorVer=0
Platform=MacOSX
[Mozilla/* (Macintosh; ?; PPC) OmniWeb/4*]
Parent=OmniWeb
Version=4.0
MajorVer=4
MinorVer=0
Platform=MacPPC
[Mozilla/* (Macintosh; ?; PPC) OmniWeb/5*]
Parent=OmniWeb
Version=5.0
MajorVer=5
MinorVer=0
Platform=MacOSX
[Mozilla/* (Macintosh; ?; PPC) OmniWeb/6*]
Parent=OmniWeb
Version=6.0
MajorVer=6
MinorVer=0
Platform=MacPPC
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Safari
[Safari]
@ -9962,22 +3012,6 @@ Version=1.2
MajorVer=1
MinorVer=2
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Opera 4.0
[Opera 4.0]
Parent=DefaultProperties
Browser=Opera
Version=4
MajorVer=4
Frames=true
Tables=true
BackgroundSounds=true
JavaApplets=true
JavaScript=true
CSS=1
CssVersion=1
supportsCSS=true
[Mozilla/3.0 (Linux*; U) Opera 4.*]
Parent=Opera 4.0
Platform=Linux
@ -10177,23 +3211,6 @@ Parent=Opera 4.0
Platform=WinXP
Win32=true
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Opera 5.0
[Opera 5.0]
Parent=DefaultProperties
Browser=Opera
Version=5.0
MajorVer=5
Frames=true
Tables=true
Cookies=true
BackgroundSounds=true
JavaApplets=true
JavaScript=true
CSS=1
CssVersion=1
supportsCSS=true
[Mozilla/3.0 (Linux*; ?) Opera 5.0*]
Parent=Opera 5.0
Platform=Linux
@ -10320,10 +3337,6 @@ Platform=Linux
Parent=Opera 5.0
Platform=MacPPC
[Mozilla/5.0 (SunOS*; ?) Opera 5.0*]
Parent=Opera 5.0
Platform=SunOS
[Mozilla/5.0 (Windows 2000; ?) Opera 5.0*]
Parent=Opera 5.0
Platform=Win2000
@ -10392,24 +3405,6 @@ Parent=Opera 5.0
Platform=WinXP
Win32=true
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Opera 5.12
[Opera 5.12]
Parent=DefaultProperties
Browser=Opera
Version=5.12
MajorVer=5
MinorVer=12
Frames=true
Tables=true
Cookies=true
BackgroundSounds=true
JavaApplets=true
JavaScript=true
CSS=1
CssVersion=1
supportsCSS=true
[Mozilla/3.0 (Linux*; ?) Opera 5.12*]
Parent=Opera 5.12
Platform=Linux
@ -10609,24 +3604,6 @@ Parent=Opera 5.12
Platform=WinXP
Win32=true
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Opera 6.0
[Opera 6.0]
Parent=DefaultProperties
Browser=Opera
Version=6.0
MajorVer=6
Frames=true
IFrames=true
Tables=true
Cookies=true
BackgroundSounds=true
JavaApplets=true
JavaScript=true
CSS=1
CssVersion=1
supportsCSS=true
[Mozilla/3.0 (Linux*; ?) Opera 6.0*]
Parent=Opera 6.0
Platform=Linux
@ -10830,35 +3807,11 @@ Parent=Opera 6.0
Platform=WinXP
Win32=true
[Opera/6.0* (Windows NT 5.2; ?)*]
Parent=Opera 6.0
Platform=Win2003
Win32=true
[Opera/6.0* (Windows XP; ?)*]
Parent=Opera 6.0
Platform=WinXP
Win32=true
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Opera 6.1
[Opera 6.1]
Parent=DefaultProperties
Browser=Opera
Version=6.1
MajorVer=6
MinorVer=1
Frames=true
IFrames=true
Tables=true
Cookies=true
BackgroundSounds=true
JavaApplets=true
JavaScript=true
CSS=1
CssVersion=1
supportsCSS=true
[Mozilla/3.0 (FreeBSD*; ?) Opera 6.1 *]
Parent=Opera 6.1
Platform=FreeBSD
@ -11015,24 +3968,6 @@ Version=6.12
MinorVer=12
Platform=Unix
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Opera 7.0
[Opera 7.0]
Parent=DefaultProperties
Browser=Opera
Version=7.0
MajorVer=7
Frames=true
IFrames=true
Tables=true
Cookies=true
BackgroundSounds=true
JavaApplets=true
JavaScript=true
CSS=2
CssVersion=2
supportsCSS=true
[Mozilla/3.0 (Windows 2000; ?) Opera 7.0*]
Parent=Opera 7.0
Platform=Win2000
@ -11123,11 +4058,6 @@ Parent=Opera 7.0
Platform=WinME
Win32=true
[Mozilla/4.78 (Windows NT 4.0; ?) Opera 7.0*]
Parent=Opera 7.0
Platform=WinNT
Win32=true
[Mozilla/4.78 (Windows NT 5.1; ?) Opera 7.0*]
Parent=Opera 7.0
Platform=WinXP
@ -11218,25 +4148,6 @@ Parent=Opera 7.0
Platform=WinXP
Win32=true
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Opera 7.1
[Opera 7.1]
Parent=DefaultProperties
Browser=Opera
Version=7.1
MajorVer=7
MinorVer=1
Frames=true
IFrames=true
Tables=true
Cookies=true
BackgroundSounds=true
JavaApplets=true
JavaScript=true
CSS=2
CssVersion=2
supportsCSS=true
[Mozilla/?.* (compatible; MSIE ?.*; Windows 2000) Opera 7.1*]
Parent=Opera 7.1
Platform=Win2000
@ -11351,25 +4262,6 @@ Parent=Opera 7.1
Platform=WinXP
Win32=true
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Opera 7.2
[Opera 7.2]
Parent=DefaultProperties
Browser=Opera
Version=7.2
MajorVer=7
MinorVer=2
Frames=true
IFrames=true
Tables=true
Cookies=true
BackgroundSounds=true
JavaApplets=true
JavaScript=true
CSS=2
CssVersion=2
supportsCSS=true
[Mozilla/?.* (compatible; MSIE ?.*; Linux*) Opera 7.2*]
Parent=Opera 7.2
Platform=Linux
@ -11409,11 +4301,6 @@ Parent=Opera 7.2
Platform=WinXP
Win32=true
[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.2) Opera 7.2*]
Parent=Opera 7.2
Platform=Win2003
Win32=true
[Mozilla/?.* (compatible; MSIE ?.*; Windows XP) Opera 7.2*]
Parent=Opera 7.2
Platform=WinXP
@ -11454,11 +4341,6 @@ Parent=Opera 7.2
Platform=WinXP
Win32=true
[Mozilla/?.* (Windows NT 5.2; ?) Opera 7.2*]
Parent=Opera 7.2
Platform=Win2003
Win32=true
[Opera/7.2* (Linux*; ?)*]
Parent=Opera 7.2
Platform=Linux
@ -11493,11 +4375,6 @@ Parent=Opera 7.2
Platform=WinXP
Win32=true
[Opera/7.2* (Windows NT 5.2; ?)*]
Parent=Opera 7.2
Platform=Win2003
Win32=true
[Opera/7.2* (Windows XP; ?)*]
Parent=Opera 7.2
Platform=WinXP
@ -11515,33 +4392,10 @@ Platform=Linux
Parent=Opera 7.2
Platform=SunOS
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Opera 7.5
[Opera 7.5]
Parent=DefaultProperties
Browser=Opera
Version=7.5
MajorVer=7
MinorVer=5
Frames=true
IFrames=true
Tables=true
Cookies=true
BackgroundSounds=true
JavaApplets=true
JavaScript=true
CSS=2
CssVersion=2
supportsCSS=true
[Mozilla/?.* (compatible; MSIE ?.*; Linux*) Opera 7.5*]
Parent=Opera 7.5
Platform=Linux
[Mozilla/?.* (compatible; MSIE ?.*; Mac_PowerPC) Opera 7.5*]
Parent=Opera 7.5
Platform=MacPPC
[Mozilla/?.* (compatible; MSIE ?.*; Windows 2000) Opera 7.5*]
Parent=Opera 7.5
Platform=Win2000
@ -11577,11 +4431,6 @@ Parent=Opera 7.5
Platform=WinXP
Win32=true
[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.2) Opera 7.5*]
Parent=Opera 7.5
Platform=Win2003
Win32=true
[Mozilla/?.* (compatible; MSIE ?.*; Windows XP) Opera 7.5*]
Parent=Opera 7.5
Platform=WinXP
@ -11591,10 +4440,6 @@ Win32=true
Parent=Opera 7.5
Platform=Linux
[Mozilla/?.* (Macintosh; *Mac OS X; ?) Opera 7.5*]
Parent=Opera 7.5
Platform=MacOSX
[Mozilla/?.* (Windows 2000; ?) Opera 7.5*]
Parent=Opera 7.5
Platform=Win2000
@ -11630,11 +4475,6 @@ Parent=Opera 7.5
Platform=WinXP
Win32=true
[Mozilla/?.* (Windows NT 5.2; ?) Opera 7.5*]
Parent=Opera 7.5
Platform=Win2003
Win32=true
[Mozilla/?.* (X11; Linux*; ?) Opera 7.5*]
Parent=Opera 7.5
Platform=Linux
@ -11643,10 +4483,6 @@ Platform=Linux
Parent=Opera 7.5
Platform=Linux
[Opera/7.5* (Macintosh; *Mac OS X; ?)*]
Parent=Opera 7.5
Platform=MacOSX
[Opera/7.5* (Windows 95; ?)*]
Parent=Opera 7.5
Platform=Win95
@ -11677,11 +4513,6 @@ Parent=Opera 7.5
Platform=WinXP
Win32=true
[Opera/7.5* (Windows NT 5.2; ?)*]
Parent=Opera 7.5
Platform=Win2003
Win32=true
[Opera/7.5* (Windows XP; ?)*]
Parent=Opera 7.5
Platform=WinXP
@ -11695,33 +4526,10 @@ Platform=FreeBSD
Parent=Opera 7.5
Platform=Linux
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Opera 7.6
[Opera 7.6]
Parent=DefaultProperties
Browser=Opera
Version=7.6
MajorVer=7
MinorVer=6
Frames=true
IFrames=true
Tables=true
Cookies=true
BackgroundSounds=true
JavaApplets=true
JavaScript=true
CSS=2
CssVersion=2
supportsCSS=true
[Mozilla/?.* (compatible; MSIE ?.*; Linux*) Opera 7.6*]
Parent=Opera 7.6
Platform=Linux
[Mozilla/?.* (compatible; MSIE ?.*; Mac_PowerPC) Opera 7.6*]
Parent=Opera 7.6
Platform=MacPPC
[Mozilla/?.* (compatible; MSIE ?.*; Windows 2000) Opera 7.6*]
Parent=Opera 7.6
Platform=Win2000
@ -11757,11 +4565,6 @@ Parent=Opera 7.6
Platform=WinXP
Win32=true
[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.2) Opera 7.6*]
Parent=Opera 7.6
Platform=Win2003
Win32=true
[Mozilla/?.* (compatible; MSIE ?.*; Windows XP) Opera 7.6*]
Parent=Opera 7.6
Platform=WinXP
@ -11771,10 +4574,6 @@ Win32=true
Parent=Opera 7.6
Platform=Linux
[Mozilla/?.* (Macintosh; *Mac OS X; ?) Opera 7.6*]
Parent=Opera 7.6
Platform=MacOSX
[Mozilla/?.* (Windows 2000; ?) Opera 7.6*]
Parent=Opera 7.6
Platform=Win2000
@ -11810,11 +4609,6 @@ Parent=Opera 7.6
Platform=WinXP
Win32=true
[Mozilla/?.* (Windows NT 5.2; ?) Opera 7.6*]
Parent=Opera 7.6
Platform=Win2003
Win32=true
[Mozilla/?.* (X11; Linux*; ?) Opera 7.6*]
Parent=Opera 7.6
Platform=Linux
@ -11823,10 +4617,6 @@ Platform=Linux
Parent=Opera 7.6
Platform=Linux
[Opera/7.6* (Macintosh; *Mac OS X; ?)*]
Parent=Opera 7.6
Platform=MacOSX
[Opera/7.6* (Windows 95*)*]
Parent=Opera 7.6
Platform=Win95
@ -11857,11 +4647,6 @@ Parent=Opera 7.6
Platform=WinXP
Win32=true
[Opera/7.6* (Windows NT 5.2*)*]
Parent=Opera 7.6
Platform=Win2003
Win32=true
[Opera/7.6* (Windows XP*)*]
Parent=Opera 7.6
Platform=WinXP
@ -13331,7 +6116,7 @@ Platform=SunOS
[Opera 9.4]
Parent=DefaultProperties
Browser=Opera 9.4
Browser=Opera
Version=9.4
MajorVer=9
MinorVer=4
@ -13547,7 +6332,7 @@ Platform=SunOS
[Opera 9.5]
Parent=DefaultProperties
Browser=Opera 9.5
Browser=Opera
Version=9.5
MajorVer=9
MinorVer=5
@ -13760,22 +6545,6 @@ Platform=Linux
Parent=Opera 9.5
Platform=SunOS
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Netscape 4.0
[Netscape 4.0]
Parent=DefaultProperties
Browser=Netscape
Version=4.0
MajorVer=4
Frames=true
Tables=true
Cookies=true
JavaApplets=true
JavaScript=true
CSS=1
CssVersion=1
supportsCSS=true
[Mozilla/4.0*(Macintosh*]
Parent=Netscape 4.0
Version=4.03
@ -13802,23 +6571,6 @@ Platform=WinNT
Parent=Netscape 4.0
Platform=Linux
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Netscape 4.5
[Netscape 4.5]
Parent=DefaultProperties
Browser=Netscape
Version=4.5
MajorVer=4
MinorVer=5
Frames=true
Tables=true
Cookies=true
JavaApplets=true
JavaScript=true
CSS=1
CssVersion=1
supportsCSS=true
[Mozilla/4.5*(Macintosh; ?; PPC)]
Parent=Netscape 4.5
Platform=MacPPC
@ -13898,23 +6650,6 @@ Version=4.51
MinorVer=51
Platform=Linux
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Netscape 4.6
[Netscape 4.6]
Parent=DefaultProperties
Browser=Netscape
Version=4.6
MajorVer=4
MinorVer=6
Frames=true
Tables=true
Cookies=true
JavaApplets=true
JavaScript=true
CSS=1
CssVersion=1
supportsCSS=true
[Mozilla/4.6 * (OS/2; ?)]
Parent=Netscape 4.6
Platform=OS/2
@ -13971,23 +6706,6 @@ MajorVer=4
MinorVer=61
Platform=WinNT
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Netscape 4.7
[Netscape 4.7]
Parent=DefaultProperties
Browser=Netscape
Version=4.7
MajorVer=4
MinorVer=7
Frames=true
Tables=true
Cookies=true
JavaApplets=true
JavaScript=true
CSS=1
CssVersion=1
supportsCSS=true
[Mozilla/4.7 * (Win2000; ?)]
Parent=Netscape 4.7
Platform=Win2000
@ -14487,23 +7205,6 @@ Version=4.79
MinorVer=79
Platform=SunOS
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Netscape 4.8
[Netscape 4.8]
Parent=DefaultProperties
Browser=Netscape
Version=4.8
MajorVer=4
MinorVer=8
Frames=true
Tables=true
Cookies=true
JavaApplets=true
JavaScript=true
CSS=1
CssVersion=1
supportsCSS=true
[Mozilla/4.8*(Macintosh; ?; MacPPC)*]
Parent=Netscape 4.8
Platform=MacPPC
@ -14546,27 +7247,6 @@ Platform=WinNT
Parent=Netscape 4.8
Platform=Linux
[Mozilla/4.8*(X11; *SunOS*)*]
Parent=Netscape 4.8
Platform=SunOS
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Netscape 6.0
[Netscape 6.0]
Parent=DefaultProperties
Browser=Netscape
Version=6.0
MajorVer=6
Frames=true
IFrames=true
Tables=true
Cookies=true
JavaApplets=true
JavaScript=true
CSS=2
CssVersion=2
supportsCSS=true
[Mozilla/5.0 (Macintosh; ?; PPC;*) Gecko/* Netscape6/6.0*]
Parent=Netscape 6.0
Platform=MacPPC
@ -14620,24 +7300,6 @@ Win32=true
Parent=Netscape 6.0
Platform=Linux
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Netscape 6.1
[Netscape 6.1]
Parent=DefaultProperties
Browser=Netscape
Version=6.1
MajorVer=6
MinorVer=1
Frames=true
IFrames=true
Tables=true
Cookies=true
JavaApplets=true
JavaScript=true
CSS=2
CssVersion=2
supportsCSS=true
[Mozilla/5.0 (Macintosh; ?; PPC;*) Gecko/* Netscape6/6.1*]
Parent=Netscape 6.1
Platform=MacPPC
@ -15265,441 +7927,6 @@ Platform=Linux
Parent=Netscape 8.1
Platform=SunOS
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Firebird
[Firebird]
Parent=DefaultProperties
Browser=Firebird
Frames=true
IFrames=true
Tables=true
Cookies=true
JavaApplets=true
JavaScript=true
CSS=2
CssVersion=2
supportsCSS=true
[Mozilla/5.0 (Linux; *; rv:1.*) Gecko/* Mozilla Firebird/0.*]
Parent=Firebird
[Mozilla/5.0 (Macintosh; *; *Mac OS X*; *; rv:1.*) Gecko/* Firebird/0.*]
Parent=Firebird
[Mozilla/5.0 (Macintosh; *; *Mac OS X*; *; rv:1.*) Gecko/* Mozilla Firebird/0.*]
Parent=Firebird
[Mozilla/5.0 (OS/2; *; Warp*; *; rv:1.*) Gecko/* Firebird/0.*]
Parent=Firebird
[Mozilla/5.0 (Windows; *; Win 9x 4.90; *; rv:1.*) Gecko/* Firebird/0.*]
Parent=Firebird
Win32=true
[Mozilla/5.0 (Windows; *; Win 9x 4.90; *; rv:1.*) Gecko/* Mozilla Firebird/0.*]
Parent=Firebird
Win32=true
[Mozilla/5.0 (Windows; *; Win95; *; rv:1.*) Gecko/* Firebird/0.*]
Parent=Firebird
Win32=true
[Mozilla/5.0 (Windows; *; Win98; *; rv:1.*) Gecko/* Firebird/0.*]
Parent=Firebird
Win32=true
[Mozilla/5.0 (Windows; *; Win98; *; rv:1.*) Gecko/* Mozilla Firebird/0.*]
Parent=Firebird
Win32=true
[Mozilla/5.0 (Windows; *; Windows NT 5.?; *; rv:1.*) Gecko/* Firebird Browser/0.*]
Parent=Firebird
Win32=true
[Mozilla/5.0 (Windows; *; Windows NT 5.?; *; rv:1.*) Gecko/* Firebird/0.*]
Parent=Firebird
Win32=true
[Mozilla/5.0 (Windows; *; Windows NT 5.?; *; rv:1.*) Gecko/* Mozilla Firebird/0.*]
Parent=Firebird
Win32=true
[Mozilla/5.0 (Windows; *; Windows NT 5.?; rv:1.*) Gecko/* Firebird/0.*]
Parent=Firebird
Win32=true
[Mozilla/5.0 (Windows; *; Windows NT 6.*; *; rv:1.*) Gecko/* Firebird/0.*]
Parent=Firebird
Win32=true
[Mozilla/5.0 (Windows; *; WinNT4.0; *; rv:1.*) Gecko/* Firebird/0.*]
Parent=Firebird
Win32=true
[Mozilla/5.0 (Windows; *; WinNT4.0; *; rv:1.*) Gecko/* Mozilla Firebird/0.*]
Parent=Firebird
Win32=true
[Mozilla/5.0 (X11; *; FreeBSD*; *; rv:1.*) Gecko/* Firebird/0.*]
Parent=Firebird
[Mozilla/5.0 (X11; *; FreeBSD*; *; rv:1.*) Gecko/* Mozilla Firebird/0.*]
Parent=Firebird
[Mozilla/5.0 (X11; *; IRIX*; *; rv:1.*) Gecko/* Mozilla Firebird/0.*]
Parent=Firebird
[Mozilla/5.0 (X11; *; Linux*; *; rv:1.*) Gecko/* Firebird/0.*]
Parent=Firebird
[Mozilla/5.0 (X11; *; OpenBSD*; *; rv:1.*) Gecko/* Mozilla Firebird/0.*]
Parent=Firebird
[Mozilla/5.0 (X11; *; SunOS*; *; rv:1.*) Gecko/* Firebird/0.*]
Parent=Firebird
[Mozilla/5.0 (X11; *; SunOS*; *; rv:1.*) Gecko/* Mozilla Firebird/0.*]
Parent=Firebird
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Firefox
[Firefox]
Parent=DefaultProperties
Browser=Firefox
Frames=true
IFrames=true
Tables=true
Cookies=true
JavaApplets=true
JavaScript=true
CSS=2
CssVersion=2
supportsCSS=true
[Mozilla/5.0 (Macintosh; *; *Mac OS X*; *; rv:1.*) Gecko/* Firefox/0.*]
Parent=Firefox
Platform=MacOSX
[Mozilla/5.0 (Macintosh; *; *Mac OS X*; rv:1.*) Gecko/* Firefox/0.*]
Parent=Firefox
[Mozilla/5.0 (OS/2; *; Warp*; rv:1.*) Gecko/* Firefox/0.*]
Parent=Firefox
[Mozilla/5.0 (Windows NT 5.?; ?; rv:1.*) Gecko/* Firefox]
Parent=Firefox
Win32=true
[Mozilla/5.0 (Windows; *; *; rv:1.*) Gecko/* Firefox/0.*]
Parent=Firefox
Win32=true
[Mozilla/5.0 (Windows; *; Win 9x 4.90; *; rv:1.*) Gecko/* Firefox/0.*]
Parent=Firefox
Platform=WinME
Win32=true
[Mozilla/5.0 (Windows; *; Win 9x 4.90; rv:1.*) Gecko/* Firefox/0.*]
Parent=Firefox
Win32=true
[Mozilla/5.0 (Windows; *; Win95; *; rv:1.*) Gecko/* Firefox/0.*]
Parent=Firefox
Platform=Win95
Win32=true
[Mozilla/5.0 (Windows; *; Win95; rv:1.*) Gecko/* Firefox/0.*]
Parent=Firefox
Win32=true
[Mozilla/5.0 (Windows; *; Win98; *; rv:1.*) Gecko/* Firefox/0.*]
Parent=Firefox
Platform=Win98
Win32=true
[Mozilla/5.0 (Windows; *; Win98; rv:1.*) Gecko/* Firefox/0.*]
Parent=Firefox
Win32=true
[Mozilla/5.0 (Windows; *; Windows NT 5.*; *; rv:1.*) Gecko/* Deer Park/Alpha*]
Parent=Firefox
Win32=true
[Mozilla/5.0 (Windows; *; Windows NT 5.?; *; rv:1.*) Gecko/* Firefox/10.5]
Parent=Firefox
Win32=true
[Mozilla/5.0 (Windows; *; Windows NT 5.0; *; rv:1.*) Gecko/* Firefox/0.*]
Parent=Firefox
Platform=Win2000
Win32=true
[Mozilla/5.0 (Windows; *; Windows NT 5.0; rv:1.*) Gecko/* Firefox/0.*]
Parent=Firefox
Win32=true
[Mozilla/5.0 (Windows; *; Windows NT 5.1; *; rv:1.*) Gecko/* Firefox/0.*]
Parent=Firefox
Win32=true
[Mozilla/5.0 (Windows; *; Windows NT 5.1; rv:1.*) Gecko/* Firefox/0.*]
Parent=Firefox
Win32=true
[Mozilla/5.0 (Windows; *; Windows NT 5.2; *; rv:1.*) Gecko/* Firefox/0.*]
Parent=Firefox
Win32=true
[Mozilla/5.0 (Windows; *; Windows NT 5.2; rv:1.*) Gecko/* Firefox/0.*]
Parent=Firefox
Win32=true
[Mozilla/5.0 (Windows; *; Windows NT 6.0*; *; rv:1.*) Gecko/* Firefox/0.*]
Parent=Firefox
Platform=WinVista
Win32=true
[Mozilla/5.0 (Windows; *; Windows NT 6.0*; rv:1.*) Gecko/* Firefox/0.*]
Parent=Firefox
Win32=true
[Mozilla/5.0 (Windows; *; WinNT4.0; *; rv:1.*) Gecko/* Firefox/0.*]
Parent=Firefox
Platform=WinNT
Win32=true
[Mozilla/5.0 (Windows; *; WinNT4.0; rv:1.*) Gecko/* Firefox/0.*]
Parent=Firefox
Win32=true
[Mozilla/5.0 (X11; *; FreeBSD*; *; rv:1.*) Gecko/* Firefox/0.*]
Parent=Firefox
Platform=FreeBSD
[Mozilla/5.0 (X11; *; FreeBSD*; rv:1.*) Gecko/* Firefox/0.*]
Parent=Firefox
[Mozilla/5.0 (X11; *; HP-UX*; rv:1.*) Gecko/* Firefox/0.*]
Parent=Firefox
Platform=HP-UX
[Mozilla/5.0 (X11; *; IRIX64*; *; rv:1.*) Gecko/* Firefox/0.*]
Parent=Firefox
Platform=IRIX64
[Mozilla/5.0 (X11; *; Linux*; *; rv:1.*) Gecko/* Firefox/0.*]
Parent=Firefox
[Mozilla/5.0 (X11; *; Linux*; rv:1.*) Gecko/* Firefox/0.*]
Parent=Firefox
[Mozilla/5.0 (X11; *; OpenBSD*; *; rv:1.*) Gecko/* Firefox/0.*]
Parent=Firefox
Platform=OpenBSD
[Mozilla/5.0 (X11; *; SunOS*; *; rv:1.*) Gecko/* Firefox/0.*]
Parent=Firefox
Platform=SunOS
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Firefox 1.0
[Firefox 1.0]
Parent=DefaultProperties
Browser=Firefox
Version=1.0
MajorVer=1
Frames=true
IFrames=true
Tables=true
Cookies=true
JavaApplets=true
JavaScript=true
CSS=2
CssVersion=2
supportsCSS=true
[Mozilla/5.0 (Linux; *; PPC*; *; rv:1.*) Gecko/* Firefox/1.0*]
Parent=Firefox 1.0
Platform=MacPPC
[Mozilla/5.0 (Macintosh; *; *Mac OS X*; *; rv:1.*) Gecko/* Firefox/1.0*]
Parent=Firefox 1.0
Platform=MacOSX
[Mozilla/5.0 (OS/2; *; Warp*; *; rv:1.*) Gecko/* Firefox/1.0*]
Parent=Firefox 1.0
Platform=OS/2
[Mozilla/5.0 (Windows; *; Win 9x 4.90*; *; rv:1.*) Gecko/* Firefox/1.0*]
Parent=Firefox 1.0
Platform=WinME
Win32=true
[Mozilla/5.0 (Windows; *; Win95; *; rv:1.*) Gecko/* Firefox/1.0*]
Parent=Firefox 1.0
Platform=Win95
Win32=true
[Mozilla/5.0 (Windows; *; Win98; *; rv:1.*) Gecko/* Firefox/1.0*]
Parent=Firefox 1.0
Platform=Win98
Win32=true
[Mozilla/5.0 (Windows; *; Windows NT 5.0; *; rv:1.*) Gecko/* Firefox/1.0*]
Parent=Firefox 1.0
Platform=Win2000
Win32=true
[Mozilla/5.0 (Windows; *; Windows NT 5.1; *; rv:1.*) Gecko/* Firefox/1.0*]
Parent=Firefox 1.0
Platform=WinXP
Win32=true
[Mozilla/5.0 (Windows; *; Windows NT 5.1; rv:1.*) Gecko/* Firefox/1.0*]
Parent=Firefox 1.0
Platform=WinXP
Win32=true
[Mozilla/5.0 (Windows; *; Windows NT 5.2; *; rv:1.*) Gecko/* Firefox/1.0*]
Parent=Firefox 1.0
Platform=Win2003
Win32=true
[Mozilla/5.0 (Windows; *; Windows NT 6.0*; *; rv:1.*) Gecko/* Firefox/1.0*]
Parent=Firefox 1.0
Platform=WinVista
Win32=true
[Mozilla/5.0 (Windows; *; WinNT4.0; *; rv:1.*) Gecko/* Firefox/1.0*]
Parent=Firefox 1.0
Platform=WinNT
Win32=true
[Mozilla/5.0 (X11; *; *Linux*; *; rv:1.*) Gecko/* Firefox/1.0*]
Parent=Firefox 1.0
Platform=Linux
[Mozilla/5.0 (X11; *; *Linux*; rv:1.*) Gecko/* Firefox/1.0*]
Parent=Firefox 1.0
Platform=Linux
[Mozilla/5.0 (X11; *; DragonFly*; *; rv:1.*) Gecko/* Firefox/1.0*]
Parent=Firefox 1.0
[Mozilla/5.0 (X11; *; FreeBSD*; *; rv:1.*) Gecko/* Firefox/1.0*]
Parent=Firefox 1.0
Platform=FreeBSD
[Mozilla/5.0 (X11; *; HP-UX*; *; rv:1.*) Gecko/* Firefox/1.0*]
Parent=Firefox 1.0
Platform=HP-UX
[Mozilla/5.0 (X11; *; IRIX64*; *; rv:1.*) Gecko/* Firefox/1.0*]
Parent=Firefox 1.0
Platform=IRIX64
[Mozilla/5.0 (X11; *; OpenBSD*; *; rv:1.*) Gecko/* Firefox/1.0*]
Parent=Firefox 1.0
Platform=OpenBSD
[Mozilla/5.0 (X11; *; SunOS*; *; rv:1.*) Gecko/* Firefox/1.0*]
Parent=Firefox 1.0
Platform=SunOS
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Firefox 1.4
[Firefox 1.4]
Parent=DefaultProperties
Browser=Firefox
Version=1.4
MajorVer=1
MinorVer=4
Frames=true
IFrames=true
Tables=true
Cookies=true
JavaApplets=true
JavaScript=true
CSS=2
CssVersion=2
supportsCSS=true
[Mozilla/5.0 (Linux; *; PPC*; *; rv:1.*) Gecko/* Firefox/1.4*]
Parent=Firefox 1.4
Platform=Linux
[Mozilla/5.0 (Macintosh; *; *Mac OS X*; *; rv:1.*) Gecko/* Firefox/1.4*]
Parent=Firefox 1.4
Platform=MacOSX
[Mozilla/5.0 (OS/2; *; Warp*; *; rv:1.*) Gecko/* Firefox/1.4*]
Parent=Firefox 1.4
Platform=OS/2
[Mozilla/5.0 (Windows; *; Win 9x 4.90; *; rv:1.*) Gecko/* Firefox/1.4*]
Parent=Firefox 1.4
Platform=WinME
Win32=true
[Mozilla/5.0 (Windows; *; Win95*; *; rv:1.*) Gecko/* Firefox/1.4*]
Parent=Firefox 1.4
Platform=Win95
Win32=true
[Mozilla/5.0 (Windows; *; Win98; *; rv:1.*) Gecko/* Firefox/1.4*]
Parent=Firefox 1.4
Platform=Win98
Win32=true
[Mozilla/5.0 (Windows; *; Windows NT 5.0; *; rv:1.*) Gecko/* Firefox/1.4*]
Parent=Firefox 1.4
Platform=Win2000
Win32=true
[Mozilla/5.0 (Windows; *; Windows NT 5.1; *; rv:1.*) Gecko/* Firefox/1.4*]
Parent=Firefox 1.4
Platform=WinXP
Win32=true
[Mozilla/5.0 (Windows; *; Windows NT 5.2; *; rv:1.*) Gecko/* Firefox/1.4*]
Parent=Firefox 1.4
Platform=Win2003
Win32=true
[Mozilla/5.0 (Windows; *; Windows NT 6.0; *; rv:1.*) Gecko/* Firefox/1.4*]
Parent=Firefox 1.4
Platform=WinVista
Win32=true
[Mozilla/5.0 (Windows; *; WinNT4.0; *; rv:1.*) Gecko/* Firefox/1.4*]
Parent=Firefox 1.4
Platform=WinNT
Win32=true
[Mozilla/5.0 (X11; *; *Linux*; *; rv:1.*) Gecko/* Firefox/1.4*]
Parent=Firefox 1.4
Platform=Linux
[Mozilla/5.0 (X11; *; FreeBSD*; *; rv:1.*) Gecko/* Firefox/1.4*]
Parent=Firefox 1.4
Platform=FreeBSD
[Mozilla/5.0 (X11; *; HP-UX*; *; rv:1.*) Gecko/* Firefox/1.4*]
Parent=Firefox 1.4
Platform=HP-UX
[Mozilla/5.0 (X11; *; IRIX64*; *; rv:1.*) Gecko/* Firefox/1.4*]
Parent=Firefox 1.4
Platform=IRIX64
[Mozilla/5.0 (X11; *; OpenBSD*; *; rv:1.*) Gecko/* Firefox/1.4*]
Parent=Firefox 1.4
Platform=OpenBSD
[Mozilla/5.0 (X11; *; SunOS*; *; rv:1.*) Gecko/* Firefox/1.4*]
Parent=Firefox 1.4
Platform=SunOS
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Firefox 1.5
[Firefox 1.5]
@ -15718,95 +7945,6 @@ CSS=2
CssVersion=2
supportsCSS=true
[Mozilla/5.0 (Linux; *; PPC*; *; rv:1.*) Gecko/* Firefox/1.5*]
Parent=Firefox 1.5
Platform=Linux
[Mozilla/5.0 (Macintosh; *; *Mac OS X*; *; rv:1.*) Gecko/* Firefox/1.5*]
Parent=Firefox 1.5
Platform=MacOSX
[Mozilla/5.0 (OS/2; *; Warp*; *; rv:1.*) Gecko/* Firefox/1.5*]
Parent=Firefox 1.5
Platform=OS/2
[Mozilla/5.0 (rv:1.*) Gecko/* Firefox/1.5*]
Parent=Firefox 1.5
[Mozilla/5.0 (Windows; *; Win 9x 4.90; *; rv:1.*) Gecko/* Firefox/1.5*]
Parent=Firefox 1.5
Platform=WinME
Win32=true
[Mozilla/5.0 (Windows; *; Win95; *; rv:1.*) Gecko/* Firefox/1.5*]
Parent=Firefox 1.5
Platform=Win95
Win32=true
[Mozilla/5.0 (Windows; *; Win98; *; rv:1.*) Gecko/* Firefox/1.5*]
Parent=Firefox 1.5
Platform=Win98
Win32=true
[Mozilla/5.0 (Windows; *; Windows NT 5.0; *; rv:1.*) Gecko/* Firefox/1.5*]
Parent=Firefox 1.5
Platform=Win2000
Win32=true
[Mozilla/5.0 (Windows; *; Windows NT 5.1; *; rv:1.*) Gecko/* Firefox/1.5*]
Parent=Firefox 1.5
Platform=WinXP
Win32=true
[Mozilla/5.0 (Windows; *; Windows NT 5.1; *; rv:1.*) Gecko/* Firefox/1.5*]
Parent=Firefox 1.5
Platform=WinXP
Win32=true
[Mozilla/5.0 (Windows; *; Windows NT 5.2 x64; *; rv:1.*) Gecko/* Firefox/1.5*]
Parent=Firefox 1.5
Platform=WinXP
Win32=true
[Mozilla/5.0 (Windows; *; Windows NT 5.2; *; rv:1.*) Gecko/* Firefox/1.5*]
Parent=Firefox 1.5
Platform=Win2003
Win32=true
[Mozilla/5.0 (Windows; *; Windows NT 6.0; *; rv:1.*) Gecko/* Firefox/1.5*]
Parent=Firefox 1.5
Platform=WinVista
Win32=true
[Mozilla/5.0 (Windows; *; WinNT4.0; *; rv:1.*) Gecko/* Firefox/1.5*]
Parent=Firefox 1.5
Platform=WinNT
Win32=true
[Mozilla/5.0 (X11; *; *Linux*; *; rv:1.*) Gecko/* Firefox/1.5*]
Parent=Firefox 1.5
Platform=Linux
[Mozilla/5.0 (X11; *; FreeBSD*; *; rv:1.*) Gecko/* Firefox/1.5*]
Parent=Firefox 1.5
Platform=FreeBSD
[Mozilla/5.0 (X11; *; HP-UX*; *; rv:1.*) Gecko/* Firefox/1.5*]
Parent=Firefox 1.5
Platform=HP-UX
[Mozilla/5.0 (X11; *; IRIX64*; *; rv:1.*) Gecko/* Firefox/1.5*]
Parent=Firefox 1.5
Platform=IRIX64
[Mozilla/5.0 (X11; *; OpenBSD*; *; rv:1.*) Gecko/* Firefox/1.5*]
Parent=Firefox 1.5
Platform=OpenBSD
[Mozilla/5.0 (X11; *; SunOS*; *; rv:1.*) Gecko/* Firefox/1.5*]
Parent=Firefox 1.5
Platform=SunOS
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Firefox 2.0
[Firefox 2.0]
@ -15824,378 +7962,11 @@ CSS=2
CssVersion=2
supportsCSS=true
[Mozilla/5.0 (Linux; *; PPC*; *; rv:1.8*) Gecko/* Firefox/2.0*]
Parent=Firefox 2.0
Platform=Linux
[Mozilla/5.0 (Macintosh; *; *Mac OS X*; *; rv:1.8*) Gecko/* Firefox/2.0*]
Parent=Firefox 2.0
Platform=MacOSX
[Mozilla/5.0 (OS/2; *; Warp*; *; rv:1.8*) Gecko/* Firefox/2.0*]
Parent=Firefox 2.0
Platform=OS/2
[Mozilla/5.0 (Windows; *; Win 9x 4.90; *; rv:1.8*) Gecko/* Firefox/2.0*]
Parent=Firefox 2.0
Platform=WinME
Win32=true
[Mozilla/5.0 (Windows; *; Win95; *; rv:1.8*) Gecko/* Firefox/2.0*]
Parent=Firefox 2.0
Platform=Win95
Win32=true
[Mozilla/5.0 (Windows; *; Win98; *; rv:1.8*) Gecko/* Firefox/2.0*]
Parent=Firefox 2.0
Platform=Win98
Win32=true
[Mozilla/5.0 (Windows; *; Windows NT 5.0; *; rv:1.*) Gecko/* Firefox/2.0*]
Parent=Firefox 2.0
Platform=Win2000
Win32=true
[Mozilla/5.0 (Windows; *; Windows NT 5.1; *; rv:1.8*) Gecko/* Firefox/2.0*]
Parent=Firefox 2.0
Platform=WinXP
Win32=true
[Mozilla/5.0 (Windows; *; Windows NT 5.2; *; rv:1.8*) Gecko/* Firefox/2.0*]
Parent=Firefox 2.0
Platform=Win2003
Win32=true
[Mozilla/5.0 (Windows; *; Windows NT 6.0; *; rv:1.8*) Gecko/* Firefox/2.0*]
Parent=Firefox 2.0
Platform=WinVista
Win32=true
[Mozilla/5.0 (Windows; *; WinNT4.0; *; rv:1.8*) Gecko/* Firefox/2.0*]
Parent=Firefox 2.0
Platform=WinNT
Win32=true
[Mozilla/5.0 (X11; *; *Linux*; *; rv:1.8*) Gecko/* Firefox/2.0*]
Parent=Firefox 2.0
Platform=Linux
[Mozilla/5.0 (X11; *; FreeBSD*; *; rv:1.8*) Gecko/* Firefox/2.0*]
Parent=Firefox 2.0
Platform=FreeBSD
[Mozilla/5.0 (X11; *; HP-UX*; *; rv:1.8*) Gecko/* Firefox/2.0*]
Parent=Firefox 2.0
Platform=HP-UX
[Mozilla/5.0 (X11; *; IRIX64*; *; rv:1.8*) Gecko/* Firefox/2.0*]
Parent=Firefox 2.0
Platform=IRIX64
[Mozilla/5.0 (X11; *; OpenBSD*; *; rv:1.8*) Gecko/* Firefox/2.0*]
Parent=Firefox 2.0
Platform=OpenBSD
[Mozilla/5.0 (X11; *; SunOS*; *; rv:1.8*) Gecko/* Firefox/2.0*]
Parent=Firefox 2.0
Platform=SunOS
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Firefox 3.0 Alpha
[Firefox 3.0]
Parent=DefaultProperties
Browser=Firefox
Version=3.0
MajorVer=3
Alpha=true
Frames=true
IFrames=true
Tables=true
Cookies=true
JavaApplets=true
JavaScript=true
CSS=2
CssVersion=2
supportsCSS=true
[Mozilla/5.0 (Macintosh; *; *Mac OS X*; *; rv:1.9*) Gecko/* Firefox/3.0*]
Parent=Firefox 3.0
Platform=MacOSX
[Mozilla/5.0 (Windows; *; Windows NT 5.1; *; rv:1.9*) Gecko/* Firefox/3.0*]
Parent=Firefox 3.0
Platform=WinXP
Win32=true
[Mozilla/5.0 (Windows; *; Windows NT 5.2; *; rv:1.9*) Gecko/* Firefox/3.0*]
Parent=Firefox 3.0
Platform=Win2003
Win32=true
[Mozilla/5.0 (Windows; *; Windows NT 6.0; *; rv:1.9*) Gecko/* Firefox/3.0*]
Parent=Firefox 3.0
Platform=WinVista
Win32=true
[Mozilla/5.0 (Windows; *; WinNT4.0; *; rv:1.9*) Gecko/* Firefox/3.0*]
Parent=Firefox 3.0
Platform=WinNT
Win32=true
[Mozilla/5.0 (Windows; U; Windows NT 5.1 x64; *; rv:1.9*) Gecko/* Firefox/3.0*]
Parent=Firefox 3.0
Platform=WinXP
Win32=false
Win64=true
[Mozilla/5.0 (Windows; U; Windows NT 5.2 x64; *; rv:1.9*) Gecko/* Firefox/3.0*]
Parent=Firefox 3.0
Platform=Win2003
Win32=false
Win64=true
[Mozilla/5.0 (X11; *; *Linux*; *; rv:1.9*) Gecko/* Firefox/3.0*]
Parent=Firefox 3.0
Platform=Linux
[Mozilla/5.0 (X11; *; FreeBSD*; *; rv:1.9*) Gecko/* Firefox/3.0*]
Parent=Firefox 3.0
Platform=FreeBSD
[Mozilla/5.0 (X11; *; HP-UX*; *; rv:1.9*) Gecko/* Firefox/3.0*]
Parent=Firefox 3.0
Platform=HP-UX
[Mozilla/5.0 (X11; *; IRIX64*; *; rv:1.9*) Gecko/* Firefox/3.0*]
Parent=Firefox 3.0
Platform=IRIX64
[Mozilla/5.0 (X11; *; OpenBSD*; *; rv:1.9*) Gecko/* Firefox/3.0*]
Parent=Firefox 3.0
Platform=OpenBSD
[Mozilla/5.0 (X11; *; SunOS*; *; rv:1.9*) Gecko/* Firefox/3.0*]
Parent=Firefox 3.0
Platform=SunOS
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Firefox 3.0 Alpha
[GranParadiso 3.0]
Parent=DefaultProperties
Browser=Firefox
Version=3.0
MajorVer=3
Alpha=true
Frames=true
IFrames=true
Tables=true
Cookies=true
JavaApplets=true
JavaScript=true
CSS=2
CssVersion=2
supportsCSS=true
[Mozilla/5.0 (Macintosh; *; *Mac OS X*; *; rv:1.9*) Gecko/* GranParadiso/3.0*]
Parent=GranParadiso 3.0
Platform=MacOSX
[Mozilla/5.0 (Windows; *; Windows NT 5.1; *; rv:1.9*) Gecko/* GranParadiso/3.0*]
Parent=GranParadiso 3.0
Platform=WinXP
Win32=true
[Mozilla/5.0 (Windows; *; Windows NT 5.2; *; rv:1.9*) Gecko/* GranParadiso/3.0*]
Parent=GranParadiso 3.0
Platform=Win2003
Win32=true
[Mozilla/5.0 (Windows; *; Windows NT 6.0; *; rv:1.9*) Gecko/* GranParadiso/3.0*]
Parent=GranParadiso 3.0
Platform=WinVista
Win32=true
[Mozilla/5.0 (Windows; *; WinNT4.0; *; rv:1.9*) Gecko/* GranParadiso/3.0*]
Parent=GranParadiso 3.0
Platform=WinNT
Win32=true
[Mozilla/5.0 (Windows; U; Windows NT 5.1 x64; *; rv:1.9*) Gecko/* GranParadiso/3.0*]
Parent=GranParadiso 3.0
Platform=WinXP
Win32=false
Win64=true
[Mozilla/5.0 (Windows; U; Windows NT 5.2 x64; *; rv:1.9*) Gecko/* GranParadiso/3.0*]
Parent=GranParadiso 3.0
Platform=Win2003
Win32=false
Win64=true
[Mozilla/5.0 (X11; *; *Linux*; *; rv:1.9*) Gecko/* GranParadiso/3.0*]
Parent=GranParadiso 3.0
Platform=Linux
[Mozilla/5.0 (X11; *; FreeBSD*; *; rv:1.9*) Gecko/* GranParadiso/3.0*]
Parent=GranParadiso 3.0
Platform=FreeBSD
[Mozilla/5.0 (X11; *; HP-UX*; *; rv:1.9*) Gecko/* GranParadiso/3.0*]
Parent=GranParadiso 3.0
Platform=HP-UX
[Mozilla/5.0 (X11; *; IRIX64*; *; rv:1.9*) Gecko/* GranParadiso/3.0*]
Parent=GranParadiso 3.0
Platform=IRIX64
[Mozilla/5.0 (X11; *; OpenBSD*; *; rv:1.9*) Gecko/* GranParadiso/3.0*]
Parent=GranParadiso 3.0
Platform=OpenBSD
[Mozilla/5.0 (X11; *; SunOS*; *; rv:1.9*) Gecko/* GranParadiso/3.0*]
Parent=GranParadiso 3.0
Platform=SunOS
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Firefox 3.0 Alpha
[Minefield 3.0]
Parent=DefaultProperties
Browser=Firefox
Version=3.0
MajorVer=3
Alpha=true
Frames=true
IFrames=true
Tables=true
Cookies=true
JavaApplets=true
JavaScript=true
CSS=2
CssVersion=2
supportsCSS=true
[Mozilla/5.0 (Macintosh; *; *Mac OS X*; *; rv:1.9*) Gecko/* Minefield/3.0*]
Parent=Minefield 3.0
Platform=MacOSX
[Mozilla/5.0 (Windows; *; Windows NT 5.1; *; rv:1.9*) Gecko/* Minefield/3.0*]
Parent=Minefield 3.0
Platform=WinXP
Win32=true
[Mozilla/5.0 (Windows; *; Windows NT 5.2; *; rv:1.9*) Gecko/* Minefield/3.0*]
Parent=Minefield 3.0
Platform=Win2003
Win32=true
[Mozilla/5.0 (Windows; *; Windows NT 6.0; *; rv:1.9*) Gecko/* Minefield/3.0*]
Parent=Minefield 3.0
Platform=WinVista
Win32=true
[Mozilla/5.0 (Windows; *; WinNT4.0; *; rv:1.9*) Gecko/* Minefield/3.0*]
Parent=Minefield 3.0
Platform=WinNT
Win32=true
[Mozilla/5.0 (Windows; U; Windows NT 5.1 x64; *; rv:1.9*) Gecko/* Minefield/3.0*]
Parent=Minefield 3.0
Platform=WinXP
Win32=false
Win64=true
[Mozilla/5.0 (Windows; U; Windows NT 5.2 x64; *; rv:1.9*) Gecko/* Minefield/3.0*]
Parent=Minefield 3.0
Platform=Win2003
Win32=false
Win64=true
[Mozilla/5.0 (X11; *; *Linux*; *; rv:1.9*) Gecko/* Minefield/3.0*]
Parent=Minefield 3.0
Platform=Linux
[Mozilla/5.0 (X11; *; FreeBSD*; *; rv:1.9*) Gecko/* Minefield/3.0*]
Parent=Minefield 3.0
Platform=FreeBSD
[Mozilla/5.0 (X11; *; HP-UX*; *; rv:1.9*) Gecko/* Minefield/3.0*]
Parent=Minefield 3.0
Platform=HP-UX
[Mozilla/5.0 (X11; *; IRIX64*; *; rv:1.9*) Gecko/* Minefield/3.0*]
Parent=Minefield 3.0
Platform=IRIX64
[Mozilla/5.0 (X11; *; OpenBSD*; *; rv:1.9*) Gecko/* Minefield/3.0*]
Parent=Minefield 3.0
Platform=OpenBSD
[Mozilla/5.0 (X11; *; SunOS*; *; rv:1.9*) Gecko/* Minefield/3.0*]
Parent=Minefield 3.0
Platform=SunOS
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Phoenix
[Phoenix]
Parent=DefaultProperties
Browser=Phoenix
Frames=true
IFrames=true
Tables=true
Cookies=true
JavaApplets=true
JavaScript=true
CSS=2
CssVersion=2
supportsCSS=true
[Mozilla/5.0 (Windows; *; Win 9x 4.90; *; rv:1.4*) Gecko/* Phoenix/0.5*]
Parent=Phoenix
Version=0.5
MajorVer=0
MinorVer=5
Platform=WinME
Win32=true
[Mozilla/5.0 (Windows; *; Win98; *; rv:1.4*) Gecko/* Phoenix/0.5*]
Parent=Phoenix
Version=0.5
MajorVer=0
MinorVer=5
Platform=Win98
Win32=true
[Mozilla/5.0 (Windows; *; Windows NT 5.0*; *; rv:1.4*) Gecko/* Phoenix/0.5*]
Parent=Phoenix
Version=0.5
MajorVer=0
MinorVer=5
Platform=Win2000
Win32=true
[Mozilla/5.0 (Windows; *; Windows NT 5.1; *; rv:1.4*) Gecko/* Phoenix/0.5*]
Parent=Phoenix
Version=0.5
MajorVer=0
MinorVer=5
Platform=WinXP
Win32=true
[Mozilla/5.0 (Windows; *; Windows NT 5.2*; *; rv:1.4*) Gecko/* Phoenix/0.5*]
Parent=Phoenix
Version=0.5
MajorVer=0
MinorVer=5
Platform=Win2003
Win32=true
[Mozilla/5.0 (X11; *; Linux*; *; rv:1.4*) Gecko/* Phoenix/0.5*]
Parent=Phoenix
Version=0.5
MajorVer=0
MinorVer=5
Platform=Linux
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; SeaMonkey 1.0
[SeaMonkey 1.0]
@ -16254,11 +8025,11 @@ Platform=Linux
Parent=SeaMonkey 1.0
Platform=SunOS
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Seamonkey 1.1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; SeaMonkey 1.1
[SeaMonkey 1.1]
Parent=DefaultProperties
Browser=Seamonkey
Browser=SeaMonkey
Version=1.1
MajorVer=1
MinorVer=1
@ -16274,43 +8045,43 @@ CssVersion=2
supportsCSS=true
[Mozilla/5.0 (Macintosh; ?; *Mac OS X*; *; rv:1.8*) Gecko/* SeaMonkey/1.1*]
Parent=Seamonkey 1.1
Parent=SeaMonkey 1.1
Platform=MacOSX
[Mozilla/5.0 (Windows; ?; Win 9x 4.90; *; rv:1.8*) Gecko/* SeaMonkey/1.1*]
Parent=Seamonkey 1.1
Parent=SeaMonkey 1.1
Platform=WinME
[Mozilla/5.0 (Windows; ?; Win98; *; rv:1.8*) Gecko/* SeaMonkey/1.1*]
Parent=Seamonkey 1.1
Parent=SeaMonkey 1.1
Platform=Win98
[Mozilla/5.0 (Windows; ?; Windows NT 5.0; *; rv:1.8*) Gecko/* SeaMonkey/1.1*]
Parent=Seamonkey 1.1
Parent=SeaMonkey 1.1
Platform=Win2000
[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *; rv:1.8*) Gecko/* SeaMonkey/1.1*]
Parent=Seamonkey 1.1
Parent=SeaMonkey 1.1
Platform=WinXP
[Mozilla/5.0 (Windows; ?; Windows NT 5.2; *; rv:1.8*) Gecko/* SeaMonkey/1.1*]
Parent=Seamonkey 1.1
Parent=SeaMonkey 1.1
Platform=Win2003
[Mozilla/5.0 (Windows; ?; Windows NT 6.0; *; rv:1.8*) Gecko/* SeaMonkey/1.1*]
Parent=Seamonkey 1.1
Parent=SeaMonkey 1.1
Platform=WinVista
[Mozilla/5.0 (X11; ?; FreeBSD*; *; rv:1.8*) Gecko/* SeaMonkey/1.1*]
Parent=Seamonkey 1.1
Parent=SeaMonkey 1.1
Platform=FreeBSD
[Mozilla/5.0 (X11; ?; Linux*; *; rv:1.8*) Gecko/20060221 SeaMonkey/1.1*]
Parent=Seamonkey 1.1
Parent=SeaMonkey 1.1
Platform=Linux
[Mozilla/5.0 (X11; ?; SunOS*; *; rv:1.8*) Gecko/* SeaMonkey/1.1*]
Parent=Seamonkey 1.1
Parent=SeaMonkey 1.1
Platform=SunOS
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Iceweasel
@ -16330,118 +8101,18 @@ CSS=2
CssVersion=2
supportsCSS=true
[Mozilla/5.0 (X11; U; Linux*; *; rv:1.8*) Gecko/* Iceweasel/2.0* (Debian-*)]
Parent=Iceweasel
Version=2.0
MajorVer=2
MinorVer=0
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Mozilla 1.0
[Mozilla 1.0]
Parent=DefaultProperties
Browser=Mozilla
Version=1.0
MajorVer=1
Beta=true
Frames=true
IFrames=true
Tables=true
Cookies=true
JavaApplets=true
JavaScript=true
CSS=2
CssVersion=2
supportsCSS=true
[Mozilla/5.0 (*rv:1.0.*) Gecko/*]
Parent=Mozilla 1.0
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Mozilla 1.1
[Mozilla 1.1]
Parent=DefaultProperties
Browser=Mozilla
Version=1.1
MajorVer=1
MinorVer=1
Beta=true
Frames=true
IFrames=true
Tables=true
Cookies=true
JavaApplets=true
JavaScript=true
CSS=2
CssVersion=2
supportsCSS=true
[Mozilla/5.0 (*rv:1.1.*) Gecko/*]
Parent=Mozilla 1.1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Mozilla 1.2
[Mozilla 1.2]
Parent=DefaultProperties
Browser=Mozilla
Version=1.2
MajorVer=1
MinorVer=2
Beta=true
Frames=true
IFrames=true
Tables=true
Cookies=true
JavaApplets=true
JavaScript=true
CSS=2
CssVersion=2
supportsCSS=true
[Mozilla/5.0 (*rv:1.2.*) Gecko/*]
Parent=Mozilla 1.2
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Mozilla 1.3
[Mozilla 1.3]
Parent=DefaultProperties
Browser=Mozilla
Version=1.3
MajorVer=1
MinorVer=3
Beta=true
Frames=true
IFrames=true
Tables=true
Cookies=true
JavaApplets=true
JavaScript=true
CSS=2
CssVersion=2
supportsCSS=true
[Mozilla/5.0 (*rv:1.3.*) Gecko/*]
Parent=Mozilla 1.3
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Mozilla 1.4
[Mozilla 1.4]
Parent=DefaultProperties
Browser=Mozilla
Version=1.4
MajorVer=1
MinorVer=4
Beta=true
Frames=true
IFrames=true
Tables=true
Cookies=true
JavaApplets=true
JavaScript=true
CSS=2
CssVersion=2
supportsCSS=true
[Mozilla/5.0 (*rv:1.4*) Gecko/*]
Parent=Mozilla 1.4
@ -17648,57 +9319,6 @@ Platform=WinVista
netCLR=true
ClrVersion=2
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Avant Browser
[Avant Browser]
Parent=DefaultProperties
Browser=Avant Browser
Frames=true
IFrames=true
Tables=true
Cookies=true
BackgroundSounds=true
CDF=true
VBScript=true
JavaApplets=true
JavaScript=true
ActiveXControls=true
CSS=2
CssVersion=2
supportsCSS=true
[Advanced Browser (http://www.avantbrowser.com)]
Parent=Avant Browser
[Avant Browser*]
Parent=Avant Browser
[Avant Browser/*]
Parent=Avant Browser
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; IE 4.01
[IE 4.01]
Parent=DefaultProperties
Browser=IE
Version=4.01
MajorVer=4
MinorVer=01
Win32=true
Frames=true
IFrames=true
Tables=true
Cookies=true
BackgroundSounds=true
CDF=true
VBScript=true
JavaApplets=true
JavaScript=true
ActiveXControls=true
CSS=2
CssVersion=2
supportsCSS=true
[Mozilla/?.* (?compatible; *MSIE 4.01*)*]
Parent=IE 4.01
@ -17726,28 +9346,6 @@ Platform=Win2000
Parent=IE 4.01
Platform=WinME
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; IE 5.0
[IE 5.0]
Parent=DefaultProperties
Browser=IE
Version=5.0
MajorVer=5
Win32=true
Frames=true
IFrames=true
Tables=true
Cookies=true
BackgroundSounds=true
CDF=true
VBScript=true
JavaApplets=true
JavaScript=true
ActiveXControls=true
CSS=2
CssVersion=2
supportsCSS=true
[Mozilla/?.* (?compatible; *MSIE 5.0*)*]
Parent=IE 5.0
@ -17805,29 +9403,6 @@ Platform=Win2000
netCLR=true
ClrVersion=1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; IE 5.01
[IE 5.01]
Parent=DefaultProperties
Browser=IE
Version=5.01
MajorVer=5
MinorVer=01
Win32=true
Frames=true
IFrames=true
Tables=true
Cookies=true
BackgroundSounds=true
CDF=true
VBScript=true
JavaApplets=true
JavaScript=true
ActiveXControls=true
CSS=2
CssVersion=2
supportsCSS=true
[Mozilla/?.* (?compatible; *MSIE 5.01*)*]
Parent=IE 5.01

View File

@ -1,9 +1,18 @@
<?php
/**
* @package sapphire
* @subpackage misc
*/
/**
*/
require_once 'HTML/HTMLBBCodeParser.php';
/**
* Dummy class that filters need to extend from.
*/
* Dummy class that filters need to extend from.
* @package sapphire
* @subpackage misc
*/
class SSHTMLBBCodeParser_Filter extends SSHTMLBBCodeParser
{
}

View File

@ -20,16 +20,21 @@
//
/**
* @package SSHTMLBBCodeParser
* @author Stijn de Reede <sjr@gmx.co.uk>
*/
* @package sapphire
* @subpackage misc
* @author Stijn de Reede <sjr@gmx.co.uk>
*/
/**
*/
require_once 'HTML/BBCodeParser/Filter.php';
/**
* @package sapphire
* @subpackage misc
*/
class SSHTMLBBCodeParser_Filter_Basic extends SSHTMLBBCodeParser_Filter
{

View File

@ -20,16 +20,23 @@
//
/**
* @package SSHTMLBBCodeParser
* @author Stijn de Reede <sjr@gmx.co.uk>
*/
* @package sapphire
* @subpackage misc
* @author Stijn de Reede <sjr@gmx.co.uk>
*/
/**
*/
require_once 'HTML/BBCodeParser/Filter.php';
/**
* @package sapphire
* @subpackage misc
*/
class SSHTMLBBCodeParser_Filter_EmailLinks extends SSHTMLBBCodeParser_Filter
{

View File

@ -20,16 +20,21 @@
//
/**
* @package SSHTMLBBCodeParser
* @author Stijn de Reede <sjr@gmx.co.uk>
*/
* @package sapphire
* @subpackage misc
* @author Stijn de Reede <sjr@gmx.co.uk>
*/
/**
*/
require_once 'HTML/BBCodeParser/Filter.php';
/**
* @package sapphire
* @subpackage misc
*/
class SSHTMLBBCodeParser_Filter_Extended extends SSHTMLBBCodeParser_Filter
{

View File

@ -20,11 +20,19 @@
//
/**
* @package SSHTMLBBCodeParser
* @author Stijn de Reede <sjr@gmx.co.uk>
*/
* @package sapphire
* @subpackage misc
* @author Stijn de Reede <sjr@gmx.co.uk>
*/
/**
*/
require_once 'HTML/BBCodeParser/Filter.php';
/**
* @package sapphire
* @subpackage misc
*/
class SSHTMLBBCodeParser_Filter_Images extends SSHTMLBBCodeParser_Filter
{

View File

@ -20,13 +20,18 @@
//
/**
* @package SSHTMLBBCodeParser
* @author Stijn de Reede <sjr@gmx.co.uk>
*/
* @package sapphire
* @subpackage misc
* @author Stijn de Reede <sjr@gmx.co.uk>
*/
/**
*/
require_once 'HTML/BBCodeParser/Filter.php';
/**
*
* @package sapphire
* @subpackage misc
*/
class SSHTMLBBCodeParser_Filter_Links extends SSHTMLBBCodeParser_Filter
{

View File

@ -21,14 +21,18 @@
/**
* @package SSHTMLBBCodeParser
* @author Stijn de Reede <sjr@gmx.co.uk>
*/
* @package sapphire
* @subpackage misc
* @author Stijn de Reede <sjr@gmx.co.uk>
*/
/**
*/
require_once 'HTML/BBCodeParser/Filter.php';
/**
*
* @package sapphire
* @subpackage misc
*/
class SSHTMLBBCodeParser_Filter_Lists extends SSHTMLBBCodeParser_Filter
{

View File

@ -1,4 +1,10 @@
<?php
/**
* @package sapphire
* @subpackage misc
*/
/* vim: set expandtab tabstop=4 shiftwidth=4: */
// +----------------------------------------------------------------------+
// | PHP Version 4 |
@ -21,40 +27,38 @@
// Modified by SilverStripe www.silverstripe.com
/**
* @package SSHTMLBBCodeParser
* @author Stijn de Reede <sjr@gmx.co.uk> , SilverStripe
*
*
* This is a parser to replace UBB style tags with their html equivalents. It
* does not simply do some regex calls, but is complete stack based
* parse engine. This ensures that all tags are properly nested, if not,
* extra tags are added to maintain the nesting. This parser should only produce
* xhtml 1.0 compliant code. All tags are validated and so are all their attributes.
* It should be easy to extend this parser with your own tags, see the _definedTags
* format description below.
*
*
* Usage:
* $parser = new SSHTMLBBCodeParser();
* $parser->setText('normal [b]bold[/b] and normal again');
* $parser->parse();
* echo $parser->getParsed();
* or:
* $parser = new SSHTMLBBCodeParser();
* echo $parser->qparse('normal [b]bold[/b] and normal again');
* or:
* echo SSHTMLBBCodeParser::staticQparse('normal [b]bold[/b] and normal again');
*
*
* Setting the options from the ini file:
* $config = parse_ini_file('BBCodeParser.ini', true);
* $options = &PEAR::getStaticProperty('SSHTMLBBCodeParser', '_options');
* $options = $config['SSHTMLBBCodeParser'];
* unset($options);
*
*
*/
* @package sapphire
* @subpackage misc
* @author Stijn de Reede <sjr@gmx.co.uk> , SilverStripe
*
*
* This is a parser to replace UBB style tags with their html equivalents. It
* does not simply do some regex calls, but is complete stack based
* parse engine. This ensures that all tags are properly nested, if not,
* extra tags are added to maintain the nesting. This parser should only produce
* xhtml 1.0 compliant code. All tags are validated and so are all their attributes.
* It should be easy to extend this parser with your own tags, see the _definedTags
* format description below.
*
*
* Usage:
* $parser = new SSHTMLBBCodeParser();
* $parser->setText('normal [b]bold[/b] and normal again');
* $parser->parse();
* echo $parser->getParsed();
* or:
* $parser = new SSHTMLBBCodeParser();
* echo $parser->qparse('normal [b]bold[/b] and normal again');
* or:
* echo SSHTMLBBCodeParser::staticQparse('normal [b]bold[/b] and normal again');
*
*
* Setting the options from the ini file:
* $config = parse_ini_file('BBCodeParser.ini', true);
* $options = &PEAR::getStaticProperty('SSHTMLBBCodeParser', '_options');
* $options = $config['SSHTMLBBCodeParser'];
* unset($options);
*/
class SSHTMLBBCodeParser
{
/**
@ -323,7 +327,7 @@ class SSHTMLBBCodeParser
* $_preparsed variable. The method uses _buildTag() to check if a tag is
* valid and to build the actual tag to be added to the tag array.
*
* TODO: - rewrite whole method, as this one is old and probably slow
* @todo: - rewrite whole method, as this one is old and probably slow
* - see if a recursive method would be better than an iterative one
*
* @return none

View File

@ -1,4 +1,10 @@
<?php
/**
* @package sapphire
* @subpackage misc
*/
/********************************************************************************\
* Copyright (C) Carl Taylor (cjtaylor@adepteo.com) *
* Copyright (C) Torben Nehmer (torben@nehmer.net) for Code Cleanup *
@ -6,6 +12,12 @@
\********************************************************************************/
/// Enable multiple timers to aid profiling of performance over sections of code
/**
* Execution time profiler.
* @package sapphire
* @subpackage misc
*/
class Profiler {
var $description;
var $startTime;

View File

@ -1,6 +1,14 @@
<?php
/**
* Standard basical search form
* @package sapphire
* @subpackage search
*/
/**
* More advanced search form
* @package sapphire
* @subpackage search
*/
class AdvancedSearchForm extends SearchForm {
@ -11,27 +19,27 @@ class AdvancedSearchForm extends SearchForm {
if(!$fields) {
$fields = new FieldSet(
$searchBy = new CompositeField(
new HeaderField("SEARCH BY"),
new TextField("+", "All Words"),
new TextField("quote", "Exact Phrase"),
new TextField("any", "At Least One Of the Words"),
new TextField("-", "Without the Words")
new HeaderField(_t('AdvancedSearchForm.SEARCHBY', 'SEARCH BY')),
new TextField("+", _t('AdvancedSearchForm.ALLWORDS', 'All Words')),
new TextField("quote", _t('AdvancedSearchForm.EXACT', 'Exact Phrase')),
new TextField("any", _t('AdvancedSearchForm.ATLEAST', 'At Least One Of the Words')),
new TextField("-", _t('AdvancedSearchForm.WITHOUT', 'Without the Words'))
),
$sortBy = new CompositeField(
new HeaderField("SORT RESULTS BY"),
new HeaderField(_t('AdvancedSearchForm.SORTBY', 'SORT RESULTS BY')),
new OptionsetField("sortby", "",
array(
'Relevance' =>'Relevance',
'LastUpdated' => 'Last Updated',
'PageTitle' => 'Page Title',
'Relevance' => _t('AdvancedSearchForm.RELEVANCE', 'Relevance'),
'LastUpdated' => _t('AdvancedSearchForm.LASTUPDATED', 'Last Updated'),
'PageTitle' => _t('AdvancedSearchForm.PAGETITLE', 'Page Title'),
),
'Relevance'
)
),
$chooseDate = new CompositeField(
new HeaderField("LAST UPDATED"),
new CompositeDateField("From", "From"),
new CompositeDateField("To", "To")
new HeaderField(_t('AdvancedSearchForm.LASTUPDATEDHEADER', 'LAST UPDATED')),
new CompositeDateField("From", _t('AdvancedSearchForm.FROM', 'From')),
new CompositeDateField("To", _t('AdvancedSearchForm.TO', 'To'))
)
);
@ -43,7 +51,7 @@ class AdvancedSearchForm extends SearchForm {
if(!$actions) {
$actions = new FieldSet(
new FormAction("results", "Go")
new FormAction("results", _t('AdvancedSearchForm.GO', 'Go'))
);
}
parent::__construct($controller, $name, $fields, $actions);

View File

@ -1,8 +1,15 @@
<?php
/**
* Standard basic search form
* @package sapphire
* @subpackage search
*/
/**
* Standard basic search form
* @package sapphire
* @subpackage search
*/
class SearchForm extends Form {
protected $showInSearchTurnOn;
@ -14,11 +21,11 @@ class SearchForm extends Form {
$this->showInSearchTurnOn = $showInSearchTurnOn;
if(!$fields) {
$fields = new FieldSet(new TextField("Search", "Search"));
$fields = new FieldSet(new TextField("Search", _t('SearchForm.SEARCH', 'Search')));
}
if(!$actions) {
$actions = new FieldSet(
new FormAction("getResults", "Go")
new FormAction("getResults", _t('SearchForm.GO', 'Go'))
);
}
@ -176,7 +183,7 @@ class SearchForm extends Form {
if(isset($objects)) $doSet = new DataObjectSet($objects);
else $doSet = new DataObjectSet();
$doSet->setPageLimits(isset($_GET['start']) ? (int)$_GET['start'] : 0, $numPerPage, $totalCount);
$doSet->setPageLimits($start, $numPerPage, $totalCount);
return $doSet;

View File

@ -1,4 +1,10 @@
<?php
/**
* @package sapphire
* @subpackage security
*/
/**
* Abstract base class for an authentication method
*
@ -6,6 +12,8 @@
* methods like {@link MemberAuthenticator} or {@link OpenIDAuthenticator}.
*
* @author Markus Lanthaler <markus@silverstripe.com>
* @package sapphire
* @subpackage security
*/
abstract class Authenticator extends Object {

View File

@ -1,7 +1,14 @@
<?php
/**
* @package sapphire
* @subpackage security
*/
/**
* Provides an interface to HTTP basic authentication.
* @package sapphire
* @subpackage security
*/
class BasicAuth extends Object {
/**
@ -10,10 +17,15 @@ class BasicAuth extends Object {
*/
static function requireLogin($realm, $permissionCode) {
if(self::$disabled) return true;
if(!Security::database_is_ready()) return true;
if(isset($_SERVER['PHP_AUTH_USER']) && isset($_SERVER['PHP_AUTH_PW'])) {
$member = Security::authenticate($_SERVER['PHP_AUTH_USER'], $_SERVER['PHP_AUTH_PW']);
$member = MemberAuthenticator::authenticate(array(
'Email' => $_SERVER['PHP_AUTH_USER'],
'Password' => $_SERVER['PHP_AUTH_PW'],
), null);
if($member) {
$authenticated = true;
}

View File

@ -1,12 +1,14 @@
<?php
/**
* Change password form
* @package sapphire
* @subpackage security
*/
/**
* Standard Change Password Form
* @package sapphire
* @subpackage security
*/
class ChangePasswordForm extends Form {
@ -26,7 +28,7 @@ class ChangePasswordForm extends Form {
function __construct($controller, $name, $fields = null, $actions = null) {
if(!$fields) {
$fields = new FieldSet();
if(Member::currentUser()) {
if(Member::currentUser() && (!isset($_REQUEST['h']) || !Member::autoLoginHash($_REQUEST['h']))) {
$fields->push(new EncryptField("OldPassword",_t('Member.YOUROLDPASSWORD', "Your old password")));
}

View File

@ -1,23 +1,27 @@
<?php
/* Geoip.php
Known to work with the following versions of GeoIP:
- GEO-106FREE 20030401 Build 1 Copyright (c) 2003 MaxMind.com All Rights Reserved
- GEO-106FREE 20030803 Build 1 Copyright (c) 2003 MaxMind LLC All Rights Reserved
Routines for DNS to country resolution;
/**
* @package sapphire
* @subpackage misc
*/
// convert address (either ip or domainname) to country.
// returns false if IP address not found / not known;
// otherwise an array
// set $codeOnly to true if you just want the country code
// give a default for IP/
/**
* Routines for DNS to country resolution
*
* - convert address (either ip or domainname) to country.
* - returns false if IP address not found / not known;
* - otherwise an array
* - set $codeOnly to true if you just want the country code
* - give a default for IP
*
* @package sapphire
* @subpackage misc
*/
class Geoip extends Object {
public static $default_country_code = false;
/** ISO 3166 Country Codes **/
/**
* Includes additional codes for Europe,
@ -308,7 +312,11 @@ class Geoip extends Object {
if ($start) $start+=2;
$code = substr($country, $start, 2); // skip space
}
if ($code == 'IP' || $code == '--') return false;
if ($code == 'IP' || $code == '--') {
if (self::$default_country_code) $code = self::$default_country_code;
else return false;
}
if(!$codeOnly) {
$name = substr($country, $start+4);
@ -390,4 +398,4 @@ class Geoip extends Object {
}
}
?>
?>

View File

@ -1,5 +1,15 @@
<?php
/**
* @package sapphire
* @subpackage security
*/
/**
* A security group.
* @package sapphire
* @subpackage security
*/
class Group extends DataObject {
// This breaks too many things for upgraded sites
// static $default_sort = "Sort";
@ -167,7 +177,33 @@ class Group extends DataObject {
$this->setCode($this->Title);
}
}
public function canEdit() {
if($this->hasMethod('alternateCanEdit')) return $this->alternateCanEdit();
else return Member::currentUserID() ? true : false;
}
/**
* Returns all of the children for the CMS Tree.
* Filters to only those groups that the current user can edit
*/
function AllChildrenIncludingDeleted() {
$children = $this->extInstance('Hierarchy')->AllChildrenIncludingDeleted();
$filteredChildren = new DataObjectSet();
if($children) foreach($children as $child) {
if($child->canEdit()) $filteredChildren->push($child);
}
return $filteredChildren;
}
}
/**
* A group representing everyone, including users not logged in.
* @package sapphire
* @subpackage security
*/
class Group_Unsecure extends Group {
}
?>

View File

@ -1,13 +1,11 @@
<?php
/**
* LoginForm base class
*
* @author Markus Lanthaler <markus@silverstripe.com>
* @package sapphire
* @subpackage security
*/
/**
* Abstract base class for a login form
*
@ -15,6 +13,8 @@
* {@link MemberLoginForm} or {@link OpenIDLoginForm}.
*
* @author Markus Lanthaler <markus@silverstripe.com>
* @package sapphire
* @subpackage security
*/
abstract class LoginForm extends Form {
function __construct($controller, $name, $fields, $actions) {

View File

@ -2,12 +2,14 @@
/**
* Member classes
* @package sapphire
* @subpackage security
*/
/**
* The member class which represents the users of the system
* @package sapphire
* @subpackage security
*/
class Member extends DataObject {
@ -51,6 +53,8 @@ class Member extends DataObject {
);
static $notify_password_change = false;
/**
* This method is used to initialize the static database members
*
@ -85,6 +89,14 @@ class Member extends DataObject {
return ($this->Password === $encryption_details['password']);
}
/**
* Regenerate the session_id.
* This wrapper is here to make it easier to disable calls to session_regenerate_id(), should you need to. They have caused problems in certain
* quirky problems (such as using the Windmill 0.3.6 proxy).
*/
static function session_regenerate_id() {
session_regenerate_id(true);
}
/**
* Logs this member in
@ -93,7 +105,8 @@ class Member extends DataObject {
* automatically the next time.
*/
function logIn($remember = false) {
session_regenerate_id(true);
self::session_regenerate_id();
Session::set("loggedInAs", $this->ID);
$this->NumVisit++;
@ -130,7 +143,7 @@ class Member extends DataObject {
}
if($member) {
session_regenerate_id(true);
self::session_regenerate_id();
Session::set("loggedInAs", $member->ID);
$token = substr(md5(uniqid(rand(), true)), 0, 49 - strlen($member->ID));
@ -149,7 +162,7 @@ class Member extends DataObject {
*/
function logOut() {
Session::clear("loggedInAs");
session_regenerate_id(true);
self::session_regenerate_id();
$this->RememberLoginToken = null;
Cookie::set('alc_enc', null);
@ -213,13 +226,13 @@ class Member extends DataObject {
function sendInfo($type = 'signup', $data = null) {
switch($type) {
case "signup":
$e = new Member_SignupEmail();
$e = Object::create('Member_SignupEmail');
break;
case "changePassword":
$e = new Member_ChangePasswordEmail();
$e = Object::create('Member_ChangePasswordEmail');
break;
case "forgotPassword":
$e = new Member_ForgotPasswordEmail();
$e = Object::create('Member_ForgotPasswordEmail');
break;
}
@ -259,6 +272,48 @@ class Member extends DataObject {
* @return Member_Validator Returns an instance of a
* {@link Member_Validator} object.
*/
function getNewsletterSubscriptions(){
$groups = $this->Groups()->toDropDownMap("ID","ID");
return $groups;
}
/**
* This does some cunning and automatically save the newsletter subscriptions
* by adding and removing the member from the appropriate
* groups based on a checkboxset field.
* This function is called by the form handler
* whenever form->saveInto($member); is called with an
* checkboxsetfield in the data with the name
* "newsletterSubscriptions"
*/
function saveNewsletterSubscriptions($groups){
$checkboxsetfield = new CheckboxSetField(
"NewsletterSubscriptions",
"",
$sourceitems = DataObject::get("NewsletterType")->toDropDownMap("GroupID","Title"),
$selectedgroups = $groups
);
return $this->Groups()->setByCheckboxSetField($checkboxsetfield);
}
function removeAllNewsletterSubscriptions(){
$groups = $this->Groups();
$groupIDs = $groups->getIDList();
$newsletterTypes = DataObject::get("NewsletterType");
if($newsletterTypes&&$newsletterTypes->count()){
foreach($newsletterTypes as $type){
$newsletterGroupIDs[] = $type->GroupID;
}
}
if($newsletterGroupIDs) {
foreach($newsletterGroupIDs as $newsletterGroupID){
if($groupIDs&&in_array($newsletterGroupID, $groupIDs)){
$groups->remove($newsletterGroupID);
}
}
}
}
function getValidator() {
return new Member_Validator();
}
@ -331,7 +386,7 @@ class Member extends DataObject {
*
* @return string Returns a random password.
*/
static function createNewPassword() {
static function create_new_password() {
if(file_exists(Security::get_word_list())) {
$words = file(Security::get_word_list());
@ -395,6 +450,12 @@ class Member extends DataObject {
}
}
if($this->SetPassword) $this->Password = $this->SetPassword;
if(Director::isLive() &&
$this->changed['Password'] && $this->record['Password'] &&
Member::$notify_password_change) $this->sendInfo('changePassword');
parent::onBeforeWrite();
}
@ -421,16 +482,16 @@ class Member extends DataObject {
* @return bool Returns TRUE if the member is in the given group,
* otherwise FALSE.
*/
public function inGroup($groupID) {
foreach($this->Groups() as $group) {
if($groupID == $group->ID)
return true;
}
}
return false;
}
/**
* Alias for {@link inGroup}
*
@ -771,6 +832,8 @@ class Member extends DataObject {
/**
* Special kind of {@link ComponentSet} that has special methods for
* manipulating a user's membership
* @package sapphire
* @subpackage security
*/
class Member_GroupSet extends ComponentSet {
/**
@ -851,7 +914,7 @@ class Member_GroupSet extends ComponentSet {
// else we should be removing all from the necessary groups.
} else {
$remove = $sourceItems;
$remove = array_keys($sourceItems);
}
if($add)
@ -975,6 +1038,11 @@ class Member_GroupSet extends ComponentSet {
/**
* Form for editing a member profile.
* @package sapphire
* @subpackage security
*/
class Member_ProfileForm extends Form {
function __construct($controller, $name, $member) {
@ -1029,6 +1097,8 @@ class Member_ProfileForm extends Form {
/**
* Class used as template to send an email to new members
* @package sapphire
* @subpackage security
*/
class Member_SignupEmail extends Email_Template {
protected $from = ''; // setting a blank from address uses the site's default administrator email
@ -1085,6 +1155,8 @@ class Member_SignupEmail extends Email_Template {
/**
* Class used as template to send an email saying that the password has been
* changed
* @package sapphire
* @subpackage security
*/
class Member_ChangePasswordEmail extends Email_Template {
protected $from = ''; // setting a blank from address uses the site's default administrator email
@ -1101,6 +1173,8 @@ class Member_ChangePasswordEmail extends Email_Template {
/**
* Class used as template to send the forgot password email
* @package sapphire
* @subpackage security
*/
class Member_ForgotPasswordEmail extends Email_Template {
protected $from = ''; // setting a blank from address uses the site's default administrator email
@ -1116,9 +1190,9 @@ class Member_ForgotPasswordEmail extends Email_Template {
/**
* Record to keep track of which records a member has unsubscribed from and
* when
*
* Record to keep track of which records a member has unsubscribed from and when.
* @package sapphire
* @subpackage security
* @todo Check if that email stuff ($from, $to, $subject, $body) is needed
* here! (Markus)
*/
@ -1175,6 +1249,8 @@ class Member_UnsubscribeRecord extends DataObject {
/**
* Member Validator
* @package sapphire
* @subpackage security
*/
class Member_Validator extends RequiredFields {
@ -1213,11 +1289,14 @@ class Member_Validator extends RequiredFields {
// if we are in a complex table field popup, use ctf[childID], else use
// ID
$id = (isset($_REQUEST['ctf']['childID']))
? $_REQUEST['ctf']['childID']
: $_REQUEST['ID'];
if(isset($_REQUEST['ctf']['childID']))
$id = $_REQUEST['ctf']['childID'];
elseif(isset($_REQUEST['ID']))
$id = $_REQUEST['ID'];
else
$id = null;
if(is_object($member) && $member->ID != $id) {
if($id && is_object($member) && $member->ID != $id) {
$emailField = $this->form->dataFieldByName('Email');
$this->validationError($emailField->id(),
_t('Member.VALIDATIONMEMBEREXISTS', "There already exists a member with this email"),

View File

@ -1,17 +1,17 @@
<?php
/**
* Member authenticator
*
* @package sapphire
* @subpackage security
* @author Markus Lanthaler <markus@silverstripe.com>
*/
/**
* Authenticator for the default "member" method
*
* @author Markus Lanthaler <markus@silverstripe.com>
* @package sapphire
* @subpackage security
*/
class MemberAuthenticator extends Authenticator {

View File

@ -1,13 +1,14 @@
<?php
/**
* Log-in form for the "member" authentication method
* @package sapphire
* @subpackage security
*/
/**
* Log-in form for the "member" authentication method
* @package sapphire
* @subpackage security
*/
class MemberLoginForm extends LoginForm {
@ -99,19 +100,19 @@ class MemberLoginForm extends LoginForm {
Session::clear('SessionForms.MemberLoginForm.Email');
Session::clear('SessionForms.MemberLoginForm.Remember');
if($backURL = $_REQUEST['BackURL']) {
if(isset($_REQUEST['BackURL']) && $backURL = $_REQUEST['BackURL']) {
Session::clear("BackURL");
Director::redirect($backURL);
} else {
Director::redirectBack();
Director::redirectBack();
}
} else {
Session::set('SessionForms.MemberLoginForm.Email', $data['Email']);
Session::set('SessionForms.MemberLoginForm.Remember', isset($data['Remember']));
if(isset($_REQUEST['BackURL']) && $backURL = $_REQUEST['BackURL']) {
Session::set('BackURL', $backURL);
}
Session::set('SessionForms.MemberLoginForm.Remember', isset($data['Remember']));
if(isset($_REQUEST['BackURL']) && $backURL = $_REQUEST['BackURL']) {
Session::set('BackURL', $backURL);
}
if($badLoginURL = Session::get("BadLoginURL")) {
Director::redirect($badLoginURL);
@ -197,4 +198,4 @@ class MemberLoginForm extends LoginForm {
}
?>
?>

View File

@ -1,4 +1,15 @@
<?php
/**
* @package sapphire
* @subpackage security
*/
/**
* Represents a permission assigned to a group.
* @package sapphire
* @subpackage security
*/
class Permission extends DataObject {
// the (1) after Type specifies the DB default value which is needed for
@ -423,9 +434,9 @@ class Permission extends DataObject {
? '(select)'
: $blankItemText;
}
$allCodes['ADMIN'] = 'Full administrative rights';
$allCodes['ADMIN'] = _t('Permission.FULLADMINRIGHTS', 'Full administrative rights');
foreach($classes as $class) {
if($classes) foreach($classes as $class) {
$SNG = singleton($class);
$someCodes = $SNG->providePermissions();
if($someCodes) foreach($someCodes as $k => $v) {
@ -435,7 +446,7 @@ class Permission extends DataObject {
$otherPerms = DB::query("SELECT DISTINCT Code From Permission")
->column();
foreach($otherPerms as $otherPerm) {
if($otherPerms) foreach($otherPerms as $otherPerm) {
if(!array_key_exists($otherPerm, $allCodes))
$allCodes[$otherPerm] = $otherPerm;
}
@ -453,7 +464,7 @@ class Permission extends DataObject {
if(!Permission::check('ADMIN'))
Security::permissionFailure();
echo "<h1>The following permission codes are defined</h1>";
echo '<h1>'._t('Permission.PERMSDEFINED', 'The following permission codes are defined').'</h1>';
$codes = self::get_codes();
echo "<pre>";
print_r($codes);
@ -531,6 +542,8 @@ class Permission extends DataObject {
*
* This class is used to group permissions together for showing on an
* interface.
* @package sapphire
* @subpackage security
*/
class Permission_Group {

View File

@ -1,11 +1,17 @@
<?php
/**
* @package sapphire
* @subpackage security
*/
/**
* Special kind of dropdown field that has all permission codes as its dropdown source.
* Note: This would ordinarily be overkill; the main reason we have it is that TableField doesn't let you specify a dropdown source;
* only a classname
* @package sapphire
* @subpackage security
*/
class PermissionDropdownField extends DropdownField {
function __construct($name, $title = "") {
parent::__construct($name, $title, Permission::get_codes(true));

View File

@ -1,8 +1,15 @@
<?php
/**
* @package sapphire
* @subpackage security
*/
/**
* Used to let classes provide new permission codes.
* Every implementor of PermissionProvider is accessed and providePermissions() called to get the full list of permission codes.
* @package sapphire
* @subpackage security
*/
interface PermissionProvider {
/**

View File

@ -1,7 +1,14 @@
<?php
/**
* @package sapphire
* @subpackage security
*/
/**
* Implements a basic security model
* @package sapphire
* @subpackage security
*/
class Security extends Controller {
@ -124,7 +131,7 @@ class Security extends Controller {
if(Member::currentUserID()) {
// user_error( 'PermFailure with member', E_USER_ERROR );
$message = $messageSet['alreadyLoggedIn']
$message = isset($messageSet['alreadyLoggedIn'])
? $messageSet['alreadyLoggedIn']
: $messageSet['default'];
@ -236,7 +243,7 @@ class Security extends Controller {
}
$tmpPage = new Page();
$tmpPage->Title = "Log in";
$tmpPage->Title = _t('Security.LOGIN', 'Log in');
$tmpPage->URLSegment = "Security";
$tmpPage->ID = -1; // Set the page ID to -1 so we dont get the top level pages as its children
@ -627,10 +634,19 @@ class Security extends Controller {
* encryption algorithms.
*/
public static function get_encryption_algorithms() {
// We return all the hashes that don't have commas in the name, as database exports get confused by comma in ENUM keys. :-(
return array(
'md4', 'md5', 'sha1', 'sha256', 'sha384', 'sha512', 'ripemd128', 'ripemd160', 'whirlpool', 'snefru', 'gost', 'alder32', 'crc32', 'crc32b'
);
$result = function_exists('hash_algos') ? hash_algos() : array();
if(count($result) == 0) {
if(function_exists('md5')) $result[] = 'md5';
if(function_exists('sha1')) $result[] = 'sha1';
} else {
foreach ($result as $i => $algorithm) {
if (preg_match('/,/',$algorithm)) {
unset($result[$i]);
}
}
}
return $result;
}
@ -777,16 +793,16 @@ class Security extends Controller {
// Only administrators can run this method
if(!Member::currentUser() || !Member::currentUser()->isAdmin()) {
Security::permissionFailure($this,
"This page is secured and you need administrator rights to access it. " .
"Enter your credentials below and we will send you right along.");
_t('Security.PERMFAILURE',' This page is secured and you need administrator rights to access it.
Enter your credentials below and we will send you right along.'));
return;
}
if(self::$encryptPasswords == false) {
print "<h1>Password encryption disabled!</h1>\n";
print "<p>To encrypt your passwords change your password settings by adding\n";
print "<pre>Security::encrypt_passwords(true);</pre>\nto mysite/_config.php</p>";
print '<h1>'._t('Security.ENCDISABLED1', 'Password encryption disabled!')."</h1>\n";
print '<p>'._t('Security.ENCDISABLED2', 'To encrypt your passwords change your password settings by adding')."\n";
print "<pre>Security::encrypt_passwords(true);</pre>\n"._t('Security.ENCDISABLED3', 'to mysite/_config.php')."</p>";
return;
}
@ -797,20 +813,19 @@ class Security extends Controller {
"PasswordEncryption = 'none' AND Password IS NOT NULL");
if(!$members) {
print "<h1>No passwords to encrypt</h1>\n";
print "<p>There are no members with a clear text password that could be encrypted!</p>\n";
print '<h1>'._t('Security.NOTHINGTOENCRYPT1', 'No passwords to encrypt')."</h1>\n";
print '<p>'._t('Security.NOTHINGTOENCRYPT2', 'There are no members with a clear text password that could be encrypted!')."</p>\n";
return;
}
// Encrypt the passwords...
print "<h1>Encrypting all passwords</h1>";
print '<p>The passwords will be encrypted using the &quot;' .
htmlentities(self::$encryptionAlgorithm) . '&quot; algorithm ';
print '<h1>'._t('Security.ENCRYPT', 'Encrypting all passwords').'</h1>';
print '<p>'.sprintf(_t('Security.ENCRYPTWITH', 'The passwords will be encrypted using the &quot;%s&quot; algorithm'), htmlentities(self::$encryptionAlgorithm));
print (self::$useSalt)
? "with a salt to increase the security.</p>\n"
: "without using a salt to increase the security.</p><p>\n";
? _t('Security.ENCRYPTWITHSALT', 'with a salt to increase the security.')."</p>\n"
: _t('Security.ENCRYPTWITHOUTSALT', 'without using a salt to increase the security.')."</p><p>\n";
foreach($members as $member) {
// Force the update of the member record, as new passwords get
@ -819,9 +834,9 @@ class Security extends Controller {
$member->forceChange();
$member->write();
print " Encrypted credentials for member &quot;";
print htmlentities($member->getTitle()) . '&quot; (ID: ' . $member->ID .
'; E-Mail: ' . htmlentities($member->Email) . ")<br />\n";
print ' '._t('Security.ENCRYPTEDMEMBERS', 'Encrypted credentials for member &quot;');
print htmlentities($member->getTitle()) . '&quot; ('._t('Security.ID', 'ID:').' ' . $member->ID .
'; '._t('Security.EMAIL', 'E-Mail:').' ' . htmlentities($member->Email) . ")<br />\n";
}
print '</p>';

View File

@ -1,4 +1,15 @@
<?php
/**
* @package sapphire
* @subpackage synchronisation
*/
/**
* Synchroniser controller - used to let two servers communicate
* @package sapphire
* @subpackage synchronisation
*/
class Synchronise extends Controller {
public function update() {

View File

@ -1,7 +1,15 @@
<?php
/**
* @package sapphire
* @subpackage synchronisation
*/
/**
* Functions to provide synchronisation between two Silverstripe implementations. This allows the same entry to have two different
* IDs on each installation
* @package sapphire
* @subpackage synchronisation
*/
class Synchronised extends DataObjectDecorator {

View File

@ -1,15 +1,15 @@
<% if ShowPagination %>
<div class="PageControls">
<% if LastLink %><a class="Last" href="$LastLink" title="View last $PageSize members"><img src="cms/images/pagination/record-last.png" alt="View last $PageSize" /></a>
<% else %><span class="Last"><img src="cms/images/pagination/record-last-g.png" alt="View last $PageSize members" /></span><% end_if %>
<% if FirstLink %><a class="First" href="$FirstLink" title="View first $PageSize members"><img src="cms/images/pagination/record-first.png" alt="View first $PageSize" /></a>
<% else %><span class="First"><img src="cms/images/pagination/record-first-g.png" alt="View first $PageSize members" /></span><% end_if %>
<% if PrevLink %><a class="Prev" href="$PrevLink" title="View previous $PageSize members"><img src="cms/images/pagination/record-prev.png" alt="View previous $PageSize" /></a>
<% else %><img class="Prev" src="cms/images/pagination/record-prev-g.png" alt="View previous $PageSize members" /><% end_if %>
<% if LastLink %><a class="Last" href="$LastLink" title="<% _t('VIEWLAST', 'View last') %> $PageSize"><img src="cms/images/pagination/record-last.png" alt="<% _t('VIEWLAST', 'View last') %> $PageSize" /></a>
<% else %><span class="Last"><img src="cms/images/pagination/record-last-g.png" alt="<% _t('VIEWLAST', 'View last') %> $PageSize" /></span><% end_if %>
<% if FirstLink %><a class="First" href="$FirstLink" title="<% _t('VIEWFIRST', 'View first') %> $PageSize"><img src="cms/images/pagination/record-first.png" alt="<% _t('VIEWFIRST', 'View first') %> $PageSize" /></a>
<% else %><span class="First"><img src="cms/images/pagination/record-first-g.png" alt="<% _t('VIEWFIRST', 'View first') %> $PageSize" /></span><% end_if %>
<% if PrevLink %><a class="Prev" href="$PrevLink" title="<% _t('VIEWPREVIOUS', 'View previous') %> $PageSize"><img src="cms/images/pagination/record-prev.png" alt="<% _t('VIEWPREVIOUS', 'View previous') %> $PageSize" /></a>
<% else %><img class="Prev" src="cms/images/pagination/record-prev-g.png" alt="<% _t('VIEWPREVIOUS', 'View previous') %> $PageSize" /><% end_if %>
<span class="Count">
Displaying $FirstItem to $LastItem of $TotalCount
<% _t('DISPLAYING', 'Displaying') %> $FirstItem <% _t('TO', 'to') %> $LastItem <% _t('OF', 'of') %> $TotalCount
</span>
<% if NextLink %><a class="Next" href="$NextLink" title="View next $PageSize members"><img src="cms/images/pagination/record-next.png" alt="View next $PageSize" /></a>
<% else %><img class="Next" src="cms/images/pagination/record-next-g.png" alt="View next $PageSize" /><% end_if %>
<% if NextLink %><a class="Next" href="$NextLink" title="<% _t('VIEWNEXT', 'View next') %> $PageSize"><img src="cms/images/pagination/record-next.png" alt="<% _t('VIEWNEXT', 'View next') %> $PageSize" /></a>
<% else %><img class="Next" src="cms/images/pagination/record-next-g.png" alt="<% _t('VIEWNEXT', 'View next') %> $PageSize" /><% end_if %>
</div>
<% end_if %>

View File

@ -8,4 +8,4 @@
<p>
<% _t('EMAIL') %>: $Email<br />
<% _t('PASSWORD') %>: $CleartextPassword
</p>
</p>

View File

@ -1,4 +1,4 @@
<p><% _t('HELLO', 'Hi') %> $FirstName,</p>
<p>Here's is your <a href="$PasswordResetLink">password reset link</a> for $BaseHref</p>
<p><% _t('TEXT1', 'Here\'s is your') %> <a href="$PasswordResetLink"><% _t('TEXT2', 'password reset link') %></a> <% _t('TEXT3', 'for') %> $BaseHref</p>

View File

@ -1,9 +0,0 @@
<?php
class InstallerTest extends Controller {
function testRewrite() {
echo "OK";
}
}
?>

View File

@ -1,170 +0,0 @@
<?php
/*
$dir = dirname(dirname((__FILE__)));
$_SERVER['SCRIPT_FILENAME'] = "$dir/main.php";
chdir($dir);
require_once 'core/Core.php';
require_once("core/ManifestBuilder.php");
require_once("core/ClassInfo.php");
require_once('core/Object.php');
require_once('core/control/Director.php');
require_once('filesystem/Filesystem.php');
require_once("core/Session.php");
$envFiles = array('../_ss_environment.php', '../../_ss_environment.php', '../../../_ss_environment.php');
foreach($envFiles as $envFile) {
if(@file_exists($envFile)) {
include($envFile);
break;
}
}
require_once(MANIFEST_FILE);
print_r($_CLASS_MANIFEST);
if(ManifestBuilder::staleManifest()) ManifestBuilder::compileManifest();
require_once(MANIFEST_FILE);
*/
// Check that PHPUnit is installed
$hasPhpUnit = false;
$paths = explode(PATH_SEPARATOR, ini_get('include_path'));
foreach($paths as $path) {
if(@file_exists("$path/PHPUnit/Framework.php")) $hasPhpUnit = true;
}
if($hasPhpUnit) {
require_once 'PHPUnit/Framework.php';
/**
* Test case class for the Sapphire framework.
* Sapphire unit testing is based on PHPUnit, but provides a number of hooks into our data model that make it easier to work with.
*/
class SapphireTest extends PHPUnit_Framework_TestCase {
function setUp() {
// Create a temporary database
$dbConn = DB::getConn();
$dbname = 'tmpdb' . rand(1000000,9999999);
while(!$dbname || $dbConn->databaseExists($dbname)) {
$dbname = 'tmpdb' . rand(1000000,9999999);
}
$dbConn->selectDatabase($dbname);
// This code is a bit misplaced; we want some way of the whole session being reinitialised...
Versioned::reading_stage(null);
$dbConn->createDatabase();
singleton('DataObject')->flushCache();
$dbadmin = new DatabaseAdmin();
$dbadmin->doBuild(true, false);
// Load the fixture into the database
$className = get_class($this);
$fixtureFile = eval("return {$className}::\$fixture_file;");
$this->loadFixture($fixtureFile);
}
/**
* Array of
*/
protected $fixtureDictionary;
/**
* Get the ID of an object from the fixture.
* @param $className The data class, as specified in your fixture file. Parent classes won't work
* @param $identifier The identifier string, as provided in your fixture file
*/
protected function idFromFixture($className, $identifier) {
return $this->fixtureDictionary[$className][$identifier];
}
/**
* Return all of the IDs in the fixture of a particular class name.
* @return A map of fixture-identifier => object-id
*/
protected function allFixtureIDs($className) {
return $this->fixtureDictionary[$className];
}
/**
* Get an object from the fixture.
* @param $className The data class, as specified in your fixture file. Parent classes won't work
* @param $identifier The identifier string, as provided in your fixture file
*/
protected function objFromFixture($className, $identifier) {
return DataObject::get_by_id($className, $this->idFromFixture($className, $identifier));
}
/**
* Load a YAML fixture file into the database.
* Once loaded, you can use idFromFixture() and objFromFixture() to get items from the fixture
* @param $fixtureFile The location of the .yml fixture file, relative to the site base dir
*/
function loadFixture($fixtureFile) {
$parser = new Spyc();
$fixtureContent = $parser->load(Director::baseFolder().'/'.$fixtureFile);
$this->fixtureDictionary = array();
foreach($fixtureContent as $dataClass => $items) {
foreach($items as $identifier => $fields) {
$obj = new $dataClass();
foreach($fields as $fieldName => $fieldVal) {
if($obj->many_many($fieldName)) {
$items = split(' *, *',trim($fieldVal));
foreach($items as $item) {
$parsedItems[] = $this->parseFixtureVal($item);
}
$obj->write();
$obj->$fieldName()->setByIdList($parsedItems);
} else {
$obj->$fieldName = $this->parseFixtureVal($fieldVal);
}
}
$obj->write();
// Populate the dictionary with the ID
$this->fixtureDictionary[$dataClass][$identifier] = $obj->ID;
}
}
}
/**
* Parse a value from a fixture file. If it starts with => it will get an ID from the fixture dictionary
*/
protected function parseFixtureVal($fieldVal) {
// Parse a dictionary reference - used to set foreign keys
if(substr($fieldVal,0,2) == '=>') {
list($a, $b) = explode('.', substr($fieldVal,2), 2);
return $this->fixtureDictionary[$a][$b];
// Regular field value setting
} else {
return $fieldVal;
}
}
function tearDown() {
// Delete our temporary database
$dbConn = DB::getConn();
if(substr($dbConn->currentDatabase(),0,5) == 'tmpdb') {
// echo "Deleted temp database " . $dbConn->currentDatabase() . "\n";
$dbConn->dropDatabase();
}
}
}
} else {
// Stub
class SapphireTest extends Object {}
}
?>

View File

@ -1,5 +1,12 @@
<?php
/**
* @package tests
*/
/**
* Tests for SiteTree
*/
class SiteTreeTest extends SapphireTest {
static $fixture_file = 'sapphire/tests/SiteTreeTest.yml';

View File

@ -1,68 +0,0 @@
<?php
// Check that PHPUnit is installed
$hasPhpUnit = false;
$paths = explode(PATH_SEPARATOR, ini_get('include_path'));
foreach($paths as $path) {
if(@file_exists("$path/PHPUnit/Framework.php")) $hasPhpUnit = true;
}
if($hasPhpUnit) {
require_once 'PHPUnit/Framework.php';
require_once 'PHPUnit/TextUI/TestRunner.php';
/**
* Controller that executes PHPUnit tests
*/
class TestRunner extends Controller {
/**
* Run all test classes
*/
function index() {
ManifestBuilder::includeEverything();
$tests = ClassInfo::subclassesFor('SapphireTest');
array_shift($tests);
$this->runTests($tests);
}
/**
* Run only a single test class
*/
function only() {
$className = $this->urlParams['ID'];
if(class_exists($className)) {
$this->runTests(array($className));
} else {
echo "Class '$className' not found";
}
}
function runTests($classList) {
echo "<h1>Sapphire PHPUnit Test Runner</h1>";
echo "<p>Using the following subclasses of SapphireTest for testing: " . implode(", ", $classList) . "</p>";
echo "<pre>";
$suite = new PHPUnit_Framework_TestSuite();
foreach($classList as $className) {
$suite->addTest(new PHPUnit_Framework_TestSuite($className));
}
/*, array("reportDirectory" => "/Users/sminnee/phpunit-report")*/
PHPUnit_TextUI_TestRunner::run($suite);
}
}
} else {
class TestRunner extends Controller {
function index() {
echo "Please install PHPUnit using pear.";
}
}
}

View File

@ -1,10 +1,15 @@
<?php
/**
** Contains heaps of tools that you can use when importing database information
**/
* @package sapphire
* @subpackage misc
*/
/**
* Contains heaps of tools that you can use when importing database information
* @package sapphire
* @subpackage misc
*/
class importer_Controller extends Page_Controller {
// Generates the URLsegment for every page that doesn't have one.

View File

@ -1,5 +1,16 @@
<?php
/**
* @package sapphire
* @subpackage widgets
*/
/**
* Base class for widgets.
* Widgets let CMS authors drag and drop small pieces of functionality into defined areas of their websites.
* @package sapphire
* @subpackage widgets
*/
class Widget extends DataObject {
static $db = array(
"ParentID" => "Int",

View File

@ -1,5 +1,15 @@
<?php
/**
* @package sapphire
* @subpackage widgets
*/
/**
* Represents a set of widgets shown on a page.
* @package sapphire
* @subpackage widgets
*/
class WidgetArea extends DataObject {
static $db = array();