drupal.module 10.3 KB
Newer Older
Dries's avatar
Dries committed
1
<?php
Kjartan's avatar
Kjartan committed
2
// $Id$
Dries's avatar
Dries committed
3

4
function drupal_help($section = "admin/help#drupal") {
5

6
  switch ($section) {
7
    case 'admin/help#drupal':
8 9
      return t("
<p>The \"Drupal\" module features a capability whereby other drupal sites may <em>call home</em> to report their existence. In turn, this enables a pod of Drupal sites to find, cooperate and advertise each other.</p>
10 11 12 13
<p>Currently, the main application of this feature is the <a href=\"%drupal-sites\">Drupal sites</a> page. By default, fresh Drupal installations can use <a href=\"%Drupal\">drupal.org</a> as their <em>directory server</em> and report their existence. This reporting occurs via scheduled <a href=\"%xml-rpc\">XML-RPC</a> pings.</p>
<p>Drupal administrators should simply enable this feature to get listed on the <a href=\"%drupal-sites\">Drupal sites</a> page. Just set your site's name, e-mail address, slogan and mission statement on the <a href=\"%site-admin\">site administration</a> page. Then make sure that the field called <em>Drupal XML-RPC server</em> on the <a href=\"%drupal-settings\">administer &raquo; configuration &raquo; modules &raquo; drupal</a> page is set to %drupal-xml-rpc, and enable this feature using the dropdown directly below.</p>
<p>The listing of your site will occur shortly after your site's next <a href=\"%cron-run\">cron run</a>. Note that cron.php should be called using the domain name which you want to have listed at <a href=\"%Drupal\">drupal.org</a>. For example, don't kick off cron by requesting http://127.0.0.1/cron.php. Instead, use a publicly accessible domain name such as http://www.example.com/cron.php.</p>
<p>Also note that your installation need not use drupal.org as its directory server. For example, this feature is perfectly capable of aggregating pings from all of your departmental drupal installations sites within an enterprise.</p>", array("%drupal-sites" => "http://www.drupal.org/sites", "%Drupal" => "http://www.drupal.org", "%drupal-xml-rpc" => "http://www.drupal.org/xmlrpc.php", "%xml-rpc" => "http://www.xmlrpc.com/", "%site-admin" => url("admin/system"), "%drupal-settings" => url("admin/system/modules/drupal"), "%cron" => url("admin/system/help#cron")));
14
      break;
15
    case 'admin/system/modules#description':
Dries's avatar
Dries committed
16
      return t("Lets users log in using a Drupal ID and can notify a central server about your site.");
17 18
      break;
    case 'admin/system/modules/drupal':
19
      return t("Using this your Drupal site can \"call home\" and add itself to the Drupal directory. If you want it to add itself to a different directory server you can change the <a href=\"%xml-rpc-setting\">Drupal XML-RPC server</a> setting -- but the directory server has to be able to handle Drupal XML. To get all your site information listed go to the <a href=\"%site-admin\">site configuration</a> page and set the site name, the e-mail address, the slogan, and the mission statement.", array("%xml-rpc-setting" => url("admin/system/modules/drupal"), "%site-admin" => url("admin/system")));
20
      break;
21
    case 'user/help#drupal':
22 23
      return t("<p><a href=\"%Drupal\">Drupal</a> is the name of the software which powers %this-site. There are Drupal web sites 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 <strong>Drupal ID</strong>.</p>
<p>So please feel free to login to your account here at %this-site with a username from another Drupal site. The format of a Drupal ID is similar to an email address: <strong>username</strong>@<em>server</em>. An example of a valid Drupal ID is <strong>mwlily</strong>@<em>www.drupal.org</em>.</p>", array("%Drupal" => "http://www.drupal.org", "%this-site" => "<em>". variable_get("site_name", "this web site") ."</em>"));
24 25
      break;
  }
26 27

  return $output;
28 29
}

30
function drupal_settings() {
31 32 33 34 35 36 37 38 39
  // Check if all required fields are present for the Drupal directory
  if ((variable_get("site_name", "drupal") == "drupal") || (variable_get("site_name", "drupal") == ""))
    $error["drupal_directory"] = theme("error", t("You must set your site's name at the <a href=\"%url\">site configuration</a>.", array("%url" => url("admin/system"))));
  else if (variable_get("site_mail", ini_get("sendmail_from")) == "")
    $error["drupal_directory"] = theme("error", t("You must set your site's e-mail address at the <a href=\"%url\">site configuration</a>.", array("%url" => url("admin/system"))));
  else if (variable_get("site_slogan", "") == "")
    $error["drupal_directory"] = theme("error", t("You must set your site's slogan at the <a href=\"%url\">site configuration</a>.", array("%url" => url("admin/system"))));
  else if (variable_get("site_mission", "") == "")
    $error["drupal_directory"] = theme("error", t("You must set your site's mission at the <a href=\"%url\">site configuration</a>.", array("%url" => url("admin/system"))));
40

Dries's avatar
Dries committed
41
  $output = form_textfield(t("Drupal XML-RPC server"), "drupal_server", variable_get("drupal_server", "http://www.drupal.org/xmlrpc.php"), 55, 128, t("The URL of your root Drupal XML-RPC server."));
42
  $output .= form_radios(t("Drupal directory"), "drupal_directory", variable_get("drupal_directory", 0), array(t("Disabled"), t("Enabled")), t("If enabled, your Drupal site will make itself known to the Drupal directory at the specified Drupal XML-RPC server. For this to work properly, you must set your site's name, e-mail address, slogan and mission statement. When the \"Drupal XML-RPC server\" field is set to \"%drupal-xml-rpc\", your web site will get listed on the <a href=\"%drupal-sites\">Drupal sites</a> page. Requires the cron feature to be enabled.", array("%drupal-xml-rpc" => "http://www.drupal.org/xmlrpc.php")) . $error["drupal_directory"]);
43 44 45 46 47

  return $output;
}

function drupal_cron() {
48 49
  if (time() - variable_get("drupal_cron_last", 0) > 21600) {
    variable_set("drupal_cron_last", time());
50

51 52 53 54
    /*
    ** If this site acts as a Drupal XML-RPC server, delete the sites that
    ** stopped sending "ping" messages.
    */
55

56
    db_query("DELETE FROM {directory} WHERE timestamp < '". (time() - 259200) ."'");
57

58 59 60 61
    /*
    ** If this site acts as a Drupal XML-RPC client, send a message to the
    ** Drupal XML-RPC server.
    */
62

63 64 65
    if (variable_get("drupal_directory", 0) && variable_get("drupal_server", 0)) {
      drupal_notify(variable_get("drupal_server", ""));
    }
66 67 68 69 70 71 72 73 74 75 76 77
  }
}

function drupal_directory_ping($arguments) {

  /*
  ** Parse our parameters:
  */

  $argument = $arguments->getparam(0);
  $link = strip_tags($argument->scalarval());
  $argument = $arguments->getparam(1);
78
  $name = trim(strip_tags($argument->scalarval()));
79 80 81 82 83 84 85 86 87 88 89 90
  $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) {
91 92
    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', %d)", $link, $name, $mail, $slogan, $mission, time());
93

94
    watchdog("regular", "directory: ping from '$name' ($link)");
95 96 97 98 99 100 101 102 103 104

    return new xmlrpcresp(new xmlrpcval(1, "int"));
  }
  else {
    return new xmlrpcresp(new xmlrpcval(0, "int"));
  }

}

function drupal_directory_page() {
105
  $result = db_query("SELECT * FROM {directory} ORDER BY name");
106 107 108 109 110 111 112 113 114

  while ($site = db_fetch_object($result)) {
    $output .= "<a href=\"$site->link\">$site->name</a> - $site->slogan<div style=\"padding-left: 20px;\">$site->mission</div><br />";
  }

  return $output;
}

function drupal_xmlrpc() {
Dries's avatar
Dries committed
115
  return array("drupal.site.ping" => array("function" => "drupal_directory_ping"), "drupal.login" => array("function" => "drupal_login"));
116 117 118
}

function drupal_notify($server) {
119
  global $base_url;
120 121 122 123 124

  $url = parse_url($server);

  $client = new xmlrpc_client($url["path"], $url["host"], 80);

125
  $message = new xmlrpcmsg("drupal.site.ping", array(new xmlrpcval($base_url, "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")));
126 127 128 129 130 131 132 133 134

  $result = $client->send($message, 5);

  if (!$result || $result->faultCode()) {
    watchdog("error", "failed to notify '". $url["host"] ."' at '". $url["path"] ."': ". $result->faultString());
  }

}

Dries's avatar
Dries committed
135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150
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")));

151 152
  // TODO remove hard coded Port 80
  // TODO manage server/path such that HTTP_HOST/xml.rpc.php is not assumed
Dries's avatar
Dries committed
153 154 155 156 157 158 159 160 161 162
  $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;
}

Dries's avatar
Dries committed
163 164
function drupal_link($type) {
  if ($type == "system") {
Dries's avatar
Dries committed
165
    menu("drupal", t("Drupal"), "drupal_page", 0, MENU_HIDE);
Dries's avatar
Dries committed
166 167 168
  }
}

Dries's avatar
Dries committed
169
function drupal_page() {
Dries's avatar
Dries committed
170
  print theme("page", drupal_help("user/help#drupal"), t("Drupal"));
Dries's avatar
Dries committed
171 172
}

Dries's avatar
Dries committed
173 174 175 176 177 178 179 180 181 182 183 184 185 186 187
function drupal_login($arguments) {
   // an XML-RPC method called by external clients (usually other Drupal instances)
  $argument = $arguments->getparam(0);
  $username = $argument->scalarval();
  $argument = $arguments->getparam(1);
  $password = $argument->scalarval();

  if ($user = user_load(array(name => "$username", "pass" => $password, "status" => 1))) {
    return new xmlrpcresp(new xmlrpcval($user->uid, "int"));
  }
  else {
    return new xmlrpcresp(new xmlrpcval(0, "int"));
  }
}

188 189 190 191 192 193 194
function drupal_user($type, $edit, $user) {

  $module = "drupal";
  $name = module_invoke($module, "info", "name");
  switch ($type) {
    case "view_private":
      $result = user_get_authname($user, $module);
Dries's avatar
Dries committed
195
      $title = t("%name ID", array("%name" => $name));
196
      if ($result) {
Dries's avatar
Dries committed
197
        return form_item($title, $result);
198 199
      }
      else {
200
        // TODO: use a variation of $base_url instead of $HTTP_HOST below
Dries's avatar
Dries committed
201
        return form_item($title, "$user->name@". $_SERVER["HTTP_HOST"]);
202 203
      }
  }
Dries's avatar
Dries committed
204 205
}

206
?>