thirdparty/google_appengine/google/appengine/api/xmpp/xmpp_service_stub.py
changeset 2864 2e0b0af889be
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/thirdparty/google_appengine/google/appengine/api/xmpp/xmpp_service_stub.py	Sun Sep 06 23:31:53 2009 +0200
@@ -0,0 +1,154 @@
+#!/usr/bin/env python
+#
+# Copyright 2007 Google Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+"""Stub version of the XMPP API, writes messages to logs."""
+
+
+
+
+
+import logging
+import os
+
+from google.appengine.api import apiproxy_stub
+from google.appengine.api import xmpp
+from google.appengine.api.xmpp import xmpp_service_pb
+
+
+class XmppServiceStub(apiproxy_stub.APIProxyStub):
+  """Python only xmpp service stub.
+
+  This stub does not use an XMPP network. It prints messages to the console
+  instead of sending any stanzas.
+  """
+
+  def __init__(self, log=logging.info, service_name='xmpp'):
+    """Initializer.
+
+    Args:
+      log: A logger, used for dependency injection.
+      service_name: Service name expected for all calls.
+    """
+    super(XmppServiceStub, self).__init__(service_name)
+    self.log = log
+
+  def _Dynamic_GetPresence(self, request, response):
+    """Implementation of XmppService::GetPresence.
+
+    Returns online if the first character of the JID comes before 'm' in the
+    alphabet, otherwise returns offline.
+
+    Args:
+      request: A PresenceRequest.
+      response: A PresenceResponse.
+    """
+    jid = request.jid()
+    self._GetFrom(request.from_jid())
+    if jid[0] < 'm':
+      response.set_is_available(True)
+    else:
+      response.set_is_available(False)
+
+  def _Dynamic_SendMessage(self, request, response):
+    """Implementation of XmppService::SendMessage.
+
+    Args:
+      request: An XmppMessageRequest.
+      response: An XmppMessageResponse .
+    """
+    from_jid = self._GetFrom(request.from_jid())
+    self.log('Sending an XMPP Message:')
+    self.log('    From:')
+    self.log('       ' + from_jid)
+    self.log('    Body:')
+    self.log('       ' + request.body())
+    self.log('    Type:')
+    self.log('       ' + request.type())
+    self.log('    Raw Xml:')
+    self.log('       ' + str(request.raw_xml()))
+    self.log('    To JIDs:')
+    for jid in request.jid_list():
+      self.log('       ' + jid)
+
+    for jid in request.jid_list():
+      response.add_status(xmpp_service_pb.XmppMessageResponse.NO_ERROR)
+
+  def _Dynamic_SendInvite(self, request, response):
+    """Implementation of XmppService::SendInvite.
+
+    Args:
+      request: An XmppInviteRequest.
+      response: An XmppInviteResponse .
+    """
+    from_jid = self._GetFrom(request.from_jid())
+    self.log('Sending an XMPP Invite:')
+    self.log('    From:')
+    self.log('       ' + from_jid)
+    self.log('    To: ' + request.jid())
+
+  def _GetFrom(self, requested):
+    """Validates that the from JID is valid.
+
+    Args:
+      requested: The requested from JID.
+
+    Returns:
+      string, The from JID.
+
+    Raises:
+      xmpp.InvalidJidError if the requested JID is invalid.
+    """
+
+    appid = os.environ.get('APPLICATION_ID', '')
+    if requested == None or requested == '':
+      return appid + '@appspot.com/bot'
+
+    node, domain, resource = ('', '', '')
+    at = requested.find('@')
+    if at == -1:
+      self.log('Invalid From JID: No \'@\' character found. JID: %s', requested)
+      raise xmpp.InvalidJidError()
+
+    node = requested[:at]
+    rest = requested[at+1:]
+
+    if rest.find('@') > -1:
+      self.log('Invalid From JID: Second \'@\' character found. JID: %s',
+               requested)
+      raise xmpp.InvalidJidError()
+
+    slash = rest.find('/')
+    if slash == -1:
+      domain = rest
+      resource = 'bot'
+    else:
+      domain = rest[:slash]
+      resource = rest[slash+1:]
+
+    if resource.find('/') > -1:
+      self.log('Invalid From JID: Second \'/\' character found. JID: %s',
+               requested)
+      raise xmpp.InvalidJidError()
+
+    if domain == 'appspot.com' and node == appid:
+      return node + '@' + domain + '/' + resource
+    elif domain == appid + '.appspotchat.com':
+      return node + '@' + domain + '/' + resource
+
+    self.log('Invalid From JID: Must be appid@appspot.com[/resource] or '
+             'node@appid.appspotchat.com[/resource]. JID: %s', requested)
+    raise xmpp.InvalidJidError()