diff options
-rw-r--r-- | includes/common.inc | 877 | ||||
-rw-r--r-- | includes/xmlrpc.inc | 2170 | ||||
-rw-r--r-- | modules/blog.module | 2 | ||||
-rw-r--r-- | modules/blog/blog.module | 2 | ||||
-rw-r--r-- | modules/book.module | 4 | ||||
-rw-r--r-- | modules/book/book.module | 4 | ||||
-rw-r--r-- | modules/forum.module | 180 | ||||
-rw-r--r-- | modules/forum/forum.module | 180 | ||||
-rw-r--r-- | modules/node.module | 10 | ||||
-rw-r--r-- | modules/node/node.module | 10 | ||||
-rw-r--r-- | modules/page.module | 186 | ||||
-rw-r--r-- | modules/page/page.module | 186 | ||||
-rw-r--r-- | modules/story.module | 174 | ||||
-rw-r--r-- | modules/story/story.module | 174 |
14 files changed, 2086 insertions, 2073 deletions
diff --git a/includes/common.inc b/includes/common.inc index c1ebe193a..3e76d95c6 100644 --- a/includes/common.inc +++ b/includes/common.inc @@ -1,432 +1,445 @@ -<?php -// $Id$ - -function conf_init() { - global $HTTP_HOST, $REQUEST_URI; - - /* - ** Try finding a matching configuration file by stripping the website's - ** URI from left to right. If no configuration file is found, return a - ** default value 'conf'. - */ - - $file = strtolower(strtr($HTTP_HOST ."". substr($REQUEST_URI, 0, strrpos($REQUEST_URI, "/")), "/:", "..")); - - while (strlen($file) > 4) { - if (file_exists("includes/$file.php")) { - return $file; - } - else { - $file = substr($file, strpos($file, ".") + 1); - } - } - - return "conf"; -} - -function error_handler($errno, $message, $filename, $line, $variables) { - $types = array(1 => "error", 2 => "warning", 4 => "parse error", 8 => "notice", 16 => "core error", 32 => "core warning", 64 => "compile error", 128 => "compile warning", 256 => "user error", 512 => "user warning", 1024 => "user notice"); - $entry = $types[$errno] .": $message in $filename on line $line."; - if (($errno == 1 || $errno == 2 || $errno == 4) && error_reporting()) { - watchdog("error", $types[$errno] .": $message in $filename on line $line."); - print $entry; - } -} - -function watchdog($type, $message) { - global $user; - db_query("INSERT INTO watchdog (uid, type, message, location, hostname, timestamp) VALUES ('$user->uid', '". check_input($type) ."', '". check_input($message) ."', '". check_input(getenv("REQUEST_URI")) ."', '". check_input(getenv("REMOTE_ADDR")) ."', '". time() ."')"); -} - -function throttle($type, $rate) { - if (!user_access("access administration pages")) { - if ($throttle = db_fetch_object(db_query("SELECT * FROM watchdog WHERE type = '$type' AND hostname = '". getenv("REMOTE_ADDR") ."' AND ". time() ." - timestamp < $rate"))) { - watchdog("warning", "throttle: '". getenv("REMOTE_ADDR") ."' exceeded submission rate - $throttle->type"); - die(message_throttle()); - } - else { - watchdog($type, "throttle"); - } - } -} - -function path_uri() { - global $HTTP_HOST, $REQUEST_URI; - return "http://". $HTTP_HOST . substr($REQUEST_URI, 0, strrpos($REQUEST_URI, "/")) ."/"; -} - -function path_img() { - // use "http://your-image-server.com/ if you want to host images on a seperate server. - return "./images/"; -} - -function message_access() { - return t("You are not authorized to access to this page."); -} - -function message_na() { - return t("n/a"); -} - -function message_throttle() { - return t("You exceeded the maximum submission rate. Please wait a few minutes and try again."); -} - -function drupal_goto($url) { - - /* - ** It is advised to use "drupal_goto()" instead of PHP's "header()" as - ** "drupal_goto()" will append the user's session ID to the URI when PHP - ** is compiled with "--enable-trans-sid". - */ - - if (SID == "" || strstr($url, SID)) { - header("Location: $url"); - } - else if (strstr($url, "?") && !strstr($url, SID)) { - header("Location: $url&". SID); - } - else { - header("Location: $url?". SID); - } - - /* - ** The "Location" header sends a REDIRECT status code to the http - ** deamon. In some cases this can go wrong, so we make sure none - ** of the code /below/ gets executed when we redirect. - */ - - exit(); -} - -function check_form($text) { - return htmlspecialchars(stripslashes($text)); -} - -function check_export($text) { - return htmlspecialchars(stripslashes($text)); -} - -function check_code($text) { - return $text; -} - -function check_preview($text) { - return check_output(check_input($text)); -} - -function check_query($text) { - return addslashes(stripslashes($text)); -} - -function filter($text) { - foreach (module_list() as $name) { - if (module_hook($name, "filter")) $text = module_invoke($name, "filter", $text); - } - - return $text; -} - -function check_input($text) { - return check_query($text); -} - -function check_output($text, $nl2br = 0) { - return ($text) ? ($nl2br ? nl2br(stripslashes($text)) : stripslashes($text)) : message_na(); -} - -function format_info($body, $block) { - return "<table><tr><td><table align=\"right\" border=\"1\" width=\"180\"><tr><td>$block</td></tr></table>$body</td></tr></table>\n"; -} - -function format_rss_channel($title, $link, $description, $items, $language = "en") { - $output .= "<channel>\n"; - $output .= " <title>". htmlentities(strip_tags($title)) ."</title>\n"; - $output .= " <link>". htmlentities(strip_tags($link)) ."</link>\n"; - $output .= " <description>". htmlentities($description) ."</description>\n"; - $output .= " <language>". htmlentities(strip_tags($language)) ."</language>\n"; - $output .= $items; - $output .= "</channel>\n"; - - return $output; -} - -function format_rss_item($title, $link, $description) { - $output .= "<item>\n"; - $output .= " <title>". htmlentities(strip_tags($title)) ."</title>\n"; - $output .= " <link>". htmlentities(strip_tags($link)) ."</link>\n"; - $output .= " <description>". htmlentities($description) ."</description>\n"; - $output .= "</item>\n"; - - return $output; -} - -function format_plural($count, $singular, $plural) { - return ($count == 1) ? "$count ". t($singular) : "$count ". t($plural); -} - -function format_size($size) { - $suffix = "bytes"; - if ($size > 1024) { - $size = round($size / 1024, 2); - $suffix = "KB"; - } - if ($size > 1024) { - $size = round($size / 1024, 2); - $suffix = "MB"; - } - return "$size $suffix"; -} - -function cache_clear($interval = 0) { - db_query("DELETE FROM cache WHERE ". time() ." - timestamp > $interval"); -} - -function cache_get() { - global $user, $REQUEST_URI, $REQUEST_METHOD; - - if (!$user->uid && $REQUEST_METHOD == "GET") { - if ($cache = db_fetch_object(db_query("SELECT * FROM cache WHERE url = '". check_input($REQUEST_URI) ."'"))) { - cache_clear(variable_get("cache_clear", 30)); - } - else { - ob_start(); - } - } - - return $cache->data ? $cache->data : 0; -} - -function cache_set() { - global $user, $REQUEST_URI, $REQUEST_METHOD; - - if (!$user->uid && $REQUEST_METHOD == "GET") { - if ($data = ob_get_contents()) { - db_query("INSERT INTO cache (url, data, timestamp) VALUES('". addslashes($REQUEST_URI) ."', '". addslashes($data) ."', '". time() ."')"); - } - } -} - -function format_interval($timestamp) { - $units = array("year|years" => 31536000, "week|weeks" => 604800, "day|days" => 86400, "hour|hours" => 3600, "min|min" => 60, "sec|sec" => 1); - foreach ($units as $key=>$value) { - $key = explode("|", $key); - if ($timestamp >= $value) { - $output .= ($output ? " " : "") . format_plural(floor($timestamp / $value), $key[0], $key[1]); - $timestamp %= $value; - } - } - return ($output) ? $output : "0 sec"; -} - -function format_date($timestamp, $type = "medium", $format = "") { - global $user; - - // $timestamp += ($user->timezone) ? $user->timezone - date("Z") : 0; - - switch ($type) { - case "small": - $date = date("m/d/y - H:i", $timestamp); - break; - case "medium": - $date = t(date("l", $timestamp)) .", ". date("m/d/Y - H:i", $timestamp); - break; - case "large": - $date = t(date("l", $timestamp)) .", ". t(date("F", $timestamp)) ." ". date("d, Y - H:i", $timestamp); - break; - case "custom": - for ($i = strlen($format); $i >= 0; $c = $format[--$i]) { - if (strstr("DFlMSw", $c)) { - $date = t(date($c, $timestamp)).$date; - } - else if (strstr("AaBdgGhHiIjLmnrstTUYyZz", $c)) { - $date = date($c, $timestamp).$date; - } - else { - $date = $c.$date; - } - } - break; - default: - $date = t(date("l", $timestamp)) .", ". date("m/d/Y - H:i", $timestamp); - } - return $date; -} - -function format_name($object) { - - if ($object->uid && $object->name) { - return "<a href=\"module.php?mod=user&op=view&id=$object->uid\">$object->name</a>"; - } - else { - return variable_get(anonymous, "Anonymous"); - } - -} - -function format_email($address) { - return ($address) ? "<a href=\"mailto:$address\">$address</A>" : message_na(); -} - -function format_url($address, $description = 0) { - $description = ($description) ? $description : $address; - return ($address) ? "<a href=\"$address\">". check_output($description) ."</a>" : message_na(); -} - -function format_tag($link, $text) { - return "'<a href=\"node.php?title='. urlencode('$link') .'\">'. ('$text' ? '$text' : '$link') .'</a>'"; -} - -function form($form, $method = "post", $action = 0, $options = 0) { - global $REQUEST_URI; - - return "<form action=\"". ($action ? $action : $REQUEST_URI) ."\" method=\"$method\"". ($options ? " $options" : "") .">\n$form</form>\n"; -} - -function form_item($title, $value, $description = 0) { - return ($title ? "<b>$title:</b><br />" : "") . $value . ($description ? "<br /><small><i>$description</i></small>" : "") ."<p />\n"; -} - -function form_checkbox($title, $name, $value, $description = 0) { - return form_item(0, "<input type=\"checkbox\" name=\"edit[$name]\" ". ($value ? " checked=\"checked\"" : "") ." /> $title", $description); -} - -function form_textfield($title, $name, $value, $size, $maxlength, $description = 0) { - return form_item($title, "<input maxlength=\"$maxlength\" name=\"edit[$name]\" size=\"$size\" value=\"". check_form($value) ."\" />", $description); -} - -function form_password($title, $name, $value, $size, $maxlength, $description = 0) { - return form_item($title, "<input type=\"password\" maxlength=\"$maxlength\" name=\"edit[$name]\" size=\"$size\" value=\"". check_form($value) ."\" />", $description); -} - -function form_textarea($title, $name, $value, $cols, $rows, $description = 0) { - return form_item($title, "<textarea wrap=\"virtual\" cols=\"$cols\" rows=\"$rows\" name=\"edit[$name]\">". check_form($value) ."</textarea>", $description); -} - -function form_select($title, $name, $value, $options, $description = 0, $extra = 0) { - if (count($options) > 0) { - foreach ($options as $key=>$choice) $select .= "<option value=\"$key\"". (is_array($value) ? (in_array($key, $value) ? " selected" : "") : ($key == $value ? " selected" : "")) .">". check_form($choice) ."</option>"; - return form_item($title, "<select name=\"edit[$name]\"". ($extra ? " $extra" : "") .">$select</select>", $description); - } -} - -function form_file($title, $name, $size, $description = 0) { - return form_item($title, "<input type=\"file\" name=\"edit[$name]\" size=\"$size\" />\n", $description); -} - -function form_hidden($name, $value) { - return "<input type=\"hidden\" name=\"edit[$name]\" value=\"". check_form($value) ."\" />\n"; -} - -function form_submit($value) { - return "<input type=\"submit\" name=\"op\" value=\"". check_form($value) ."\" />\n"; -} - -function field_get($string, $name) { - ereg(",$name=([^,]+)", ",$string", $regs); - return $regs[1]; -} - -function field_set($string, $name, $value) { - $rval = ereg_replace(",$name=[^,]+", "", ",$string"); - if ($value) $rval .= ($rval == "," ? "" : ",") ."$name=$value"; - return substr($rval, 1); -} - -function field_merge($a, $b) { - foreach (explode(",", $b) as $data) { - $entry = explode("=", $data); - $a = field_set($a, $entry[0], $entry[1]); - } - return $a; -} - -function link_page() { - - $links[] = "<a href=\"index.php\">". t("home") ."</a>"; - - foreach (module_list() as $name) { - if (module_hook($name, "link")) { - $links = array_merge($links, module_invoke($name, "link", "page")); - } - } - - - return $links; -} - -function link_node($node, $main = 0) { - foreach (module_list() as $name) { - if (module_hook($name, "link")) { - $links = array_merge($links, module_invoke($name, "link", "node", $node, $main)); - } - } - - return $links ? $links : array(); -} - -function timer_start() { - global $timer; - $timer = explode(" ", microtime()); -} - -function timer_print() { - global $timer; - $stop = explode(" ", microtime()); - $diff = $stop[0] - $timer[0]; - print "<PRE>execution time: $diff ms</PRE>"; -} - -function page_header() { - if (variable_get("dev_timer", 0)) { - timer_start(); - } - - if (variable_get("cache", 0)) { - if ($data = cache_get()) { - print $data; - exit(); - } - } -} - -function page_footer() { - if (variable_get("dev_timer", 0)) { - timer_print(); - } - - if (variable_get("cache", 0)) { - cache_set(); - } -} - -$config = conf_init(); - -unset($conf); -include_once "includes/$config.php"; -include_once "includes/database.inc"; -include_once "includes/variable.inc"; -include_once "includes/comment.inc"; -include_once "includes/xmlrpc.inc"; -include_once "includes/module.inc"; -include_once "includes/locale.inc"; -include_once "includes/search.inc"; -include_once "includes/theme.inc"; -include_once "includes/node.inc"; - -// initialize configuration variables: -$conf = variable_init($conf); - -// initialize installed modules: -module_init(); - -// initialize localization system: -$locale = locale_init(); - -// initialize theme: -$theme = theme_init(); - -// set error handler: -set_error_handler("error_handler"); - -?> +<?php
+// $Id$
+
+function conf_init() {
+ global $HTTP_HOST, $REQUEST_URI;
+
+ /*
+ ** Try finding a matching configuration file by stripping the website's
+ ** URI from left to right. If no configuration file is found, return a
+ ** default value 'conf'.
+ */
+
+ $file = strtolower(strtr($HTTP_HOST ."". substr($REQUEST_URI, 0, strrpos($REQUEST_URI, "/")), "/:", ".."));
+
+ while (strlen($file) > 4) {
+ if (file_exists("includes/$file.php")) {
+ return $file;
+ }
+ else {
+ $file = substr($file, strpos($file, ".") + 1);
+ }
+ }
+
+ return "conf";
+}
+
+function error_handler($errno, $message, $filename, $line, $variables) {
+ $types = array(1 => "error", 2 => "warning", 4 => "parse error", 8 => "notice", 16 => "core error", 32 => "core warning", 64 => "compile error", 128 => "compile warning", 256 => "user error", 512 => "user warning", 1024 => "user notice");
+ $entry = $types[$errno] .": $message in $filename on line $line.";
+ if (($errno == 1 || $errno == 2 || $errno == 4) && error_reporting()) {
+ watchdog("error", $types[$errno] .": $message in $filename on line $line.");
+ print $entry;
+ }
+}
+
+function watchdog($type, $message) {
+ global $user;
+ db_query("INSERT INTO watchdog (uid, type, message, location, hostname, timestamp) VALUES ('$user->uid', '". check_input($type) ."', '". check_input($message) ."', '". check_input(getenv("REQUEST_URI")) ."', '". check_input(getenv("REMOTE_ADDR")) ."', '". time() ."')");
+}
+
+function throttle($type, $rate) {
+ if (!user_access("access administration pages")) {
+ if ($throttle = db_fetch_object(db_query("SELECT * FROM watchdog WHERE type = '$type' AND hostname = '". getenv("REMOTE_ADDR") ."' AND ". time() ." - timestamp < $rate"))) {
+ watchdog("warning", "throttle: '". getenv("REMOTE_ADDR") ."' exceeded submission rate - $throttle->type");
+ die(message_throttle());
+ }
+ else {
+ watchdog($type, "throttle");
+ }
+ }
+}
+
+function path_uri() {
+ global $HTTP_HOST, $REQUEST_URI;
+ return "http://". $HTTP_HOST . substr($REQUEST_URI, 0, strrpos($REQUEST_URI, "/")) ."/";
+}
+
+function path_img() {
+ // use "http://your-image-server.com/ if you want to host images on a seperate server.
+ return "./images/";
+}
+
+function message_access() {
+ return t("You are not authorized to access to this page.");
+}
+
+function message_na() {
+ return t("n/a");
+}
+
+function message_throttle() {
+ return t("You exceeded the maximum submission rate. Please wait a few minutes and try again.");
+}
+
+function drupal_goto($url) {
+
+ /*
+ ** It is advised to use "drupal_goto()" instead of PHP's "header()" as
+ ** "drupal_goto()" will append the user's session ID to the URI when PHP
+ ** is compiled with "--enable-trans-sid".
+ */
+
+ if (SID == "" || strstr($url, SID)) {
+ header("Location: $url");
+ }
+ else if (strstr($url, "?") && !strstr($url, SID)) {
+ header("Location: $url&". SID);
+ }
+ else {
+ header("Location: $url?". SID);
+ }
+
+ /*
+ ** The "Location" header sends a REDIRECT status code to the http
+ ** deamon. In some cases this can go wrong, so we make sure none
+ ** of the code /below/ gets executed when we redirect.
+ */
+
+ exit();
+}
+
+function check_form($text) {
+ return htmlspecialchars(stripslashes($text));
+}
+
+function check_export($text) {
+ return htmlspecialchars(stripslashes($text));
+}
+
+function check_code($text) {
+ return $text;
+}
+
+function check_preview($text) {
+ return check_output(check_input($text));
+}
+
+function check_query($text) {
+ return addslashes(stripslashes($text));
+}
+
+function filter($text) {
+ foreach (module_list() as $name) {
+ if (module_hook($name, "filter")) $text = module_invoke($name, "filter", $text);
+ }
+
+ return $text;
+}
+
+function check_input($text) {
+ return check_query($text);
+}
+
+function check_output($text, $nl2br = 0) {
+ return ($text) ? ($nl2br ? nl2br(stripslashes($text)) : stripslashes($text)) : message_na();
+}
+
+function check_file($filename) {
+ if (is_uploaded_file($filename)) {
+ return 1;
+ }
+ else {
+ return 0;
+ }
+}
+
+function file_encode($filename) {
+ $edit[filedata] = base64_encode(fread($fd, filesize($edit[upload_file])));
+}
+
+function format_info($body, $block) {
+ return "<table><tr><td><table align=\"right\" border=\"1\" width=\"180\"><tr><td>$block</td></tr></table>$body</td></tr></table>\n";
+}
+
+function format_rss_channel($title, $link, $description, $items, $language = "en") {
+ $output .= "<channel>\n";
+ $output .= " <title>". htmlentities(strip_tags($title)) ."</title>\n";
+ $output .= " <link>". htmlentities(strip_tags($link)) ."</link>\n";
+ $output .= " <description>". htmlentities($description) ."</description>\n";
+ $output .= " <language>". htmlentities(strip_tags($language)) ."</language>\n";
+ $output .= $items;
+ $output .= "</channel>\n";
+
+ return $output;
+}
+
+function format_rss_item($title, $link, $description) {
+ $output .= "<item>\n";
+ $output .= " <title>". htmlentities(strip_tags($title)) ."</title>\n";
+ $output .= " <link>". htmlentities(strip_tags($link)) ."</link>\n";
+ $output .= " <description>". htmlentities($description) ."</description>\n";
+ $output .= "</item>\n";
+
+ return $output;
+}
+
+function format_plural($count, $singular, $plural) {
+ return ($count == 1) ? "$count ". t($singular) : "$count ". t($plural);
+}
+
+function format_size($size) {
+ $suffix = "bytes";
+ if ($size > 1024) {
+ $size = round($size / 1024, 2);
+ $suffix = "KB";
+ }
+ if ($size > 1024) {
+ $size = round($size / 1024, 2);
+ $suffix = "MB";
+ }
+ return "$size $suffix";
+}
+
+function cache_clear($interval = 0) {
+ db_query("DELETE FROM cache WHERE ". time() ." - timestamp > $interval");
+}
+
+function cache_get() {
+ global $user, $REQUEST_URI, $REQUEST_METHOD;
+
+ if (!$user->uid && $REQUEST_METHOD == "GET") {
+ if ($cache = db_fetch_object(db_query("SELECT * FROM cache WHERE url = '". check_input($REQUEST_URI) ."'"))) {
+ cache_clear(variable_get("cache_clear", 30));
+ }
+ else {
+ ob_start();
+ }
+ }
+
+ return $cache->data ? $cache->data : 0;
+}
+
+function cache_set() {
+ global $user, $REQUEST_URI, $REQUEST_METHOD;
+
+ if (!$user->uid && $REQUEST_METHOD == "GET") {
+ if ($data = ob_get_contents()) {
+ db_query("INSERT INTO cache (url, data, timestamp) VALUES('". addslashes($REQUEST_URI) ."', '". addslashes($data) ."', '". time() ."')");
+ }
+ }
+}
+
+function format_interval($timestamp) {
+ $units = array("year|years" => 31536000, "week|weeks" => 604800, "day|days" => 86400, "hour|hours" => 3600, "min|min" => 60, "sec|sec" => 1);
+ foreach ($units as $key=>$value) {
+ $key = explode("|", $key);
+ if ($timestamp >= $value) {
+ $output .= ($output ? " " : "") . format_plural(floor($timestamp / $value), $key[0], $key[1]);
+ $timestamp %= $value;
+ }
+ }
+ return ($output) ? $output : "0 sec";
+}
+
+function format_date($timestamp, $type = "medium", $format = "") {
+ global $user;
+
+ // $timestamp += ($user->timezone) ? $user->timezone - date("Z") : 0;
+
+ switch ($type) {
+ case "small":
+ $date = date("m/d/y - H:i", $timestamp);
+ break;
+ case "medium":
+ $date = t(date("l", $timestamp)) .", ". date("m/d/Y - H:i", $timestamp);
+ break;
+ case "large":
+ $date = t(date("l", $timestamp)) .", ". t(date("F", $timestamp)) ." ". date("d, Y - H:i", $timestamp);
+ break;
+ case "custom":
+ for ($i = strlen($format); $i >= 0; $c = $format[--$i]) {
+ if (strstr("DFlMSw", $c)) {
+ $date = t(date($c, $timestamp)).$date;
+ }
+ else if (strstr("AaBdgGhHiIjLmnrstTUYyZz", $c)) {
+ $date = date($c, $timestamp).$date;
+ }
+ else {
+ $date = $c.$date;
+ }
+ }
+ break;
+ default:
+ $date = t(date("l", $timestamp)) .", ". date("m/d/Y - H:i", $timestamp);
+ }
+ return $date;
+}
+
+function format_name($object) {
+
+ if ($object->uid && $object->name) {
+ return "<a href=\"module.php?mod=user&op=view&id=$object->uid\">$object->name</a>";
+ }
+ else {
+ return variable_get(anonymous, "Anonymous");
+ }
+
+}
+
+function format_email($address) {
+ return ($address) ? "<a href=\"mailto:$address\">$address</A>" : message_na();
+}
+
+function format_url($address, $description = 0) {
+ $description = ($description) ? $description : $address;
+ return ($address) ? "<a href=\"$address\">". check_output($description) ."</a>" : message_na();
+}
+
+function format_tag($link, $text) {
+ return "'<a href=\"node.php?title='. urlencode('$link') .'\">'. ('$text' ? '$text' : '$link') .'</a>'";
+}
+
+function form($form, $method = "post", $action = 0, $options = 0) {
+ global $REQUEST_URI;
+
+ return "<form action=\"". ($action ? $action : $REQUEST_URI) ."\" method=\"$method\"". ($options ? " $options" : "") .">\n$form</form>\n";
+}
+
+function form_item($title, $value, $description = 0) {
+ return ($title ? "<b>$title:</b><br />" : "") . $value . ($description ? "<br /><small><i>$description</i></small>" : "") ."<p />\n";
+}
+
+function form_checkbox($title, $name, $value, $description = 0) {
+ return form_item(0, "<input type=\"checkbox\" name=\"edit[$name]\" ". ($value ? " checked=\"checked\"" : "") ." /> $title", $description);
+}
+
+function form_textfield($title, $name, $value, $size, $maxlength, $description = 0) {
+ return form_item($title, "<input maxlength=\"$maxlength\" name=\"edit[$name]\" size=\"$size\" value=\"". check_form($value) ."\" />", $description);
+}
+
+function form_password($title, $name, $value, $size, $maxlength, $description = 0) {
+ return form_item($title, "<input type=\"password\" maxlength=\"$maxlength\" name=\"edit[$name]\" size=\"$size\" value=\"". check_form($value) ."\" />", $description);
+}
+
+function form_textarea($title, $name, $value, $cols, $rows, $description = 0) {
+ return form_item($title, "<textarea wrap=\"virtual\" cols=\"$cols\" rows=\"$rows\" name=\"edit[$name]\">". check_form($value) ."</textarea>", $description);
+}
+
+function form_select($title, $name, $value, $options, $description = 0, $extra = 0) {
+ if (count($options) > 0) {
+ foreach ($options as $key=>$choice) $select .= "<option value=\"$key\"". (is_array($value) ? (in_array($key, $value) ? " selected" : "") : ($key == $value ? " selected" : "")) .">". check_form($choice) ."</option>";
+ return form_item($title, "<select name=\"edit[$name]\"". ($extra ? " $extra" : "") .">$select</select>", $description);
+ }
+}
+
+function form_file($title, $name, $size, $description = 0) {
+ return form_item($title, "<input type=\"file\" name=\"edit[$name]\" size=\"$size\" />\n", $description);
+}
+
+function form_hidden($name, $value) {
+ return "<input type=\"hidden\" name=\"edit[$name]\" value=\"". check_form($value) ."\" />\n";
+}
+
+function form_submit($value) {
+ return "<input type=\"submit\" name=\"op\" value=\"". check_form($value) ."\" />\n";
+}
+
+function field_get($string, $name) {
+ ereg(",$name=([^,]+)", ",$string", $regs);
+ return $regs[1];
+}
+
+function field_set($string, $name, $value) {
+ $rval = ereg_replace(",$name=[^,]+", "", ",$string");
+ if ($value) $rval .= ($rval == "," ? "" : ",") ."$name=$value";
+ return substr($rval, 1);
+}
+
+function field_merge($a, $b) {
+ foreach (explode(",", $b) as $data) {
+ $entry = explode("=", $data);
+ $a = field_set($a, $entry[0], $entry[1]);
+ }
+ return $a;
+}
+
+function link_page() {
+
+ $links[] = "<a href=\"index.php\">". t("home") ."</a>";
+
+ foreach (module_list() as $name) {
+ if (module_hook($name, "link")) {
+ $links = array_merge($links, module_invoke($name, "link", "page"));
+ }
+ }
+
+
+ return $links;
+}
+
+function link_node($node, $main = 0) {
+ foreach (module_list() as $name) {
+ if (module_hook($name, "link")) {
+ $links = array_merge($links, module_invoke($name, "link", "node", $node, $main));
+ }
+ }
+
+ return $links ? $links : array();
+}
+
+function timer_start() {
+ global $timer;
+ $timer = explode(" ", microtime());
+}
+
+function timer_print() {
+ global $timer;
+ $stop = explode(" ", microtime());
+ $diff = $stop[0] - $timer[0];
+ print "<PRE>execution time: $diff ms</PRE>";
+}
+
+function page_header() {
+ if (variable_get("dev_timer", 0)) {
+ timer_start();
+ }
+
+ if (variable_get("cache", 0)) {
+ if ($data = cache_get()) {
+ print $data;
+ exit();
+ }
+ }
+}
+
+function page_footer() {
+ if (variable_get("dev_timer", 0)) {
+ timer_print();
+ }
+
+ if (variable_get("cache", 0)) {
+ cache_set();
+ }
+}
+
+$config = conf_init();
+
+unset($conf);
+include_once "includes/$config.php";
+include_once "includes/database.inc";
+include_once "includes/variable.inc";
+include_once "includes/comment.inc";
+include_once "includes/xmlrpc.inc";
+include_once "includes/module.inc";
+include_once "includes/locale.inc";
+include_once "includes/search.inc";
+include_once "includes/theme.inc";
+include_once "includes/node.inc";
+
+// initialize configuration variables:
+$conf = variable_init($conf);
+
+// initialize installed modules:
+module_init();
+
+// initialize localization system:
+$locale = locale_init();
+
+// initialize theme:
+$theme = theme_init();
+
+// set error handler:
+set_error_handler("error_handler");
+
+?>
diff --git a/includes/xmlrpc.inc b/includes/xmlrpc.inc index a7989a801..fc695d262 100644 --- a/includes/xmlrpc.inc +++ b/includes/xmlrpc.inc @@ -1,1085 +1,1085 @@ -<?php // -*-c++-*- -// by Edd Dumbill (C) 1999-2001 -// <edd@usefulinc.com> -// $Id$ - - -// Copyright (c) 1999,2000,2001 Edd Dumbill. -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions -// are met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following -// disclaimer in the documentation and/or other materials provided -// with the distribution. -// -// * Neither the name of the "XML-RPC for PHP" nor the names of its -// contributors may be used to endorse or promote products derived -// from this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -// REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -// HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, -// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED -// OF THE POSSIBILITY OF SUCH DAMAGE. - -if (!function_exists('xml_parser_create')) { -// Win 32 fix. From: "Leo West" <lwest@imaginet.fr> - if($WINDIR) { - dl("php3_xml.dll"); - } else { - dl("xml.so"); - } -} - -$xmlrpcI4="i4"; -$xmlrpcInt="int"; -$xmlrpcBoolean="boolean"; -$xmlrpcDouble="double"; -$xmlrpcString="string"; -$xmlrpcDateTime="dateTime.iso8601"; -$xmlrpcBase64="base64"; -$xmlrpcArray="array"; -$xmlrpcStruct="struct"; - - -$xmlrpcTypes=array($xmlrpcI4 => 1, - $xmlrpcInt => 1, - $xmlrpcBoolean => 1, - $xmlrpcString => 1, - $xmlrpcDouble => 1, - $xmlrpcDateTime => 1, - $xmlrpcBase64 => 1, - $xmlrpcArray => 2, - $xmlrpcStruct => 3); - -$xmlEntities=array( "amp" => "&", - "quot" => '"', - "lt" => "<", - "gt" => ">", - "apos" => "'"); - -$xmlrpcerr["unknown_method"]=1; -$xmlrpcstr["unknown_method"]="Unknown method"; -$xmlrpcerr["invalid_return"]=2; -$xmlrpcstr["invalid_return"]="Invalid return payload: enabling debugging to examine incoming payload"; -$xmlrpcerr["incorrect_params"]=3; -$xmlrpcstr["incorrect_params"]="Incorrect parameters passed to method"; -$xmlrpcerr["introspect_unknown"]=4; -$xmlrpcstr["introspect_unknown"]="Can't introspect: method unknown"; -$xmlrpcerr["http_error"]=5; -$xmlrpcstr["http_error"]="Didn't receive 200 OK from remote server."; -$xmlrpcerr["no_data"]=6; -$xmlrpcstr["no_data"]="No data received from server."; -$xmlrpcerr["no_ssl"]=7; -$xmlrpcstr["no_ssl"]="No SSL support compiled in."; -$xmlrpcerr["curl_fail"]=8; -$xmlrpcstr["curl_fail"]="CURL error"; - -$xmlrpc_defencoding="UTF-8"; - -$xmlrpcName="XML-RPC for PHP"; -$xmlrpcVersion="1.01"; - -// let user errors start at 800 -$xmlrpcerruser=800; -// let XML parse errors start at 100 -$xmlrpcerrxml=100; - -// formulate backslashes for escaping regexp -$xmlrpc_backslash=chr(92).chr(92); - -// used to store state during parsing -// quick explanation of components: -// st - used to build up a string for evaluation -// ac - used to accumulate values -// qt - used to decide if quotes are needed for evaluation -// cm - used to denote struct or array (comma needed) -// isf - used to indicate a fault -// lv - used to indicate "looking for a value": implements -// the logic to allow values with no types to be strings -// params - used to store parameters in method calls -// method - used to store method name - -$_xh=array(); - -function xmlrpc_entity_decode($string) { - $top=split("&", $string); - $op=""; - $i=0; - while($i<sizeof($top)) { - if (ereg("^([#a-zA-Z0-9]+);", $top[$i], $regs)) { - $op.=ereg_replace("^[#a-zA-Z0-9]+;", - xmlrpc_lookup_entity($regs[1]), - $top[$i]); - } else { - if ($i==0) - $op=$top[$i]; - else - $op.="&" . $top[$i]; - } - $i++; - } - return $op; -} - -function xmlrpc_lookup_entity($ent) { - global $xmlEntities; - - if (isset($xmlEntities[strtolower($ent)])) - return $xmlEntities[strtolower($ent)]; - if (ereg("^#([0-9]+)$", $ent, $regs)) - return chr($regs[1]); - return "?"; -} - -function xmlrpc_se($parser, $name, $attrs) { - global $_xh, $xmlrpcDateTime, $xmlrpcString; - - switch($name) { - case "STRUCT": - case "ARRAY": - $_xh[$parser]['st'].="array("; - $_xh[$parser]['cm']++; - // this last line turns quoting off - // this means if we get an empty array we'll - // simply get a bit of whitespace in the eval - $_xh[$parser]['qt']=0; - break; - case "NAME": - $_xh[$parser]['st'].="'"; $_xh[$parser]['ac']=""; - break; - case "FAULT": - $_xh[$parser]['isf']=1; - break; - case "PARAM": - $_xh[$parser]['st']=""; - break; - case "VALUE": - $_xh[$parser]['st'].="new xmlrpcval("; - $_xh[$parser]['vt']=$xmlrpcString; - $_xh[$parser]['ac']=""; - $_xh[$parser]['qt']=0; - $_xh[$parser]['lv']=1; - // look for a value: if this is still 1 by the - // time we reach the first data segment then the type is string - // by implication and we need to add in a quote - break; - - case "I4": - case "INT": - case "STRING": - case "BOOLEAN": - case "DOUBLE": - case "DATETIME.ISO8601": - case "BASE64": - $_xh[$parser]['ac']=""; // reset the accumulator - - if ($name=="DATETIME.ISO8601" || $name=="STRING") { - $_xh[$parser]['qt']=1; - if ($name=="DATETIME.ISO8601") - $_xh[$parser]['vt']=$xmlrpcDateTime; - } else if ($name=="BASE64") { - $_xh[$parser]['qt']=2; - } else { - // No quoting is required here -- but - // at the end of the element we must check - // for data format errors. - $_xh[$parser]['qt']=0; - } - break; - case "MEMBER": - $_xh[$parser]['ac']=""; - break; - default: - break; - } - - if ($name!="VALUE") $_xh[$parser]['lv']=0; -} - -function xmlrpc_ee($parser, $name) { - global $_xh,$xmlrpcTypes,$xmlrpcString; - - switch($name) { - case "STRUCT": - case "ARRAY": - if ($_xh[$parser]['cm'] && substr($_xh[$parser]['st'], -1) ==',') { - $_xh[$parser]['st']=substr($_xh[$parser]['st'],0,-1); - } - $_xh[$parser]['st'].=")"; - $_xh[$parser]['vt']=strtolower($name); - $_xh[$parser]['cm']--; - break; - case "NAME": - $_xh[$parser]['st'].= $_xh[$parser]['ac'] . "' => "; - break; - case "BOOLEAN": - // special case here: we translate boolean 1 or 0 into PHP - // constants true or false - if ($_xh[$parser]['ac']=='1') - $_xh[$parser]['ac']="true"; - else - $_xh[$parser]['ac']="false"; - $_xh[$parser]['vt']=strtolower($name); - // Drop through intentionally. - case "I4": - case "INT": - case "STRING": - case "DOUBLE": - case "DATETIME.ISO8601": - case "BASE64": - if ($_xh[$parser]['qt']==1) { - // we use double quotes rather than single so backslashification works OK - $_xh[$parser]['st'].="\"". $_xh[$parser]['ac'] . "\""; - } else if ($_xh[$parser]['qt']==2) { - $_xh[$parser]['st'].="base64_decode('". $_xh[$parser]['ac'] . "')"; - } else if ($name=="BOOLEAN") { - $_xh[$parser]['st'].=$_xh[$parser]['ac']; - } else { - // we have an I4, INT or a DOUBLE - // we must check that only 0123456789-.<space> are characters here - if (!ereg("^\-?[0123456789 \t\.]+$", $_xh[$parser]['ac'])) { - // TODO: find a better way of throwing an error - // than this! - error_log("XML-RPC: non numeric value received in INT or DOUBLE"); - $_xh[$parser]['st'].="ERROR_NON_NUMERIC_FOUND"; - } else { - // it's ok, add it on - $_xh[$parser]['st'].=$_xh[$parser]['ac']; - } - } - $_xh[$parser]['ac']=""; $_xh[$parser]['qt']=0; - $_xh[$parser]['lv']=3; // indicate we've found a value - break; - case "VALUE": - // deal with a string value - if (strlen($_xh[$parser]['ac'])>0 && - $_xh[$parser]['vt']==$xmlrpcString) { - $_xh[$parser]['st'].="\"". $_xh[$parser]['ac'] . "\""; - } - // This if() detects if no scalar was inside <VALUE></VALUE> - // and pads an empty "". - if($_xh[$parser]['st'][strlen($_xh[$parser]['st'])-1] == '(') { - $_xh[$parser]['st'].= '""'; - } - $_xh[$parser]['st'].=", '" . $_xh[$parser]['vt'] . "')"; - if ($_xh[$parser]['cm']) $_xh[$parser]['st'].=","; - break; - case "MEMBER": - $_xh[$parser]['ac']=""; $_xh[$parser]['qt']=0; - break; - case "DATA": - $_xh[$parser]['ac']=""; $_xh[$parser]['qt']=0; - break; - case "PARAM": - $_xh[$parser]['params'][]=$_xh[$parser]['st']; - break; - case "METHODNAME": - $_xh[$parser]['method']=ereg_replace("^[\n\r\t ]+", "", - $_xh[$parser]['ac']); - break; - case "BOOLEAN": - // special case here: we translate boolean 1 or 0 into PHP - // constants true or false - if ($_xh[$parser]['ac']=='1') - $_xh[$parser]['ac']="true"; - else - $_xh[$parser]['ac']="false"; - $_xh[$parser]['vt']=strtolower($name); - break; - default: - break; - } - // if it's a valid type name, set the type - if (isset($xmlrpcTypes[strtolower($name)])) { - $_xh[$parser]['vt']=strtolower($name); - } - -} - -function xmlrpc_cd($parser, $data) -{ - global $_xh, $xmlrpc_backslash; - - //if (ereg("^[\n\r \t]+$", $data)) return; - // print "adding [${data}]\n"; - - if ($_xh[$parser]['lv']!=3) { - // "lookforvalue==3" means that we've found an entire value - // and should discard any further character data - if ($_xh[$parser]['lv']==1) { - // if we've found text and we're just in a <value> then - // turn quoting on, as this will be a string - $_xh[$parser]['qt']=1; - // and say we've found a value - $_xh[$parser]['lv']=2; - } - // replace characters that eval would - // do special things with - $_xh[$parser]['ac'].=str_replace('$', '\$', - str_replace('"', '\"', str_replace(chr(92), - $xmlrpc_backslash, $data))); - } -} - -function xmlrpc_dh($parser, $data) -{ - global $_xh; - if (substr($data, 0, 1) == "&" && substr($data, -1, 1) == ";") { - if ($_xh[$parser]['lv']==1) { - $_xh[$parser]['qt']=1; - $_xh[$parser]['lv']=2; - } - $_xh[$parser]['ac'].=str_replace('$', '\$', - str_replace('"', '\"', str_replace(chr(92), - $xmlrpc_backslash, $data))); - } -} - -class xmlrpc_client { - var $path; - var $server; - var $port; - var $errno; - var $errstring; - var $debug=0; - var $username=""; - var $password=""; - var $cert=""; - var $certpass=""; - - function xmlrpc_client($path, $server, $port=0) { - $this->port=$port; $this->server=$server; $this->path=$path; - } - - function setDebug($in) { - if ($in) { - $this->debug=1; - } else { - $this->debug=0; - } - } - - function setCredentials($u, $p) { - $this->username=$u; - $this->password=$p; - } - - function setCertificate($cert, $certpass) { - $this->cert = $cert; - $this->certpass = $certpass; - } - - function send($msg, $timeout=0, $method='http') { - // where msg is an xmlrpcmsg - $msg->debug=$this->debug; - - if ($method == 'https') { - return $this->sendPayloadHTTPS($msg, - $this->server, - $this->port, $timeout, - $this->username, $this->password, - $this->cert, - $this->certpass); - } else { - return $this->sendPayloadHTTP10($msg, $this->server, $this->port, - $timeout, $this->username, - $this->password); - } - } - - function sendPayloadHTTP10($msg, $server, $port, $timeout=0, - $username="", $password="") { - if ($port==0) $port=80; - if($timeout>0) - $fp=fsockopen($server, $port, - &$this->errno, &$this->errstr, $timeout); - else - $fp=fsockopen($server, $port, - &$this->errno, &$this->errstr); - if (!$fp) { - return 0; - } - // Only create the payload if it was not created previously - if(empty($msg->payload)) $msg->createPayload(); - - // thanks to Grant Rauscher <grant7@firstworld.net> - // for this - $credentials=""; - if ($username!="") { - $credentials="Authorization: Basic " . - base64_encode($username . ":" . $password) . "\r\n"; - } - - $op= "POST " . $this->path. " HTTP/1.0\r\nUser-Agent: PHP XMLRPC 1.0\r\n" . - "Host: ". $this->server . "\r\n" . - $credentials . - "Content-Type: text/xml\r\nContent-Length: " . - strlen($msg->payload) . "\r\n\r\n" . - $msg->payload; - - if (!fputs($fp, $op, strlen($op))) { - $this->errstr="Write error"; - return 0; - } - $resp=$msg->parseResponseFile($fp); - fclose($fp); - return $resp; - } - - // contributed by Justin Miller <justin@voxel.net> - // requires curl to be built into PHP - function sendPayloadHTTPS($msg, $server, $port, $timeout=0, - $username="", $password="", $cert="", - $certpass="") { - global $xmlrpcerr, $xmlrpcstr; - if ($port == 0) $port = 443; - - // Only create the payload if it was not created previously - if(empty($msg->payload)) $msg->createPayload(); - - if (!function_exists("curl_init")) { - $r=new xmlrpcresp(0, $xmlrpcerr["no_ssl"], - $xmlrpcstr["no_ssl"]); - return $r; - } - - $curl = curl_init("https://" . $server . ':' . $port . - $this->path); - - curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); - // results into variable - if ($this->debug) { - curl_setopt($curl, CURLOPT_VERBOSE, 1); - } - curl_setopt($curl, CURLOPT_USERAGENT, 'PHP XMLRPC 1.0'); - // required for XMLRPC - curl_setopt($curl, CURLOPT_POST, 1); - // post the data - curl_setopt($curl, CURLOPT_POSTFIELDS, $msg->payload); - // the data - curl_setopt($curl, CURLOPT_HEADER, 1); - // return the header too - curl_setopt($curl, CURLOPT_HTTPHEADER, array('Content-Type: text/xml')); - // required for XMLRPC - if ($timeout) curl_setopt($curl, CURLOPT_TIMEOUT, $timeout == 1 ? 1 : - $timeout - 1); - // timeout is borked - if ($username && $password) curl_setopt($curl, CURLOPT_USERPWD, - "$username:$password"); - // set auth stuff - if ($cert) curl_setopt($curl, CURLOPT_SSLCERT, $cert); - // set cert file - if ($certpass) curl_setopt($curl, CURLOPT_SSLCERTPASSWD, - $certpass); - // set cert password - - $result = curl_exec($curl); - - if (!$result) { - $resp=new xmlrpcresp(0, - $xmlrpcerr["curl_fail"], - $xmlrpcstr["curl_fail"]. ": ". - curl_error($curl)); - } else { - $resp = $msg->parseResponse($result); - } - curl_close($curl); - return $resp; - } - -} // end class xmlrpc_client - -class xmlrpcresp { - var $xv; - var $fn; - var $fs; - var $hdrs; - - function xmlrpcresp($val, $fcode=0, $fstr="") { - if ($fcode!=0) { - $this->xv=0; - $this->fn=$fcode; - $this->fs=htmlspecialchars($fstr); - } else { - $this->xv=$val; - $this->fn=0; - } - } - - function faultCode() { - if (isset($this->fn)) - return $this->fn; - else - return 0; - } - - function faultString() { return $this->fs; } - function value() { return $this->xv; } - - function serialize() { - $rs="<methodResponse>\n"; - if ($this->fn) { - $rs.="<fault> - <value> - <struct> - <member> - <name>faultCode</name> - <value><int>" . $this->fn . "</int></value> - </member> - <member> - <name>faultString</name> - <value><string>" . $this->fs . "</string></value> - </member> - </struct> - </value> -</fault>"; - } else { - $rs.="<params>\n<param>\n" . $this->xv->serialize() . - "</param>\n</params>"; - } - $rs.="\n</methodResponse>"; - return $rs; - } -} - -class xmlrpcmsg { - var $payload; - var $methodname; - var $params=array(); - var $debug=0; - - function xmlrpcmsg($meth, $pars=0) { - $this->methodname=$meth; - if (is_array($pars) && sizeof($pars)>0) { - for($i=0; $i<sizeof($pars); $i++) - $this->addParam($pars[$i]); - } - } - - function xml_header() { - return "<?xml version=\"1.0\"?>\n<methodCall>\n"; - } - - function xml_footer() { - return "</methodCall>\n"; - } - - function createPayload() { - $this->payload=$this->xml_header(); - $this->payload.="<methodName>" . $this->methodname . "</methodName>\n"; - // if (sizeof($this->params)) { - $this->payload.="<params>\n"; - for($i=0; $i<sizeof($this->params); $i++) { - $p=$this->params[$i]; - $this->payload.="<param>\n" . $p->serialize() . - "</param>\n"; - } - $this->payload.="</params>\n"; - // } - $this->payload.=$this->xml_footer(); - $this->payload=str_replace("\n", "\r\n", $this->payload); - } - - function method($meth="") { - if ($meth!="") { - $this->methodname=$meth; - } - return $this->methodname; - } - - function serialize() { - $this->createPayload(); - return $this->payload; - } - - function addParam($par) { $this->params[]=$par; } - function getParam($i) { return $this->params[$i]; } - function getNumParams() { return sizeof($this->params); } - - function parseResponseFile($fp) { - $ipd=""; - - while($data=fread($fp, 32768)) { - $ipd.=$data; - } - return $this->parseResponse($ipd); - } - - function parseResponse($data="") { - global $_xh,$xmlrpcerr,$xmlrpcstr; - global $xmlrpc_defencoding; - - - $parser = xml_parser_create($xmlrpc_defencoding); - - $_xh[$parser]=array(); - - $_xh[$parser]['st']=""; - $_xh[$parser]['cm']=0; - $_xh[$parser]['isf']=0; - $_xh[$parser]['ac']=""; - $_xh[$parser]['qt']=""; - - xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, true); - xml_set_element_handler($parser, "xmlrpc_se", "xmlrpc_ee"); - xml_set_character_data_handler($parser, "xmlrpc_cd"); - xml_set_default_handler($parser, "xmlrpc_dh"); - $xmlrpc_value=new xmlrpcval; - - $hdrfnd=0; - if ($this->debug) - print "<PRE>---GOT---\n" . htmlspecialchars($data) . - "\n---END---\n</PRE>"; - if ($data=="") { - error_log("No response received from server."); - $r=new xmlrpcresp(0, $xmlrpcerr["no_data"], - $xmlrpcstr["no_data"]); - xml_parser_free($parser); - return $r; - } - // see if we got an HTTP 200 OK, else bomb - // but only do this if we're using the HTTP protocol. - if (ereg("^HTTP",$data) && - !ereg("^HTTP/[0-9\.]+ 200 ", $data)) { - $errstr= substr($data, 0, strpos($data, "\n")-1); - error_log("HTTP error, got response: " .$errstr); - $r=new xmlrpcresp(0, $xmlrpcerr["http_error"], - $xmlrpcstr["http_error"]. " (" . $errstr . ")"); - xml_parser_free($parser); - return $r; - } - // gotta get rid of headers here - if ((!$hdrfnd) && ereg("^(.*)\r\n\r\n",$data,$_xh[$parser]['ha'])) { - $data=ereg_replace("^.*\r\n\r\n", "", $data); - $hdrfnd=1; - } - - if (!xml_parse($parser, $data, sizeof($data))) { - // thanks to Peter Kocks <peter.kocks@baygate.com> - if((xml_get_current_line_number($parser)) == 1) - $errstr = "XML error at line 1, check URL"; - else - $errstr = sprintf("XML error: %s at line %d", - xml_error_string(xml_get_error_code($parser)), - xml_get_current_line_number($parser)); - error_log($errstr); - $r=new xmlrpcresp(0, $xmlrpcerr["invalid_return"], - $xmlrpcstr["invalid_return"]); - xml_parser_free($parser); - return $r; - } - xml_parser_free($parser); - if ($this->debug) { - print "<PRE>---EVALING---[" . - strlen($_xh[$parser]['st']) . " chars]---\n" . - htmlspecialchars($_xh[$parser]['st']) . ";\n---END---</PRE>"; - } - if (strlen($_xh[$parser]['st'])==0) { - // then something odd has happened - // and it's time to generate a client side error - // indicating something odd went on - $r=new xmlrpcresp(0, $xmlrpcerr["invalid_return"], - $xmlrpcstr["invalid_return"]); - } else { - eval('$v=' . $_xh[$parser]['st'] . '; $allOK=1;'); - if ($_xh[$parser]['isf']) { - $f=$v->structmem("faultCode"); - $fs=$v->structmem("faultString"); - $r=new xmlrpcresp($v, $f->scalarval(), - $fs->scalarval()); - } else { - $r=new xmlrpcresp($v); - } - } - $r->hdrs=split("\r?\n", $_xh[$parser]['ha'][1]); - return $r; - } - -} - -class xmlrpcval { - var $me=array(); - var $mytype=0; - - function xmlrpcval($val=-1, $type="") { - global $xmlrpcTypes; - $this->me=array(); - $this->mytype=0; - if ($val!=-1 || $type!="") { - if ($type=="") $type="string"; - if ($xmlrpcTypes[$type]==1) { - $this->addScalar($val,$type); - } - else if ($xmlrpcTypes[$type]==2) - $this->addArray($val); - else if ($xmlrpcTypes[$type]==3) - $this->addStruct($val); - } - } - - function addScalar($val, $type="string") { - global $xmlrpcTypes, $xmlrpcBoolean; - - if ($this->mytype==1) { - echo "<B>xmlrpcval</B>: scalar can have only one value<BR>"; - return 0; - } - $typeof=$xmlrpcTypes[$type]; - if ($typeof!=1) { - echo "<B>xmlrpcval</B>: not a scalar type (${typeof})<BR>"; - return 0; - } - - if ($type==$xmlrpcBoolean) { - if (strcasecmp($val,"true")==0 || - $val==1 || ($val==true && - strcasecmp($val,"false"))) { - $val=1; - } else { - $val=0; - } - } - - if ($this->mytype==2) { - // we're adding to an array here - $ar=$this->me["array"]; - $ar[]=new xmlrpcval($val, $type); - $this->me["array"]=$ar; - } else { - // a scalar, so set the value and remember we're scalar - $this->me[$type]=$val; - $this->mytype=$typeof; - } - return 1; - } - - function addArray($vals) { - global $xmlrpcTypes; - if ($this->mytype!=0) { - echo "<B>xmlrpcval</B>: already initialized as a [" . - $this->kindOf() . "]<BR>"; - return 0; - } - - $this->mytype=$xmlrpcTypes["array"]; - $this->me["array"]=$vals; - return 1; - } - - function addStruct($vals) { - global $xmlrpcTypes; - if ($this->mytype!=0) { - echo "<B>xmlrpcval</B>: already initialized as a [" . - $this->kindOf() . "]<BR>"; - return 0; - } - $this->mytype=$xmlrpcTypes["struct"]; - $this->me["struct"]=$vals; - return 1; - } - - function dump($ar) { - reset($ar); - while ( list( $key, $val ) = each( $ar ) ) { - echo "$key => $val<br>"; - if ($key == 'array') - while ( list( $key2, $val2 ) = each( $val ) ) { - echo "-- $key2 => $val2<br>"; - } - } - } - - function kindOf() { - switch($this->mytype) { - case 3: - return "struct"; - break; - case 2: - return "array"; - break; - case 1: - return "scalar"; - break; - default: - return "undef"; - } - } - - function serializedata($typ, $val) { - $rs=""; - global $xmlrpcTypes, $xmlrpcBase64, $xmlrpcString, - $xmlrpcBoolean; - switch($xmlrpcTypes[$typ]) { - case 3: - // struct - $rs.="<struct>\n"; - reset($val); - while(list($key2, $val2)=each($val)) { - $rs.="<member><name>${key2}</name>\n"; - $rs.=$this->serializeval($val2); - $rs.="</member>\n"; - } - $rs.="</struct>"; - break; - case 2: - // array - $rs.="<array>\n<data>\n"; - for($i=0; $i<sizeof($val); $i++) { - $rs.=$this->serializeval($val[$i]); - } - $rs.="</data>\n</array>"; - break; - case 1: - switch ($typ) { - case $xmlrpcBase64: - $rs.="<${typ}>" . base64_encode($val) . "</${typ}>"; - break; - case $xmlrpcBoolean: - $rs.="<${typ}>" . ($val ? "1" : "0") . "</${typ}>"; - break; - case $xmlrpcString: - $rs.="<${typ}>" . htmlspecialchars($val). "</${typ}>"; - break; - default: - $rs.="<${typ}>${val}</${typ}>"; - } - break; - default: - break; - } - return $rs; - } - - function serialize() { - return $this->serializeval($this); - } - - function serializeval($o) { - global $xmlrpcTypes; - $rs=""; - $ar=$o->me; - reset($ar); - list($typ, $val) = each($ar); - $rs.="<value>"; - $rs.=$this->serializedata($typ, $val); - $rs.="</value>\n"; - return $rs; - } - - function structmem($m) { - $nv=$this->me["struct"][$m]; - return $nv; - } - - function structreset() { - reset($this->me["struct"]); - } - - function structeach() { - return each($this->me["struct"]); - } - - function getval() { - // UNSTABLE - global $xmlrpcBoolean, $xmlrpcBase64; - reset($this->me); - list($a,$b)=each($this->me); - // contributed by I Sofer, 2001-03-24 - // add support for nested arrays to scalarval - // i've created a new method here, so as to - // preserve back compatibility - - if (is_array($b)) { - foreach ($b as $id => $cont) { - $b[$id] = $cont->scalarval(); - } - } - - // add support for structures directly encoding php objects - if (is_object($b)) { - $t = get_object_vars($b); - foreach ($t as $id => $cont) { - $t[$id] = $cont->scalarval(); - } - foreach ($t as $id => $cont) { - eval('$b->'.$id.' = $cont;'); - } - } - // end contrib - return $b; - } - - function scalarval() { - global $xmlrpcBoolean, $xmlrpcBase64; - reset($this->me); - list($a,$b)=each($this->me); - return $b; - } - - function scalartyp() { - global $xmlrpcI4, $xmlrpcInt; - reset($this->me); - list($a,$b)=each($this->me); - if ($a==$xmlrpcI4) - $a=$xmlrpcInt; - return $a; - } - - function arraymem($m) { - $nv=$this->me["array"][$m]; - return $nv; - } - - function arraysize() { - reset($this->me); - list($a,$b)=each($this->me); - return sizeof($b); - } -} - -// date helpers -function iso8601_encode($timet, $utc=0) { - // return an ISO8601 encoded string - // really, timezones ought to be supported - // but the XML-RPC spec says: - // - // "Don't assume a timezone. It should be specified by the server in its - // documentation what assumptions it makes about timezones." - // - // these routines always assume localtime unless - // $utc is set to 1, in which case UTC is assumed - // and an adjustment for locale is made when encoding - if (!$utc) { - $t=strftime("%Y%m%dT%H:%M:%S", $timet); - } else { - if (function_exists("gmstrftime")) - // gmstrftime doesn't exist in some versions - // of PHP - $t=gmstrftime("%Y%m%dT%H:%M:%S", $timet); - else { - $t=strftime("%Y%m%dT%H:%M:%S", $timet-date("Z")); - } - } - return $t; -} - -function iso8601_decode($idate, $utc=0) { - // return a timet in the localtime, or UTC - $t=0; - if (ereg("([0-9]{4})([0-9]{2})([0-9]{2})T([0-9]{2}):([0-9]{2}):([0-9]{2})", - $idate, $regs)) { - if ($utc) { - $t=gmmktime($regs[4], $regs[5], $regs[6], $regs[2], $regs[3], $regs[1]); - } else { - $t=mktime($regs[4], $regs[5], $regs[6], $regs[2], $regs[3], $regs[1]); - } - } - return $t; -} - -/**************************************************************** -* xmlrpc_decode takes a message in PHP xmlrpc object format and * -* tranlates it into native PHP types. * -* * -* author: Dan Libby (dan@libby.com) * -****************************************************************/ -function xmlrpc_decode($xmlrpc_val) { - $kind = $xmlrpc_val->kindOf(); - - if($kind == "scalar") { - return $xmlrpc_val->scalarval(); - } - else if($kind == "array") { - $size = $xmlrpc_val->arraysize(); - $arr = array(); - - for($i = 0; $i < $size; $i++) { - $arr[]=xmlrpc_decode($xmlrpc_val->arraymem($i)); - } - return $arr; - } - else if($kind == "struct") { - $xmlrpc_val->structreset(); - $arr = array(); - - while(list($key,$value)=$xmlrpc_val->structeach()) { - $arr[$key] = xmlrpc_decode($value); - } - return $arr; - } -} - -/**************************************************************** -* xmlrpc_encode takes native php types and encodes them into * -* xmlrpc PHP object format. * -* BUG: All sequential arrays are turned into structs. I don't * -* know of a good way to determine if an array is sequential * -* only. * -* * -* feature creep -- could support more types via optional type * -* argument. * -* * -* author: Dan Libby (dan@libby.com) * -****************************************************************/ -function xmlrpc_encode($php_val) { - global $xmlrpcInt; - global $xmlrpcDouble; - global $xmlrpcString; - global $xmlrpcArray; - global $xmlrpcStruct; - global $xmlrpcBoolean; - - $type = gettype($php_val); - $xmlrpc_val = new xmlrpcval; - - switch($type) { - case "array": - case "object": - $arr = array(); - while (list($k,$v) = each($php_val)) { - $arr[$k] = xmlrpc_encode($v); - } - $xmlrpc_val->addStruct($arr); - break; - case "integer": - $xmlrpc_val->addScalar($php_val, $xmlrpcInt); - break; - case "double": - $xmlrpc_val->addScalar($php_val, $xmlrpcDouble); - break; - case "string": - $xmlrpc_val->addScalar($php_val, $xmlrpcString); - break; -// <G_Giunta_2001-02-29> -// Add support for encoding/decoding of booleans, since they are supported in PHP - case "boolean": - $xmlrpc_val->addScalar($php_val, $xmlrpcBoolean); - break; -// </G_Giunta_2001-02-29> - case "unknown type": - default: - // giancarlo pinerolo <ping@alt.it> - // it has to return - // an empty object in case (which is already - // at this point), not a boolean. - break; - } - return $xmlrpc_val; -} - -?> +<?php // -*-c++-*-
+// by Edd Dumbill (C) 1999-2001
+// <edd@usefulinc.com>
+// $Id$
+
+
+// Copyright (c) 1999,2000,2001 Edd Dumbill.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions
+// are met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+//
+// * Neither the name of the "XML-RPC for PHP" nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+// REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+// HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+// OF THE POSSIBILITY OF SUCH DAMAGE.
+
+if (!function_exists('xml_parser_create')) {
+// Win 32 fix. From: "Leo West" <lwest@imaginet.fr>
+ if($WINDIR) {
+ dl("php3_xml.dll");
+ } else {
+ dl("xml.so");
+ }
+}
+
+$xmlrpcI4="i4";
+$xmlrpcInt="int";
+$xmlrpcBoolean="boolean";
+$xmlrpcDouble="double";
+$xmlrpcString="string";
+$xmlrpcDateTime="dateTime.iso8601";
+$xmlrpcBase64="base64";
+$xmlrpcArray="array";
+$xmlrpcStruct="struct";
+
+
+$xmlrpcTypes=array($xmlrpcI4 => 1,
+ $xmlrpcInt => 1,
+ $xmlrpcBoolean => 1,
+ $xmlrpcString => 1,
+ $xmlrpcDouble => 1,
+ $xmlrpcDateTime => 1,
+ $xmlrpcBase64 => 1,
+ $xmlrpcArray => 2,
+ $xmlrpcStruct => 3);
+
+$xmlEntities=array( "amp" => "&",
+ "quot" => '"',
+ "lt" => "<",
+ "gt" => ">",
+ "apos" => "'");
+
+$xmlrpcerr["unknown_method"]=1;
+$xmlrpcstr["unknown_method"]="Unknown method";
+$xmlrpcerr["invalid_return"]=2;
+$xmlrpcstr["invalid_return"]="Invalid return payload: enabling debugging to examine incoming payload";
+$xmlrpcerr["incorrect_params"]=3;
+$xmlrpcstr["incorrect_params"]="Incorrect parameters passed to method";
+$xmlrpcerr["introspect_unknown"]=4;
+$xmlrpcstr["introspect_unknown"]="Can't introspect: method unknown";
+$xmlrpcerr["http_error"]=5;
+$xmlrpcstr["http_error"]="Didn't receive 200 OK from remote server.";
+$xmlrpcerr["no_data"]=6;
+$xmlrpcstr["no_data"]="No data received from server.";
+$xmlrpcerr["no_ssl"]=7;
+$xmlrpcstr["no_ssl"]="No SSL support compiled in.";
+$xmlrpcerr["curl_fail"]=8;
+$xmlrpcstr["curl_fail"]="CURL error";
+
+$xmlrpc_defencoding="UTF-8";
+
+$xmlrpcName="XML-RPC for PHP";
+$xmlrpcVersion="1.01";
+
+// let user errors start at 800
+$xmlrpcerruser=800;
+// let XML parse errors start at 100
+$xmlrpcerrxml=100;
+
+// formulate backslashes for escaping regexp
+$xmlrpc_backslash=chr(92).chr(92);
+
+// used to store state during parsing
+// quick explanation of components:
+// st - used to build up a string for evaluation
+// ac - used to accumulate values
+// qt - used to decide if quotes are needed for evaluation
+// cm - used to denote struct or array (comma needed)
+// isf - used to indicate a fault
+// lv - used to indicate "looking for a value": implements
+// the logic to allow values with no types to be strings
+// params - used to store parameters in method calls
+// method - used to store method name
+
+$_xh=array();
+
+function xmlrpc_entity_decode($string) {
+ $top=split("&", $string);
+ $op="";
+ $i=0;
+ while($i<sizeof($top)) {
+ if (ereg("^([#a-zA-Z0-9]+);", $top[$i], $regs)) {
+ $op.=ereg_replace("^[#a-zA-Z0-9]+;",
+ xmlrpc_lookup_entity($regs[1]),
+ $top[$i]);
+ } else {
+ if ($i==0)
+ $op=$top[$i];
+ else
+ $op.="&" . $top[$i];
+ }
+ $i++;
+ }
+ return $op;
+}
+
+function xmlrpc_lookup_entity($ent) {
+ global $xmlEntities;
+
+ if (isset($xmlEntities[strtolower($ent)]))
+ return $xmlEntities[strtolower($ent)];
+ if (ereg("^#([0-9]+)$", $ent, $regs))
+ return chr($regs[1]);
+ return "?";
+}
+
+function xmlrpc_se($parser, $name, $attrs) {
+ global $_xh, $xmlrpcDateTime, $xmlrpcString;
+
+ switch($name) {
+ case "STRUCT":
+ case "ARRAY":
+ $_xh[$parser]['st'].="array(";
+ $_xh[$parser]['cm']++;
+ // this last line turns quoting off
+ // this means if we get an empty array we'll
+ // simply get a bit of whitespace in the eval
+ $_xh[$parser]['qt']=0;
+ break;
+ case "NAME":
+ $_xh[$parser]['st'].="'"; $_xh[$parser]['ac']="";
+ break;
+ case "FAULT":
+ $_xh[$parser]['isf']=1;
+ break;
+ case "PARAM":
+ $_xh[$parser]['st']="";
+ break;
+ case "VALUE":
+ $_xh[$parser]['st'].="new xmlrpcval(";
+ $_xh[$parser]['vt']=$xmlrpcString;
+ $_xh[$parser]['ac']="";
+ $_xh[$parser]['qt']=0;
+ $_xh[$parser]['lv']=1;
+ // look for a value: if this is still 1 by the
+ // time we reach the first data segment then the type is string
+ // by implication and we need to add in a quote
+ break;
+
+ case "I4":
+ case "INT":
+ case "STRING":
+ case "BOOLEAN":
+ case "DOUBLE":
+ case "DATETIME.ISO8601":
+ case "BASE64":
+ $_xh[$parser]['ac']=""; // reset the accumulator
+
+ if ($name=="DATETIME.ISO8601" || $name=="STRING") {
+ $_xh[$parser]['qt']=1;
+ if ($name=="DATETIME.ISO8601")
+ $_xh[$parser]['vt']=$xmlrpcDateTime;
+ } else if ($name=="BASE64") {
+ $_xh[$parser]['qt']=2;
+ } else {
+ // No quoting is required here -- but
+ // at the end of the element we must check
+ // for data format errors.
+ $_xh[$parser]['qt']=0;
+ }
+ break;
+ case "MEMBER":
+ $_xh[$parser]['ac']="";
+ break;
+ default:
+ break;
+ }
+
+ if ($name!="VALUE") $_xh[$parser]['lv']=0;
+}
+
+function xmlrpc_ee($parser, $name) {
+ global $_xh,$xmlrpcTypes,$xmlrpcString;
+
+ switch($name) {
+ case "STRUCT":
+ case "ARRAY":
+ if ($_xh[$parser]['cm'] && substr($_xh[$parser]['st'], -1) ==',') {
+ $_xh[$parser]['st']=substr($_xh[$parser]['st'],0,-1);
+ }
+ $_xh[$parser]['st'].=")";
+ $_xh[$parser]['vt']=strtolower($name);
+ $_xh[$parser]['cm']--;
+ break;
+ case "NAME":
+ $_xh[$parser]['st'].= $_xh[$parser]['ac'] . "' => ";
+ break;
+ case "BOOLEAN":
+ // special case here: we translate boolean 1 or 0 into PHP
+ // constants true or false
+ if ($_xh[$parser]['ac']=='1')
+ $_xh[$parser]['ac']="true";
+ else
+ $_xh[$parser]['ac']="false";
+ $_xh[$parser]['vt']=strtolower($name);
+ // Drop through intentionally.
+ case "I4":
+ case "INT":
+ case "STRING":
+ case "DOUBLE":
+ case "DATETIME.ISO8601":
+ case "BASE64":
+ if ($_xh[$parser]['qt']==1) {
+ // we use double quotes rather than single so backslashification works OK
+ $_xh[$parser]['st'].="\"". $_xh[$parser]['ac'] . "\"";
+ } else if ($_xh[$parser]['qt']==2) {
+ $_xh[$parser]['st'].="base64_decode('". $_xh[$parser]['ac'] . "')";
+ } else if ($name=="BOOLEAN") {
+ $_xh[$parser]['st'].=$_xh[$parser]['ac'];
+ } else {
+ // we have an I4, INT or a DOUBLE
+ // we must check that only 0123456789-.<space> are characters here
+ if (!ereg("^\-?[0123456789 \t\.]+$", $_xh[$parser]['ac'])) {
+ // TODO: find a better way of throwing an error
+ // than this!
+ error_log("XML-RPC: non numeric value received in INT or DOUBLE");
+ $_xh[$parser]['st'].="ERROR_NON_NUMERIC_FOUND";
+ } else {
+ // it's ok, add it on
+ $_xh[$parser]['st'].=$_xh[$parser]['ac'];
+ }
+ }
+ $_xh[$parser]['ac']=""; $_xh[$parser]['qt']=0;
+ $_xh[$parser]['lv']=3; // indicate we've found a value
+ break;
+ case "VALUE":
+ // deal with a string value
+ if (strlen($_xh[$parser]['ac'])>0 &&
+ $_xh[$parser]['vt']==$xmlrpcString) {
+ $_xh[$parser]['st'].="\"". $_xh[$parser]['ac'] . "\"";
+ }
+ // This if() detects if no scalar was inside <VALUE></VALUE>
+ // and pads an empty "".
+ if($_xh[$parser]['st'][strlen($_xh[$parser]['st'])-1] == '(') {
+ $_xh[$parser]['st'].= '""';
+ }
+ $_xh[$parser]['st'].=", '" . $_xh[$parser]['vt'] . "')";
+ if ($_xh[$parser]['cm']) $_xh[$parser]['st'].=",";
+ break;
+ case "MEMBER":
+ $_xh[$parser]['ac']=""; $_xh[$parser]['qt']=0;
+ break;
+ case "DATA":
+ $_xh[$parser]['ac']=""; $_xh[$parser]['qt']=0;
+ break;
+ case "PARAM":
+ $_xh[$parser]['params'][]=$_xh[$parser]['st'];
+ break;
+ case "METHODNAME":
+ $_xh[$parser]['method']=ereg_replace("^[\n\r\t ]+", "",
+ $_xh[$parser]['ac']);
+ break;
+ case "BOOLEAN":
+ // special case here: we translate boolean 1 or 0 into PHP
+ // constants true or false
+ if ($_xh[$parser]['ac']=='1')
+ $_xh[$parser]['ac']="true";
+ else
+ $_xh[$parser]['ac']="false";
+ $_xh[$parser]['vt']=strtolower($name);
+ break;
+ default:
+ break;
+ }
+ // if it's a valid type name, set the type
+ if (isset($xmlrpcTypes[strtolower($name)])) {
+ $_xh[$parser]['vt']=strtolower($name);
+ }
+
+}
+
+function xmlrpc_cd($parser, $data)
+{
+ global $_xh, $xmlrpc_backslash;
+
+ //if (ereg("^[\n\r \t]+$", $data)) return;
+ // print "adding [${data}]\n";
+
+ if ($_xh[$parser]['lv']!=3) {
+ // "lookforvalue==3" means that we've found an entire value
+ // and should discard any further character data
+ if ($_xh[$parser]['lv']==1) {
+ // if we've found text and we're just in a <value> then
+ // turn quoting on, as this will be a string
+ $_xh[$parser]['qt']=1;
+ // and say we've found a value
+ $_xh[$parser]['lv']=2;
+ }
+ // replace characters that eval would
+ // do special things with
+ $_xh[$parser]['ac'].=str_replace('$', '\$',
+ str_replace('"', '\"', str_replace(chr(92),
+ $xmlrpc_backslash, $data)));
+ }
+}
+
+function xmlrpc_dh($parser, $data)
+{
+ global $_xh;
+ if (substr($data, 0, 1) == "&" && substr($data, -1, 1) == ";") {
+ if ($_xh[$parser]['lv']==1) {
+ $_xh[$parser]['qt']=1;
+ $_xh[$parser]['lv']=2;
+ }
+ $_xh[$parser]['ac'].=str_replace('$', '\$',
+ str_replace('"', '\"', str_replace(chr(92),
+ $xmlrpc_backslash, $data)));
+ }
+}
+
+class xmlrpc_client {
+ var $path;
+ var $server;
+ var $port;
+ var $errno;
+ var $errstring;
+ var $debug=0;
+ var $username="";
+ var $password="";
+ var $cert="";
+ var $certpass="";
+
+ function xmlrpc_client($path, $server, $port=0) {
+ $this->port=$port; $this->server=$server; $this->path=$path;
+ }
+
+ function setDebug($in) {
+ if ($in) {
+ $this->debug=1;
+ } else {
+ $this->debug=0;
+ }
+ }
+
+ function setCredentials($u, $p) {
+ $this->username=$u;
+ $this->password=$p;
+ }
+
+ function setCertificate($cert, $certpass) {
+ $this->cert = $cert;
+ $this->certpass = $certpass;
+ }
+
+ function send($msg, $timeout=0, $method='http') {
+ // where msg is an xmlrpcmsg
+ $msg->debug=$this->debug;
+
+ if ($method == 'https') {
+ return $this->sendPayloadHTTPS($msg,
+ $this->server,
+ $this->port, $timeout,
+ $this->username, $this->password,
+ $this->cert,
+ $this->certpass);
+ } else {
+ return $this->sendPayloadHTTP10($msg, $this->server, $this->port,
+ $timeout, $this->username,
+ $this->password);
+ }
+ }
+
+ function sendPayloadHTTP10($msg, $server, $port, $timeout=0,
+ $username="", $password="") {
+ if ($port==0) $port=80;
+ if($timeout>0)
+ $fp=fsockopen($server, $port,
+ $this->errno, $this->errstr, $timeout);
+ else
+ $fp=fsockopen($server, $port,
+ $this->errno, $this->errstr);
+ if (!$fp) {
+ return 0;
+ }
+ // Only create the payload if it was not created previously
+ if(empty($msg->payload)) $msg->createPayload();
+
+ // thanks to Grant Rauscher <grant7@firstworld.net>
+ // for this
+ $credentials="";
+ if ($username!="") {
+ $credentials="Authorization: Basic " .
+ base64_encode($username . ":" . $password) . "\r\n";
+ }
+
+ $op= "POST " . $this->path. " HTTP/1.0\r\nUser-Agent: PHP XMLRPC 1.0\r\n" .
+ "Host: ". $this->server . "\r\n" .
+ $credentials .
+ "Content-Type: text/xml\r\nContent-Length: " .
+ strlen($msg->payload) . "\r\n\r\n" .
+ $msg->payload;
+
+ if (!fputs($fp, $op, strlen($op))) {
+ $this->errstr="Write error";
+ return 0;
+ }
+ $resp=$msg->parseResponseFile($fp);
+ fclose($fp);
+ return $resp;
+ }
+
+ // contributed by Justin Miller <justin@voxel.net>
+ // requires curl to be built into PHP
+ function sendPayloadHTTPS($msg, $server, $port, $timeout=0,
+ $username="", $password="", $cert="",
+ $certpass="") {
+ global $xmlrpcerr, $xmlrpcstr;
+ if ($port == 0) $port = 443;
+
+ // Only create the payload if it was not created previously
+ if(empty($msg->payload)) $msg->createPayload();
+
+ if (!function_exists("curl_init")) {
+ $r=new xmlrpcresp(0, $xmlrpcerr["no_ssl"],
+ $xmlrpcstr["no_ssl"]);
+ return $r;
+ }
+
+ $curl = curl_init("https://" . $server . ':' . $port .
+ $this->path);
+
+ curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
+ // results into variable
+ if ($this->debug) {
+ curl_setopt($curl, CURLOPT_VERBOSE, 1);
+ }
+ curl_setopt($curl, CURLOPT_USERAGENT, 'PHP XMLRPC 1.0');
+ // required for XMLRPC
+ curl_setopt($curl, CURLOPT_POST, 1);
+ // post the data
+ curl_setopt($curl, CURLOPT_POSTFIELDS, $msg->payload);
+ // the data
+ curl_setopt($curl, CURLOPT_HEADER, 1);
+ // return the header too
+ curl_setopt($curl, CURLOPT_HTTPHEADER, array('Content-Type: text/xml'));
+ // required for XMLRPC
+ if ($timeout) curl_setopt($curl, CURLOPT_TIMEOUT, $timeout == 1 ? 1 :
+ $timeout - 1);
+ // timeout is borked
+ if ($username && $password) curl_setopt($curl, CURLOPT_USERPWD,
+ "$username:$password");
+ // set auth stuff
+ if ($cert) curl_setopt($curl, CURLOPT_SSLCERT, $cert);
+ // set cert file
+ if ($certpass) curl_setopt($curl, CURLOPT_SSLCERTPASSWD,
+ $certpass);
+ // set cert password
+
+ $result = curl_exec($curl);
+
+ if (!$result) {
+ $resp=new xmlrpcresp(0,
+ $xmlrpcerr["curl_fail"],
+ $xmlrpcstr["curl_fail"]. ": ".
+ curl_error($curl));
+ } else {
+ $resp = $msg->parseResponse($result);
+ }
+ curl_close($curl);
+ return $resp;
+ }
+
+} // end class xmlrpc_client
+
+class xmlrpcresp {
+ var $xv;
+ var $fn;
+ var $fs;
+ var $hdrs;
+
+ function xmlrpcresp($val, $fcode=0, $fstr="") {
+ if ($fcode!=0) {
+ $this->xv=0;
+ $this->fn=$fcode;
+ $this->fs=htmlspecialchars($fstr);
+ } else {
+ $this->xv=$val;
+ $this->fn=0;
+ }
+ }
+
+ function faultCode() {
+ if (isset($this->fn))
+ return $this->fn;
+ else
+ return 0;
+ }
+
+ function faultString() { return $this->fs; }
+ function value() { return $this->xv; }
+
+ function serialize() {
+ $rs="<methodResponse>\n";
+ if ($this->fn) {
+ $rs.="<fault>
+ <value>
+ <struct>
+ <member>
+ <name>faultCode</name>
+ <value><int>" . $this->fn . "</int></value>
+ </member>
+ <member>
+ <name>faultString</name>
+ <value><string>" . $this->fs . "</string></value>
+ </member>
+ </struct>
+ </value>
+</fault>";
+ } else {
+ $rs.="<params>\n<param>\n" . $this->xv->serialize() .
+ "</param>\n</params>";
+ }
+ $rs.="\n</methodResponse>";
+ return $rs;
+ }
+}
+
+class xmlrpcmsg {
+ var $payload;
+ var $methodname;
+ var $params=array();
+ var $debug=0;
+
+ function xmlrpcmsg($meth, $pars=0) {
+ $this->methodname=$meth;
+ if (is_array($pars) && sizeof($pars)>0) {
+ for($i=0; $i<sizeof($pars); $i++)
+ $this->addParam($pars[$i]);
+ }
+ }
+
+ function xml_header() {
+ return "<?xml version=\"1.0\"?>\n<methodCall>\n";
+ }
+
+ function xml_footer() {
+ return "</methodCall>\n";
+ }
+
+ function createPayload() {
+ $this->payload=$this->xml_header();
+ $this->payload.="<methodName>" . $this->methodname . "</methodName>\n";
+ // if (sizeof($this->params)) {
+ $this->payload.="<params>\n";
+ for($i=0; $i<sizeof($this->params); $i++) {
+ $p=$this->params[$i];
+ $this->payload.="<param>\n" . $p->serialize() .
+ "</param>\n";
+ }
+ $this->payload.="</params>\n";
+ // }
+ $this->payload.=$this->xml_footer();
+ $this->payload=str_replace("\n", "\r\n", $this->payload);
+ }
+
+ function method($meth="") {
+ if ($meth!="") {
+ $this->methodname=$meth;
+ }
+ return $this->methodname;
+ }
+
+ function serialize() {
+ $this->createPayload();
+ return $this->payload;
+ }
+
+ function addParam($par) { $this->params[]=$par; }
+ function getParam($i) { return $this->params[$i]; }
+ function getNumParams() { return sizeof($this->params); }
+
+ function parseResponseFile($fp) {
+ $ipd="";
+
+ while($data=fread($fp, 32768)) {
+ $ipd.=$data;
+ }
+ return $this->parseResponse($ipd);
+ }
+
+ function parseResponse($data="") {
+ global $_xh,$xmlrpcerr,$xmlrpcstr;
+ global $xmlrpc_defencoding;
+
+
+ $parser = xml_parser_create($xmlrpc_defencoding);
+
+ $_xh[$parser]=array();
+
+ $_xh[$parser]['st']="";
+ $_xh[$parser]['cm']=0;
+ $_xh[$parser]['isf']=0;
+ $_xh[$parser]['ac']="";
+ $_xh[$parser]['qt']="";
+
+ xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, true);
+ xml_set_element_handler($parser, "xmlrpc_se", "xmlrpc_ee");
+ xml_set_character_data_handler($parser, "xmlrpc_cd");
+ xml_set_default_handler($parser, "xmlrpc_dh");
+ $xmlrpc_value=new xmlrpcval;
+
+ $hdrfnd=0;
+ if ($this->debug)
+ print "<PRE>---GOT---\n" . htmlspecialchars($data) .
+ "\n---END---\n</PRE>";
+ if ($data=="") {
+ error_log("No response received from server.");
+ $r=new xmlrpcresp(0, $xmlrpcerr["no_data"],
+ $xmlrpcstr["no_data"]);
+ xml_parser_free($parser);
+ return $r;
+ }
+ // see if we got an HTTP 200 OK, else bomb
+ // but only do this if we're using the HTTP protocol.
+ if (ereg("^HTTP",$data) &&
+ !ereg("^HTTP/[0-9\.]+ 200 ", $data)) {
+ $errstr= substr($data, 0, strpos($data, "\n")-1);
+ error_log("HTTP error, got response: " .$errstr);
+ $r=new xmlrpcresp(0, $xmlrpcerr["http_error"],
+ $xmlrpcstr["http_error"]. " (" . $errstr . ")");
+ xml_parser_free($parser);
+ return $r;
+ }
+ // gotta get rid of headers here
+ if ((!$hdrfnd) && ereg("^(.*)\r\n\r\n",$data,$_xh[$parser]['ha'])) {
+ $data=ereg_replace("^.*\r\n\r\n", "", $data);
+ $hdrfnd=1;
+ }
+
+ if (!xml_parse($parser, $data, sizeof($data))) {
+ // thanks to Peter Kocks <peter.kocks@baygate.com>
+ if((xml_get_current_line_number($parser)) == 1)
+ $errstr = "XML error at line 1, check URL";
+ else
+ $errstr = sprintf("XML error: %s at line %d",
+ xml_error_string(xml_get_error_code($parser)),
+ xml_get_current_line_number($parser));
+ error_log($errstr);
+ $r=new xmlrpcresp(0, $xmlrpcerr["invalid_return"],
+ $xmlrpcstr["invalid_return"]);
+ xml_parser_free($parser);
+ return $r;
+ }
+ xml_parser_free($parser);
+ if ($this->debug) {
+ print "<PRE>---EVALING---[" .
+ strlen($_xh[$parser]['st']) . " chars]---\n" .
+ htmlspecialchars($_xh[$parser]['st']) . ";\n---END---</PRE>";
+ }
+ if (strlen($_xh[$parser]['st'])==0) {
+ // then something odd has happened
+ // and it's time to generate a client side error
+ // indicating something odd went on
+ $r=new xmlrpcresp(0, $xmlrpcerr["invalid_return"],
+ $xmlrpcstr["invalid_return"]);
+ } else {
+ eval('$v=' . $_xh[$parser]['st'] . '; $allOK=1;');
+ if ($_xh[$parser]['isf']) {
+ $f=$v->structmem("faultCode");
+ $fs=$v->structmem("faultString");
+ $r=new xmlrpcresp($v, $f->scalarval(),
+ $fs->scalarval());
+ } else {
+ $r=new xmlrpcresp($v);
+ }
+ }
+ $r->hdrs=split("\r?\n", $_xh[$parser]['ha'][1]);
+ return $r;
+ }
+
+}
+
+class xmlrpcval {
+ var $me=array();
+ var $mytype=0;
+
+ function xmlrpcval($val=-1, $type="") {
+ global $xmlrpcTypes;
+ $this->me=array();
+ $this->mytype=0;
+ if ($val!=-1 || $type!="") {
+ if ($type=="") $type="string";
+ if ($xmlrpcTypes[$type]==1) {
+ $this->addScalar($val,$type);
+ }
+ else if ($xmlrpcTypes[$type]==2)
+ $this->addArray($val);
+ else if ($xmlrpcTypes[$type]==3)
+ $this->addStruct($val);
+ }
+ }
+
+ function addScalar($val, $type="string") {
+ global $xmlrpcTypes, $xmlrpcBoolean;
+
+ if ($this->mytype==1) {
+ echo "<B>xmlrpcval</B>: scalar can have only one value<BR>";
+ return 0;
+ }
+ $typeof=$xmlrpcTypes[$type];
+ if ($typeof!=1) {
+ echo "<B>xmlrpcval</B>: not a scalar type (${typeof})<BR>";
+ return 0;
+ }
+
+ if ($type==$xmlrpcBoolean) {
+ if (strcasecmp($val,"true")==0 ||
+ $val==1 || ($val==true &&
+ strcasecmp($val,"false"))) {
+ $val=1;
+ } else {
+ $val=0;
+ }
+ }
+
+ if ($this->mytype==2) {
+ // we're adding to an array here
+ $ar=$this->me["array"];
+ $ar[]=new xmlrpcval($val, $type);
+ $this->me["array"]=$ar;
+ } else {
+ // a scalar, so set the value and remember we're scalar
+ $this->me[$type]=$val;
+ $this->mytype=$typeof;
+ }
+ return 1;
+ }
+
+ function addArray($vals) {
+ global $xmlrpcTypes;
+ if ($this->mytype!=0) {
+ echo "<B>xmlrpcval</B>: already initialized as a [" .
+ $this->kindOf() . "]<BR>";
+ return 0;
+ }
+
+ $this->mytype=$xmlrpcTypes["array"];
+ $this->me["array"]=$vals;
+ return 1;
+ }
+
+ function addStruct($vals) {
+ global $xmlrpcTypes;
+ if ($this->mytype!=0) {
+ echo "<B>xmlrpcval</B>: already initialized as a [" .
+ $this->kindOf() . "]<BR>";
+ return 0;
+ }
+ $this->mytype=$xmlrpcTypes["struct"];
+ $this->me["struct"]=$vals;
+ return 1;
+ }
+
+ function dump($ar) {
+ reset($ar);
+ while ( list( $key, $val ) = each( $ar ) ) {
+ echo "$key => $val<br>";
+ if ($key == 'array')
+ while ( list( $key2, $val2 ) = each( $val ) ) {
+ echo "-- $key2 => $val2<br>";
+ }
+ }
+ }
+
+ function kindOf() {
+ switch($this->mytype) {
+ case 3:
+ return "struct";
+ break;
+ case 2:
+ return "array";
+ break;
+ case 1:
+ return "scalar";
+ break;
+ default:
+ return "undef";
+ }
+ }
+
+ function serializedata($typ, $val) {
+ $rs="";
+ global $xmlrpcTypes, $xmlrpcBase64, $xmlrpcString,
+ $xmlrpcBoolean;
+ switch($xmlrpcTypes[$typ]) {
+ case 3:
+ // struct
+ $rs.="<struct>\n";
+ reset($val);
+ while(list($key2, $val2)=each($val)) {
+ $rs.="<member><name>${key2}</name>\n";
+ $rs.=$this->serializeval($val2);
+ $rs.="</member>\n";
+ }
+ $rs.="</struct>";
+ break;
+ case 2:
+ // array
+ $rs.="<array>\n<data>\n";
+ for($i=0; $i<sizeof($val); $i++) {
+ $rs.=$this->serializeval($val[$i]);
+ }
+ $rs.="</data>\n</array>";
+ break;
+ case 1:
+ switch ($typ) {
+ case $xmlrpcBase64:
+ $rs.="<${typ}>" . base64_encode($val) . "</${typ}>";
+ break;
+ case $xmlrpcBoolean:
+ $rs.="<${typ}>" . ($val ? "1" : "0") . "</${typ}>";
+ break;
+ case $xmlrpcString:
+ $rs.="<${typ}>" . htmlspecialchars($val). "</${typ}>";
+ break;
+ default:
+ $rs.="<${typ}>${val}</${typ}>";
+ }
+ break;
+ default:
+ break;
+ }
+ return $rs;
+ }
+
+ function serialize() {
+ return $this->serializeval($this);
+ }
+
+ function serializeval($o) {
+ global $xmlrpcTypes;
+ $rs="";
+ $ar=$o->me;
+ reset($ar);
+ list($typ, $val) = each($ar);
+ $rs.="<value>";
+ $rs.=$this->serializedata($typ, $val);
+ $rs.="</value>\n";
+ return $rs;
+ }
+
+ function structmem($m) {
+ $nv=$this->me["struct"][$m];
+ return $nv;
+ }
+
+ function structreset() {
+ reset($this->me["struct"]);
+ }
+
+ function structeach() {
+ return each($this->me["struct"]);
+ }
+
+ function getval() {
+ // UNSTABLE
+ global $xmlrpcBoolean, $xmlrpcBase64;
+ reset($this->me);
+ list($a,$b)=each($this->me);
+ // contributed by I Sofer, 2001-03-24
+ // add support for nested arrays to scalarval
+ // i've created a new method here, so as to
+ // preserve back compatibility
+
+ if (is_array($b)) {
+ foreach ($b as $id => $cont) {
+ $b[$id] = $cont->scalarval();
+ }
+ }
+
+ // add support for structures directly encoding php objects
+ if (is_object($b)) {
+ $t = get_object_vars($b);
+ foreach ($t as $id => $cont) {
+ $t[$id] = $cont->scalarval();
+ }
+ foreach ($t as $id => $cont) {
+ eval('$b->'.$id.' = $cont;');
+ }
+ }
+ // end contrib
+ return $b;
+ }
+
+ function scalarval() {
+ global $xmlrpcBoolean, $xmlrpcBase64;
+ reset($this->me);
+ list($a,$b)=each($this->me);
+ return $b;
+ }
+
+ function scalartyp() {
+ global $xmlrpcI4, $xmlrpcInt;
+ reset($this->me);
+ list($a,$b)=each($this->me);
+ if ($a==$xmlrpcI4)
+ $a=$xmlrpcInt;
+ return $a;
+ }
+
+ function arraymem($m) {
+ $nv=$this->me["array"][$m];
+ return $nv;
+ }
+
+ function arraysize() {
+ reset($this->me);
+ list($a,$b)=each($this->me);
+ return sizeof($b);
+ }
+}
+
+// date helpers
+function iso8601_encode($timet, $utc=0) {
+ // return an ISO8601 encoded string
+ // really, timezones ought to be supported
+ // but the XML-RPC spec says:
+ //
+ // "Don't assume a timezone. It should be specified by the server in its
+ // documentation what assumptions it makes about timezones."
+ //
+ // these routines always assume localtime unless
+ // $utc is set to 1, in which case UTC is assumed
+ // and an adjustment for locale is made when encoding
+ if (!$utc) {
+ $t=strftime("%Y%m%dT%H:%M:%S", $timet);
+ } else {
+ if (function_exists("gmstrftime"))
+ // gmstrftime doesn't exist in some versions
+ // of PHP
+ $t=gmstrftime("%Y%m%dT%H:%M:%S", $timet);
+ else {
+ $t=strftime("%Y%m%dT%H:%M:%S", $timet-date("Z"));
+ }
+ }
+ return $t;
+}
+
+function iso8601_decode($idate, $utc=0) {
+ // return a timet in the localtime, or UTC
+ $t=0;
+ if (ereg("([0-9]{4})([0-9]{2})([0-9]{2})T([0-9]{2}):([0-9]{2}):([0-9]{2})",
+ $idate, $regs)) {
+ if ($utc) {
+ $t=gmmktime($regs[4], $regs[5], $regs[6], $regs[2], $regs[3], $regs[1]);
+ } else {
+ $t=mktime($regs[4], $regs[5], $regs[6], $regs[2], $regs[3], $regs[1]);
+ }
+ }
+ return $t;
+}
+
+/****************************************************************
+* xmlrpc_decode takes a message in PHP xmlrpc object format and *
+* tranlates it into native PHP types. *
+* *
+* author: Dan Libby (dan@libby.com) *
+****************************************************************/
+function xmlrpc_decode($xmlrpc_val) {
+ $kind = $xmlrpc_val->kindOf();
+
+ if($kind == "scalar") {
+ return $xmlrpc_val->scalarval();
+ }
+ else if($kind == "array") {
+ $size = $xmlrpc_val->arraysize();
+ $arr = array();
+
+ for($i = 0; $i < $size; $i++) {
+ $arr[]=xmlrpc_decode($xmlrpc_val->arraymem($i));
+ }
+ return $arr;
+ }
+ else if($kind == "struct") {
+ $xmlrpc_val->structreset();
+ $arr = array();
+
+ while(list($key,$value)=$xmlrpc_val->structeach()) {
+ $arr[$key] = xmlrpc_decode($value);
+ }
+ return $arr;
+ }
+}
+
+/****************************************************************
+* xmlrpc_encode takes native php types and encodes them into *
+* xmlrpc PHP object format. *
+* BUG: All sequential arrays are turned into structs. I don't *
+* know of a good way to determine if an array is sequential *
+* only. *
+* *
+* feature creep -- could support more types via optional type *
+* argument. *
+* *
+* author: Dan Libby (dan@libby.com) *
+****************************************************************/
+function xmlrpc_encode($php_val) {
+ global $xmlrpcInt;
+ global $xmlrpcDouble;
+ global $xmlrpcString;
+ global $xmlrpcArray;
+ global $xmlrpcStruct;
+ global $xmlrpcBoolean;
+
+ $type = gettype($php_val);
+ $xmlrpc_val = new xmlrpcval;
+
+ switch($type) {
+ case "array":
+ case "object":
+ $arr = array();
+ while (list($k,$v) = each($php_val)) {
+ $arr[$k] = xmlrpc_encode($v);
+ }
+ $xmlrpc_val->addStruct($arr);
+ break;
+ case "integer":
+ $xmlrpc_val->addScalar($php_val, $xmlrpcInt);
+ break;
+ case "double":
+ $xmlrpc_val->addScalar($php_val, $xmlrpcDouble);
+ break;
+ case "string":
+ $xmlrpc_val->addScalar($php_val, $xmlrpcString);
+ break;
+// <G_Giunta_2001-02-29>
+// Add support for encoding/decoding of booleans, since they are supported in PHP
+ case "boolean":
+ $xmlrpc_val->addScalar($php_val, $xmlrpcBoolean);
+ break;
+// </G_Giunta_2001-02-29>
+ case "unknown type":
+ default:
+ // giancarlo pinerolo <ping@alt.it>
+ // it has to return
+ // an empty object in case (which is already
+ // at this point), not a boolean.
+ break;
+ }
+ return $xmlrpc_val;
+}
+
+?>
diff --git a/modules/blog.module b/modules/blog.module index 02350798c..2bf42e3f3 100644 --- a/modules/blog.module +++ b/modules/blog.module @@ -225,7 +225,7 @@ function blog_page_last() { $theme->box(t("User blogs"), $output, "main"); } -function blog_form($node, $help, $error) { +function blog_form(&$node, &$help, &$error) { global $nid, $iid; diff --git a/modules/blog/blog.module b/modules/blog/blog.module index 02350798c..2bf42e3f3 100644 --- a/modules/blog/blog.module +++ b/modules/blog/blog.module @@ -225,7 +225,7 @@ function blog_page_last() { $theme->box(t("User blogs"), $output, "main"); } -function blog_form($node, $help, $error) { +function blog_form(&$node, &$help, &$error) { global $nid, $iid; diff --git a/modules/book.module b/modules/book.module index 7f7d48409..99d3f2d24 100644 --- a/modules/book.module +++ b/modules/book.module @@ -133,12 +133,12 @@ function book_update($node) { db_query("UPDATE book SET parent = '$node->parent', weight = '$node->weight' WHERE nid = '$node->nid'"); } -function book_delete($node) { +function book_delete(&$node) { db_query("DELETE FROM book WHERE nid = '$node->nid'"); } -function book_form($node, $help, $error) { +function book_form(&$node, &$help, &$error) { global $user; $output .= form_select(t("Parent"), "parent", $node->parent, book_toc(), t("The parent subject or category the page belongs in.")); diff --git a/modules/book/book.module b/modules/book/book.module index 7f7d48409..99d3f2d24 100644 --- a/modules/book/book.module +++ b/modules/book/book.module @@ -133,12 +133,12 @@ function book_update($node) { db_query("UPDATE book SET parent = '$node->parent', weight = '$node->weight' WHERE nid = '$node->nid'"); } -function book_delete($node) { +function book_delete(&$node) { db_query("DELETE FROM book WHERE nid = '$node->nid'"); } -function book_form($node, $help, $error) { +function book_form(&$node, &$help, &$error) { global $user; $output .= form_select(t("Parent"), "parent", $node->parent, book_toc(), t("The parent subject or category the page belongs in.")); diff --git a/modules/forum.module b/modules/forum.module index 528b9bb6c..53eaafce1 100644 --- a/modules/forum.module +++ b/modules/forum.module @@ -1,91 +1,91 @@ -<?php -// $Id$ - -function forum_node($field) { - $info["name"] = t("discussion forum"); - $info["description"] = t("A forum is a threaded discussion, enabling users to communicate about a particular topic."); - - return $info[$field]; -} - -function forum_access($op, $node) { - if ($op == "view") { - return $node->status; - } -} - -function forum_save() { - if ($op == "approve") { - return array("status" => 1); - } - - if ($op == "create") { - return array("promote" => 0, "moderate" => 0, "status" => 1); - } - - if ($op == "update") { - return array(); - } - - if ($op == "update") { - return array("status" => 0); - } -} - -function forum_link($type) { - if ($type == "page" && user_access("access content")) { - $links[] = "<a href=\"module.php?mod=forum\">". t("forum") ."</a>"; - } - - return $links ? $links : array(); -} - -function forum_view($node) { - global $theme; - $output .= "<P><A HREF=\"module.php?mod=forum\">". t("Forum") ."</A> / <B><A HREF=\"node.php?id=$node->nid\">". check_output($node->title) ."</A></B>:</P><P>". check_output($node->body) ."</P>"; - $theme->box(t("Discussion forum"), $output); -} - -function forum_form($node, $help, $error) { - $output .= form_textarea("Body", "body", $node->body, 60, 10); - - return $output; -} - - -function forum_num_comments($nid) { - $value = db_fetch_object(db_query("SELECT COUNT(cid) AS count FROM comments WHERE lid = '$nid'")); - return ($value) ? $value->count : 0; -} - -function forum_last_comment($nid) { - $value = db_fetch_object(db_query("SELECT timestamp FROM comments WHERE lid = '$nid' ORDER BY timestamp DESC LIMIT 1")); - return ($value) ? format_date($value->timestamp, "small") : " "; -} - -function forum_page() { - global $theme; - - if (user_access("access content")) { - $result = db_query("SELECT nid FROM node WHERE type = 'forum' ORDER BY title"); - - $output .= "<table border=\"0\" cellspacing=\"4\" cellpadding=\"4\">"; - $output .= " <tr><th>". t("Forum") ."</th><th>". t("Comments") ."</th><th>". t("Last comment") ."</th></tr>"; - while ($node = db_fetch_object($result)) { - $node = node_load(array("nid" => $node->nid)); - $output .= " <tr><td><a href=\"node.php?id=$node->nid\">". check_output($node->title) ."</a><br /><small>". check_output($node->body, 1) ."</small></td><td align=\"center\">". forum_num_comments($node->nid) ."</td><td align=\"center\">". forum_last_comment($node->nid) ."</td></tr>"; - } - $output .= "</table>"; - - $theme->header(); - $theme->box(t("Discussion forum"), $output); - $theme->footer(); - } - else { - $theme->header(); - $theme->box(t("Access denied"), message_access()); - $theme->footer(); - } -} - +<?php
+// $Id$
+
+function forum_node($field) {
+ $info["name"] = t("discussion forum");
+ $info["description"] = t("A forum is a threaded discussion, enabling users to communicate about a particular topic.");
+
+ return $info[$field];
+}
+
+function forum_access($op, $node) {
+ if ($op == "view") {
+ return $node->status;
+ }
+}
+
+function forum_save() {
+ if ($op == "approve") {
+ return array("status" => 1);
+ }
+
+ if ($op == "create") {
+ return array("promote" => 0, "moderate" => 0, "status" => 1);
+ }
+
+ if ($op == "update") {
+ return array();
+ }
+
+ if ($op == "update") {
+ return array("status" => 0);
+ }
+}
+
+function forum_link($type) {
+ if ($type == "page" && user_access("access content")) {
+ $links[] = "<a href=\"module.php?mod=forum\">". t("forum") ."</a>";
+ }
+
+ return $links ? $links : array();
+}
+
+function forum_view($node) {
+ global $theme;
+ $output .= "<P><A HREF=\"module.php?mod=forum\">". t("Forum") ."</A> / <B><A HREF=\"node.php?id=$node->nid\">". check_output($node->title) ."</A></B>:</P><P>". check_output($node->body) ."</P>";
+ $theme->box(t("Discussion forum"), $output);
+}
+
+function forum_form(&$node, &$help, &$error) {
+ $output .= form_textarea("Body", "body", $node->body, 60, 10);
+
+ return $output;
+}
+
+
+function forum_num_comments($nid) {
+ $value = db_fetch_object(db_query("SELECT COUNT(cid) AS count FROM comments WHERE lid = '$nid'"));
+ return ($value) ? $value->count : 0;
+}
+
+function forum_last_comment($nid) {
+ $value = db_fetch_object(db_query("SELECT timestamp FROM comments WHERE lid = '$nid' ORDER BY timestamp DESC LIMIT 1"));
+ return ($value) ? format_date($value->timestamp, "small") : " ";
+}
+
+function forum_page() {
+ global $theme;
+
+ if (user_access("access content")) {
+ $result = db_query("SELECT nid FROM node WHERE type = 'forum' ORDER BY title");
+
+ $output .= "<table border=\"0\" cellspacing=\"4\" cellpadding=\"4\">";
+ $output .= " <tr><th>". t("Forum") ."</th><th>". t("Comments") ."</th><th>". t("Last comment") ."</th></tr>";
+ while ($node = db_fetch_object($result)) {
+ $node = node_load(array("nid" => $node->nid));
+ $output .= " <tr><td><a href=\"node.php?id=$node->nid\">". check_output($node->title) ."</a><br /><small>". check_output($node->body, 1) ."</small></td><td align=\"center\">". forum_num_comments($node->nid) ."</td><td align=\"center\">". forum_last_comment($node->nid) ."</td></tr>";
+ }
+ $output .= "</table>";
+
+ $theme->header();
+ $theme->box(t("Discussion forum"), $output);
+ $theme->footer();
+ }
+ else {
+ $theme->header();
+ $theme->box(t("Access denied"), message_access());
+ $theme->footer();
+ }
+}
+
?>
\ No newline at end of file diff --git a/modules/forum/forum.module b/modules/forum/forum.module index 528b9bb6c..53eaafce1 100644 --- a/modules/forum/forum.module +++ b/modules/forum/forum.module @@ -1,91 +1,91 @@ -<?php -// $Id$ - -function forum_node($field) { - $info["name"] = t("discussion forum"); - $info["description"] = t("A forum is a threaded discussion, enabling users to communicate about a particular topic."); - - return $info[$field]; -} - -function forum_access($op, $node) { - if ($op == "view") { - return $node->status; - } -} - -function forum_save() { - if ($op == "approve") { - return array("status" => 1); - } - - if ($op == "create") { - return array("promote" => 0, "moderate" => 0, "status" => 1); - } - - if ($op == "update") { - return array(); - } - - if ($op == "update") { - return array("status" => 0); - } -} - -function forum_link($type) { - if ($type == "page" && user_access("access content")) { - $links[] = "<a href=\"module.php?mod=forum\">". t("forum") ."</a>"; - } - - return $links ? $links : array(); -} - -function forum_view($node) { - global $theme; - $output .= "<P><A HREF=\"module.php?mod=forum\">". t("Forum") ."</A> / <B><A HREF=\"node.php?id=$node->nid\">". check_output($node->title) ."</A></B>:</P><P>". check_output($node->body) ."</P>"; - $theme->box(t("Discussion forum"), $output); -} - -function forum_form($node, $help, $error) { - $output .= form_textarea("Body", "body", $node->body, 60, 10); - - return $output; -} - - -function forum_num_comments($nid) { - $value = db_fetch_object(db_query("SELECT COUNT(cid) AS count FROM comments WHERE lid = '$nid'")); - return ($value) ? $value->count : 0; -} - -function forum_last_comment($nid) { - $value = db_fetch_object(db_query("SELECT timestamp FROM comments WHERE lid = '$nid' ORDER BY timestamp DESC LIMIT 1")); - return ($value) ? format_date($value->timestamp, "small") : " "; -} - -function forum_page() { - global $theme; - - if (user_access("access content")) { - $result = db_query("SELECT nid FROM node WHERE type = 'forum' ORDER BY title"); - - $output .= "<table border=\"0\" cellspacing=\"4\" cellpadding=\"4\">"; - $output .= " <tr><th>". t("Forum") ."</th><th>". t("Comments") ."</th><th>". t("Last comment") ."</th></tr>"; - while ($node = db_fetch_object($result)) { - $node = node_load(array("nid" => $node->nid)); - $output .= " <tr><td><a href=\"node.php?id=$node->nid\">". check_output($node->title) ."</a><br /><small>". check_output($node->body, 1) ."</small></td><td align=\"center\">". forum_num_comments($node->nid) ."</td><td align=\"center\">". forum_last_comment($node->nid) ."</td></tr>"; - } - $output .= "</table>"; - - $theme->header(); - $theme->box(t("Discussion forum"), $output); - $theme->footer(); - } - else { - $theme->header(); - $theme->box(t("Access denied"), message_access()); - $theme->footer(); - } -} - +<?php
+// $Id$
+
+function forum_node($field) {
+ $info["name"] = t("discussion forum");
+ $info["description"] = t("A forum is a threaded discussion, enabling users to communicate about a particular topic.");
+
+ return $info[$field];
+}
+
+function forum_access($op, $node) {
+ if ($op == "view") {
+ return $node->status;
+ }
+}
+
+function forum_save() {
+ if ($op == "approve") {
+ return array("status" => 1);
+ }
+
+ if ($op == "create") {
+ return array("promote" => 0, "moderate" => 0, "status" => 1);
+ }
+
+ if ($op == "update") {
+ return array();
+ }
+
+ if ($op == "update") {
+ return array("status" => 0);
+ }
+}
+
+function forum_link($type) {
+ if ($type == "page" && user_access("access content")) {
+ $links[] = "<a href=\"module.php?mod=forum\">". t("forum") ."</a>";
+ }
+
+ return $links ? $links : array();
+}
+
+function forum_view($node) {
+ global $theme;
+ $output .= "<P><A HREF=\"module.php?mod=forum\">". t("Forum") ."</A> / <B><A HREF=\"node.php?id=$node->nid\">". check_output($node->title) ."</A></B>:</P><P>". check_output($node->body) ."</P>";
+ $theme->box(t("Discussion forum"), $output);
+}
+
+function forum_form(&$node, &$help, &$error) {
+ $output .= form_textarea("Body", "body", $node->body, 60, 10);
+
+ return $output;
+}
+
+
+function forum_num_comments($nid) {
+ $value = db_fetch_object(db_query("SELECT COUNT(cid) AS count FROM comments WHERE lid = '$nid'"));
+ return ($value) ? $value->count : 0;
+}
+
+function forum_last_comment($nid) {
+ $value = db_fetch_object(db_query("SELECT timestamp FROM comments WHERE lid = '$nid' ORDER BY timestamp DESC LIMIT 1"));
+ return ($value) ? format_date($value->timestamp, "small") : " ";
+}
+
+function forum_page() {
+ global $theme;
+
+ if (user_access("access content")) {
+ $result = db_query("SELECT nid FROM node WHERE type = 'forum' ORDER BY title");
+
+ $output .= "<table border=\"0\" cellspacing=\"4\" cellpadding=\"4\">";
+ $output .= " <tr><th>". t("Forum") ."</th><th>". t("Comments") ."</th><th>". t("Last comment") ."</th></tr>";
+ while ($node = db_fetch_object($result)) {
+ $node = node_load(array("nid" => $node->nid));
+ $output .= " <tr><td><a href=\"node.php?id=$node->nid\">". check_output($node->title) ."</a><br /><small>". check_output($node->body, 1) ."</small></td><td align=\"center\">". forum_num_comments($node->nid) ."</td><td align=\"center\">". forum_last_comment($node->nid) ."</td></tr>";
+ }
+ $output .= "</table>";
+
+ $theme->header();
+ $theme->box(t("Discussion forum"), $output);
+ $theme->footer();
+ }
+ else {
+ $theme->header();
+ $theme->box(t("Access denied"), message_access());
+ $theme->footer();
+ }
+}
+
?>
\ No newline at end of file diff --git a/modules/node.module b/modules/node.module index 9ef069c5f..8aa15c96b 100644 --- a/modules/node.module +++ b/modules/node.module @@ -464,7 +464,7 @@ function node_feed() { } -function node_validate($node, $error = array()) { +function node_validate($node, &$error) { global $user; @@ -547,7 +547,7 @@ function node_form($edit) { ** Validate the node: */ - $edit = node_validate($edit, &$error); + $edit = node_validate($edit, $error); /* ** Get the node specific bits: @@ -555,7 +555,7 @@ function node_form($edit) { $function = $edit->type ."_form"; if (function_exists($function)) { - $form .= $function(&$edit, &$help, &$error); + $form .= $function($edit, $help, $error); } /* @@ -756,7 +756,7 @@ function node_submit($node) { ** Fixup the node when required: */ - $node = node_validate($node); + $node = node_validate($node, $error); /* ** Apply the filters: @@ -862,7 +862,7 @@ function node_delete($edit) { ** Call the node specific callback (if any): */ - module_invoke($node->type, "delete", &$node); + module_invoke($node->type, "delete", $node); watchdog("special", "$node->type: deleted '$node->title'"); $output = t("The node has been deleted."); diff --git a/modules/node/node.module b/modules/node/node.module index 9ef069c5f..8aa15c96b 100644 --- a/modules/node/node.module +++ b/modules/node/node.module @@ -464,7 +464,7 @@ function node_feed() { } -function node_validate($node, $error = array()) { +function node_validate($node, &$error) { global $user; @@ -547,7 +547,7 @@ function node_form($edit) { ** Validate the node: */ - $edit = node_validate($edit, &$error); + $edit = node_validate($edit, $error); /* ** Get the node specific bits: @@ -555,7 +555,7 @@ function node_form($edit) { $function = $edit->type ."_form"; if (function_exists($function)) { - $form .= $function(&$edit, &$help, &$error); + $form .= $function($edit, $help, $error); } /* @@ -756,7 +756,7 @@ function node_submit($node) { ** Fixup the node when required: */ - $node = node_validate($node); + $node = node_validate($node, $error); /* ** Apply the filters: @@ -862,7 +862,7 @@ function node_delete($edit) { ** Call the node specific callback (if any): */ - module_invoke($node->type, "delete", &$node); + module_invoke($node->type, "delete", $node); watchdog("special", "$node->type: deleted '$node->title'"); $output = t("The node has been deleted."); diff --git a/modules/page.module b/modules/page.module index 94bd375f3..ae84e8a41 100644 --- a/modules/page.module +++ b/modules/page.module @@ -1,94 +1,94 @@ -<?php -// $Id$ - -$GLOBALS["format"] = array(0 => "HTML", 1 => "PHP", 2 => "text"); - -function page_node($field) { - $info["name"] = t("static page"); - $info["description"] = t("If you just want to add a static page with a link in the menu to your site, this would be the best choice. Unlike a story, a page by-passes the submission queue."); - - return $info[$field]; -} - -function page_access($op, $node) { - if ($op == "view") { - return $node->status; - } -} - -function page_save($op, $node) { - if ($op == "approve") { - return array("status" => 1); - } - - if ($op == "create") { - return array("format", "link", "promote" => 0, "moderate" => 0, "status" => 1); - } - - if ($op == "decline") { - return array("status" => 0); - } - - if ($op == "update") { - return array("format", "link"); - } -} - -function page_insert($node) { - db_query("INSERT INTO page (nid, format, link) VALUES ('$node->nid', '$node->format', '$node->link')"); -} - -function page_update($node) { - db_query("UPDATE page SET format = '$node->format', link = '$node->link' WHERE nid = '$node->nid'"); -} - -function page_delete($node) { - db_query("DELETE FROM page WHERE nid = '$node->nid'"); -} - -function page_load($node) { - $page = db_fetch_object(db_query("SELECT format, link FROM page WHERE nid = '$node->nid'")); - return $page; -} - -function page_link($type) { - if ($type == "page") { - $result = db_query("SELECT nid, link FROM page WHERE link != '' ORDER BY link"); - while ($page = db_fetch_object($result)) { - $links[] = "<a href=\"node.php?id=$page->nid\">$page->link</a>"; - } - } - - return $links ? $links : array(); -} - -function page_view($node, $main = 0) { - global $format, $theme; - - switch ($format[$node->format]) { - case "PHP": - print eval($node->body); - break; - case "text": - $theme->box($node->title, nl2br(htmlentities($node->body))); - break; - default: - $theme->box($node->title, check_output($node->body, 1)); - } -} - -function page_form($node, $help, $error) { - global $format, $op; - - if ($op != t("Preview") && $format[$node->format] == "PHP") { - $node->body = addslashes($node->body); - } - - $output .= form_textarea("Body", "body", $node->body, 60, 20); - $output .= form_textfield("Link", "link", $node->link, 60, 64); - $output .= form_select("Type", "format", $node->format, $format); - - return $output; -} - +<?php
+// $Id$
+
+$GLOBALS["format"] = array(0 => "HTML", 1 => "PHP", 2 => "text");
+
+function page_node($field) {
+ $info["name"] = t("static page");
+ $info["description"] = t("If you just want to add a static page with a link in the menu to your site, this would be the best choice. Unlike a story, a page by-passes the submission queue.");
+
+ return $info[$field];
+}
+
+function page_access($op, $node) {
+ if ($op == "view") {
+ return $node->status;
+ }
+}
+
+function page_save($op, $node) {
+ if ($op == "approve") {
+ return array("status" => 1);
+ }
+
+ if ($op == "create") {
+ return array("format", "link", "promote" => 0, "moderate" => 0, "status" => 1);
+ }
+
+ if ($op == "decline") {
+ return array("status" => 0);
+ }
+
+ if ($op == "update") {
+ return array("format", "link");
+ }
+}
+
+function page_insert($node) {
+ db_query("INSERT INTO page (nid, format, link) VALUES ('$node->nid', '$node->format', '$node->link')");
+}
+
+function page_update($node) {
+ db_query("UPDATE page SET format = '$node->format', link = '$node->link' WHERE nid = '$node->nid'");
+}
+
+function page_delete(&$node) {
+ db_query("DELETE FROM page WHERE nid = '$node->nid'");
+}
+
+function page_load($node) {
+ $page = db_fetch_object(db_query("SELECT format, link FROM page WHERE nid = '$node->nid'"));
+ return $page;
+}
+
+function page_link($type) {
+ if ($type == "page") {
+ $result = db_query("SELECT nid, link FROM page WHERE link != '' ORDER BY link");
+ while ($page = db_fetch_object($result)) {
+ $links[] = "<a href=\"node.php?id=$page->nid\">$page->link</a>";
+ }
+ }
+
+ return $links ? $links : array();
+}
+
+function page_view($node, $main = 0) {
+ global $format, $theme;
+
+ switch ($format[$node->format]) {
+ case "PHP":
+ print eval($node->body);
+ break;
+ case "text":
+ $theme->box($node->title, nl2br(htmlentities($node->body)));
+ break;
+ default:
+ $theme->box($node->title, check_output($node->body, 1));
+ }
+}
+
+function page_form(&$node, &$help, &$error) {
+ global $format, $op;
+
+ if ($op != t("Preview") && $format[$node->format] == "PHP") {
+ $node->body = addslashes($node->body);
+ }
+
+ $output .= form_textarea("Body", "body", $node->body, 60, 20);
+ $output .= form_textfield("Link", "link", $node->link, 60, 64);
+ $output .= form_select("Type", "format", $node->format, $format);
+
+ return $output;
+}
+
?>
\ No newline at end of file diff --git a/modules/page/page.module b/modules/page/page.module index 94bd375f3..ae84e8a41 100644 --- a/modules/page/page.module +++ b/modules/page/page.module @@ -1,94 +1,94 @@ -<?php -// $Id$ - -$GLOBALS["format"] = array(0 => "HTML", 1 => "PHP", 2 => "text"); - -function page_node($field) { - $info["name"] = t("static page"); - $info["description"] = t("If you just want to add a static page with a link in the menu to your site, this would be the best choice. Unlike a story, a page by-passes the submission queue."); - - return $info[$field]; -} - -function page_access($op, $node) { - if ($op == "view") { - return $node->status; - } -} - -function page_save($op, $node) { - if ($op == "approve") { - return array("status" => 1); - } - - if ($op == "create") { - return array("format", "link", "promote" => 0, "moderate" => 0, "status" => 1); - } - - if ($op == "decline") { - return array("status" => 0); - } - - if ($op == "update") { - return array("format", "link"); - } -} - -function page_insert($node) { - db_query("INSERT INTO page (nid, format, link) VALUES ('$node->nid', '$node->format', '$node->link')"); -} - -function page_update($node) { - db_query("UPDATE page SET format = '$node->format', link = '$node->link' WHERE nid = '$node->nid'"); -} - -function page_delete($node) { - db_query("DELETE FROM page WHERE nid = '$node->nid'"); -} - -function page_load($node) { - $page = db_fetch_object(db_query("SELECT format, link FROM page WHERE nid = '$node->nid'")); - return $page; -} - -function page_link($type) { - if ($type == "page") { - $result = db_query("SELECT nid, link FROM page WHERE link != '' ORDER BY link"); - while ($page = db_fetch_object($result)) { - $links[] = "<a href=\"node.php?id=$page->nid\">$page->link</a>"; - } - } - - return $links ? $links : array(); -} - -function page_view($node, $main = 0) { - global $format, $theme; - - switch ($format[$node->format]) { - case "PHP": - print eval($node->body); - break; - case "text": - $theme->box($node->title, nl2br(htmlentities($node->body))); - break; - default: - $theme->box($node->title, check_output($node->body, 1)); - } -} - -function page_form($node, $help, $error) { - global $format, $op; - - if ($op != t("Preview") && $format[$node->format] == "PHP") { - $node->body = addslashes($node->body); - } - - $output .= form_textarea("Body", "body", $node->body, 60, 20); - $output .= form_textfield("Link", "link", $node->link, 60, 64); - $output .= form_select("Type", "format", $node->format, $format); - - return $output; -} - +<?php
+// $Id$
+
+$GLOBALS["format"] = array(0 => "HTML", 1 => "PHP", 2 => "text");
+
+function page_node($field) {
+ $info["name"] = t("static page");
+ $info["description"] = t("If you just want to add a static page with a link in the menu to your site, this would be the best choice. Unlike a story, a page by-passes the submission queue.");
+
+ return $info[$field];
+}
+
+function page_access($op, $node) {
+ if ($op == "view") {
+ return $node->status;
+ }
+}
+
+function page_save($op, $node) {
+ if ($op == "approve") {
+ return array("status" => 1);
+ }
+
+ if ($op == "create") {
+ return array("format", "link", "promote" => 0, "moderate" => 0, "status" => 1);
+ }
+
+ if ($op == "decline") {
+ return array("status" => 0);
+ }
+
+ if ($op == "update") {
+ return array("format", "link");
+ }
+}
+
+function page_insert($node) {
+ db_query("INSERT INTO page (nid, format, link) VALUES ('$node->nid', '$node->format', '$node->link')");
+}
+
+function page_update($node) {
+ db_query("UPDATE page SET format = '$node->format', link = '$node->link' WHERE nid = '$node->nid'");
+}
+
+function page_delete(&$node) {
+ db_query("DELETE FROM page WHERE nid = '$node->nid'");
+}
+
+function page_load($node) {
+ $page = db_fetch_object(db_query("SELECT format, link FROM page WHERE nid = '$node->nid'"));
+ return $page;
+}
+
+function page_link($type) {
+ if ($type == "page") {
+ $result = db_query("SELECT nid, link FROM page WHERE link != '' ORDER BY link");
+ while ($page = db_fetch_object($result)) {
+ $links[] = "<a href=\"node.php?id=$page->nid\">$page->link</a>";
+ }
+ }
+
+ return $links ? $links : array();
+}
+
+function page_view($node, $main = 0) {
+ global $format, $theme;
+
+ switch ($format[$node->format]) {
+ case "PHP":
+ print eval($node->body);
+ break;
+ case "text":
+ $theme->box($node->title, nl2br(htmlentities($node->body)));
+ break;
+ default:
+ $theme->box($node->title, check_output($node->body, 1));
+ }
+}
+
+function page_form(&$node, &$help, &$error) {
+ global $format, $op;
+
+ if ($op != t("Preview") && $format[$node->format] == "PHP") {
+ $node->body = addslashes($node->body);
+ }
+
+ $output .= form_textarea("Body", "body", $node->body, 60, 20);
+ $output .= form_textfield("Link", "link", $node->link, 60, 64);
+ $output .= form_select("Type", "format", $node->format, $format);
+
+ return $output;
+}
+
?>
\ No newline at end of file diff --git a/modules/story.module b/modules/story.module index d8027cdfe..d9c71214c 100644 --- a/modules/story.module +++ b/modules/story.module @@ -1,87 +1,87 @@ -<?php -// $Id$ - -function story_conf_options() { - $output .= form_textarea("Explanation or submission guidelines", "story_help", variable_get("story_help", ""), 55, 4, "This text will be displayed at the top of the story submission form. Useful for helping or instructing your users."); - $output .= form_select(t("Minimum number of words"), "minimum_story_size", variable_get("minimum_story_size", 0), array(0 => "0 words", 10 => "10 words", 25 => "25 words", 50 => "50 words", 75 => "75 words", 100 => "100 words", 125 => "125 words", 150 => "150 words", 175 => "175 words", 200 => "200 words"), t("The minimum number of words a personal story entry should consist of. This can be useful to rule out submissions that do not meet the site's standards, such as short test post.")); - - return $output; -} - -function story_node($field) { - $info["name"] = t("story"); - $info["description"] = t("A story is a post that is submitted to the attention of other users and is queued in the submission queue. Users and moderators vote on the posts they like or dislike, promoting or demoting them. When a post gets above a certain threshold it gets authomatically published to front page."); - - return $info[$field]; -} - -function story_access($op, $node) { - if ($op == "view") { - return $node->status; - } - - if ($op == "create") { - return 1; - } -} - -function story_save($op, $node) { - - if ($op == "approve") { - return array("status" => 1, "promote" => 1); - } - - if ($op == "create") { - return array("moderate" => 1); - } - - if ($op == "decline") { - return array("status" => 0, "promote" => 0); - } - - if ($op == "update") { - return array("status"); - } - -} - -function story_help() { - ?> - // TODO: update documentation, outdated - - //<p>Queued stories: user-contributed stories are automatically whisked away to a submission queue for moderators (i.e. registered user) to frown at. Moderators vote whether or not a story should be posted to the front page for discussion.</p> - //<p>Posted stories: published stories accessible to all visitors.</p> - //<p>Dumped stories: rejected stories that are no longer available to visitors.</p> - <?php -} - -function story_form($node, $help, $error) { - - if (isset($node->body)) { - - /* - ** Validate the size of the story: - */ - - if (count(explode(" ", $node->body)) < variable_get("minimum_story_size", 0)) { - $error["body"] = "<div style=\"color: red;\">". t("The body of your story is too short.") ."</div>"; - } - - } - else { - - /* - ** Carry out some explanation or submission guidelines: - */ - - $help = variable_get("story_help", ""); - - } - - $output = form_textarea(t("Body"), "body", $node->body, 60, 15, $error["body"] ? $error["body"] : t("Allowed HTML tags") .": ". htmlspecialchars(variable_get("allowed_html", ""))); - - return $output; -} - - -?> +<?php
+// $Id$
+
+function story_conf_options() {
+ $output .= form_textarea("Explanation or submission guidelines", "story_help", variable_get("story_help", ""), 55, 4, "This text will be displayed at the top of the story submission form. Useful for helping or instructing your users.");
+ $output .= form_select(t("Minimum number of words"), "minimum_story_size", variable_get("minimum_story_size", 0), array(0 => "0 words", 10 => "10 words", 25 => "25 words", 50 => "50 words", 75 => "75 words", 100 => "100 words", 125 => "125 words", 150 => "150 words", 175 => "175 words", 200 => "200 words"), t("The minimum number of words a personal story entry should consist of. This can be useful to rule out submissions that do not meet the site's standards, such as short test post."));
+
+ return $output;
+}
+
+function story_node($field) {
+ $info["name"] = t("story");
+ $info["description"] = t("A story is a post that is submitted to the attention of other users and is queued in the submission queue. Users and moderators vote on the posts they like or dislike, promoting or demoting them. When a post gets above a certain threshold it gets authomatically published to front page.");
+
+ return $info[$field];
+}
+
+function story_access($op, $node) {
+ if ($op == "view") {
+ return $node->status;
+ }
+
+ if ($op == "create") {
+ return 1;
+ }
+}
+
+function story_save($op, $node) {
+
+ if ($op == "approve") {
+ return array("status" => 1, "promote" => 1);
+ }
+
+ if ($op == "create") {
+ return array("moderate" => 1);
+ }
+
+ if ($op == "decline") {
+ return array("status" => 0, "promote" => 0);
+ }
+
+ if ($op == "update") {
+ return array("status");
+ }
+
+}
+
+function story_help() {
+ ?>
+ // TODO: update documentation, outdated
+
+ //<p>Queued stories: user-contributed stories are automatically whisked away to a submission queue for moderators (i.e. registered user) to frown at. Moderators vote whether or not a story should be posted to the front page for discussion.</p>
+ //<p>Posted stories: published stories accessible to all visitors.</p>
+ //<p>Dumped stories: rejected stories that are no longer available to visitors.</p>
+ <?php
+}
+
+function story_form(&$node, &$help, &$error) {
+
+ if (isset($node->body)) {
+
+ /*
+ ** Validate the size of the story:
+ */
+
+ if (count(explode(" ", $node->body)) < variable_get("minimum_story_size", 0)) {
+ $error["body"] = "<div style=\"color: red;\">". t("The body of your story is too short.") ."</div>";
+ }
+
+ }
+ else {
+
+ /*
+ ** Carry out some explanation or submission guidelines:
+ */
+
+ $help = variable_get("story_help", "");
+
+ }
+
+ $output = form_textarea(t("Body"), "body", $node->body, 60, 15, $error["body"] ? $error["body"] : t("Allowed HTML tags") .": ". htmlspecialchars(variable_get("allowed_html", "")));
+
+ return $output;
+}
+
+
+?>
diff --git a/modules/story/story.module b/modules/story/story.module index d8027cdfe..d9c71214c 100644 --- a/modules/story/story.module +++ b/modules/story/story.module @@ -1,87 +1,87 @@ -<?php -// $Id$ - -function story_conf_options() { - $output .= form_textarea("Explanation or submission guidelines", "story_help", variable_get("story_help", ""), 55, 4, "This text will be displayed at the top of the story submission form. Useful for helping or instructing your users."); - $output .= form_select(t("Minimum number of words"), "minimum_story_size", variable_get("minimum_story_size", 0), array(0 => "0 words", 10 => "10 words", 25 => "25 words", 50 => "50 words", 75 => "75 words", 100 => "100 words", 125 => "125 words", 150 => "150 words", 175 => "175 words", 200 => "200 words"), t("The minimum number of words a personal story entry should consist of. This can be useful to rule out submissions that do not meet the site's standards, such as short test post.")); - - return $output; -} - -function story_node($field) { - $info["name"] = t("story"); - $info["description"] = t("A story is a post that is submitted to the attention of other users and is queued in the submission queue. Users and moderators vote on the posts they like or dislike, promoting or demoting them. When a post gets above a certain threshold it gets authomatically published to front page."); - - return $info[$field]; -} - -function story_access($op, $node) { - if ($op == "view") { - return $node->status; - } - - if ($op == "create") { - return 1; - } -} - -function story_save($op, $node) { - - if ($op == "approve") { - return array("status" => 1, "promote" => 1); - } - - if ($op == "create") { - return array("moderate" => 1); - } - - if ($op == "decline") { - return array("status" => 0, "promote" => 0); - } - - if ($op == "update") { - return array("status"); - } - -} - -function story_help() { - ?> - // TODO: update documentation, outdated - - //<p>Queued stories: user-contributed stories are automatically whisked away to a submission queue for moderators (i.e. registered user) to frown at. Moderators vote whether or not a story should be posted to the front page for discussion.</p> - //<p>Posted stories: published stories accessible to all visitors.</p> - //<p>Dumped stories: rejected stories that are no longer available to visitors.</p> - <?php -} - -function story_form($node, $help, $error) { - - if (isset($node->body)) { - - /* - ** Validate the size of the story: - */ - - if (count(explode(" ", $node->body)) < variable_get("minimum_story_size", 0)) { - $error["body"] = "<div style=\"color: red;\">". t("The body of your story is too short.") ."</div>"; - } - - } - else { - - /* - ** Carry out some explanation or submission guidelines: - */ - - $help = variable_get("story_help", ""); - - } - - $output = form_textarea(t("Body"), "body", $node->body, 60, 15, $error["body"] ? $error["body"] : t("Allowed HTML tags") .": ". htmlspecialchars(variable_get("allowed_html", ""))); - - return $output; -} - - -?> +<?php
+// $Id$
+
+function story_conf_options() {
+ $output .= form_textarea("Explanation or submission guidelines", "story_help", variable_get("story_help", ""), 55, 4, "This text will be displayed at the top of the story submission form. Useful for helping or instructing your users.");
+ $output .= form_select(t("Minimum number of words"), "minimum_story_size", variable_get("minimum_story_size", 0), array(0 => "0 words", 10 => "10 words", 25 => "25 words", 50 => "50 words", 75 => "75 words", 100 => "100 words", 125 => "125 words", 150 => "150 words", 175 => "175 words", 200 => "200 words"), t("The minimum number of words a personal story entry should consist of. This can be useful to rule out submissions that do not meet the site's standards, such as short test post."));
+
+ return $output;
+}
+
+function story_node($field) {
+ $info["name"] = t("story");
+ $info["description"] = t("A story is a post that is submitted to the attention of other users and is queued in the submission queue. Users and moderators vote on the posts they like or dislike, promoting or demoting them. When a post gets above a certain threshold it gets authomatically published to front page.");
+
+ return $info[$field];
+}
+
+function story_access($op, $node) {
+ if ($op == "view") {
+ return $node->status;
+ }
+
+ if ($op == "create") {
+ return 1;
+ }
+}
+
+function story_save($op, $node) {
+
+ if ($op == "approve") {
+ return array("status" => 1, "promote" => 1);
+ }
+
+ if ($op == "create") {
+ return array("moderate" => 1);
+ }
+
+ if ($op == "decline") {
+ return array("status" => 0, "promote" => 0);
+ }
+
+ if ($op == "update") {
+ return array("status");
+ }
+
+}
+
+function story_help() {
+ ?>
+ // TODO: update documentation, outdated
+
+ //<p>Queued stories: user-contributed stories are automatically whisked away to a submission queue for moderators (i.e. registered user) to frown at. Moderators vote whether or not a story should be posted to the front page for discussion.</p>
+ //<p>Posted stories: published stories accessible to all visitors.</p>
+ //<p>Dumped stories: rejected stories that are no longer available to visitors.</p>
+ <?php
+}
+
+function story_form(&$node, &$help, &$error) {
+
+ if (isset($node->body)) {
+
+ /*
+ ** Validate the size of the story:
+ */
+
+ if (count(explode(" ", $node->body)) < variable_get("minimum_story_size", 0)) {
+ $error["body"] = "<div style=\"color: red;\">". t("The body of your story is too short.") ."</div>";
+ }
+
+ }
+ else {
+
+ /*
+ ** Carry out some explanation or submission guidelines:
+ */
+
+ $help = variable_get("story_help", "");
+
+ }
+
+ $output = form_textarea(t("Body"), "body", $node->body, 60, 15, $error["body"] ? $error["body"] : t("Allowed HTML tags") .": ". htmlspecialchars(variable_get("allowed_html", "")));
+
+ return $output;
+}
+
+
+?>
|