http://www.drupal.org/. Requires crontab."); return $output; } function drupal_cron() { if (time() - variable_get("drupal_cron_last", 0) > 21600) { variable_set("drupal_cron_last", time()); /* ** If this site acts as a Drupal XML-RPC server, delete the sites that ** stopped sending "ping" messages. */ db_query("DELETE FROM directory WHERE timestamp < '". (time() - 259200) ."'"); /* ** If this site acts as a Drupal XML-RPC client, send a message to the ** Drupal XML-RPC server. */ if (variable_get("drupal_directory", 0) && variable_get("drupal_server", 0)) { drupal_notify(variable_get("drupal_server", "")); } } } function drupal_directory_ping($arguments) { /* ** Parse our parameters: */ $argument = $arguments->getparam(0); $link = strip_tags($argument->scalarval()); $argument = $arguments->getparam(1); $name = strip_tags($argument->scalarval()); $argument = $arguments->getparam(2); $mail = strip_tags($argument->scalarval()); $argument = $arguments->getparam(3); $slogan = strip_tags($argument->scalarval()); $argument = $arguments->getparam(4); $mission = strip_tags($argument->scalarval()); /* ** Update the data in our database and send back a reply: */ if ($link && $name && $mail && $slogan && $mission) { db_query("DELETE FROM directory WHERE link = '%s' OR mail = '%s'", $link, $mail); db_query("INSERT INTO directory (link, name, mail, slogan, mission, timestamp) VALUES ('%s', '%s', '%s', '%s', '%s', '%s')", $link, $name, $mail, $slogan, $mission, time()); watchdog("message", "directory: ping from '$name' ($link)"); return new xmlrpcresp(new xmlrpcval(1, "int")); } else { return new xmlrpcresp(new xmlrpcval(0, "int")); } } function drupal_directory_page() { $result = db_query("SELECT * FROM directory ORDER BY name"); while ($site = db_fetch_object($result)) { $output .= "link\">$site->name - $site->slogan
$site->mission

"; } return $output; } function drupal_xmlrpc() { return array("drupal.site.ping" => array("function" => "drupal_directory_ping")); } function drupal_notify($server) { $url = parse_url($server); $client = new xmlrpc_client($url["path"], $url["host"], 80); $message = new xmlrpcmsg("drupal.site.ping", array(new xmlrpcval(path_uri(), "string"), new xmlrpcval(variable_get("site_name", ""), "string"), new xmlrpcval(variable_get("site_mail", ""), "string"), new xmlrpcval(variable_get("site_slogan", ""), "string"), new xmlrpcval(variable_get("site_mission", ""), "string"))); $result = $client->send($message, 5); if (!$result || $result->faultCode()) { watchdog("error", "failed to notify '". $url["host"] ."' at '". $url["path"] ."': ". $result->faultString()); } } function drupal_info($field = 0) { $info["name"] = "Drupal"; $info["protocol"] = "XML-RPC"; if ($field) { return $info[$field]; } else { return $info; } } function drupal_auth($username, $password, $server) { $message = new xmlrpcmsg("drupal.login", array(new xmlrpcval($username, "string"), new xmlrpcval($password, "string"))); // TODO remove hard coded Port 80 // TODO manage server/path such that HTTP_HOST/xml.rpc.php is not assumed $client = new xmlrpc_client("/xmlrpc.php", $server, 80); $result = $client->send($message, 5); if ($result && !$result->faultCode()) { $value = $result->value(); $login = $value->scalarval(); } return $login; } function drupal_page() { global $theme; $theme->header(); $theme->box("Drupal", drupal_auth_help()); $theme->footer(); } function drupal_auth_help() { $site = variable_get("site_name", "this web site"); $output = "

Drupal is the name of the software which powers %s. There are Drupal websites all over the world, and many of them share their registration databases so that users may freely login to any Drupal site using a single Drupal ID.

\n"; $output .= "

So please feel free to login to your account here at %s with a username from another Drupal site. The format of a Drupal ID is similar to an email address: username@server. An example of valid Drupal ID is mwlily@www.drupal.org.

"; return t($output, array("%s" => "$site")); } function drupal_user($type, $edit, $user) { global $HTTP_HOST; $module = "drupal"; $name = module_invoke($module, "info", "name"); switch ($type) { case "view_private": $result = user_get_authname($user, $module); if ($result) { $output .= form_item(t("$name ID"), $result); } else { // TODO: use a variation of path_uri() instead of $HTTP_HOST below $output .= form_item(t("$name ID"), "$user->name@$HTTP_HOST"); } return $output; } } ?>