SubscriptionSynchronization.py 5.26 KB
Newer Older
Jean-Paul Smets's avatar
Jean-Paul Smets committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
##############################################################################
#
# Copyright (c) 2003 Nexedi SARL and Contributors. All Rights Reserved.
#          Sebastien Robin <seb@nexedi.com>
#
# WARNING: This program as such is intended to be used by professional
# programmers who take the whole responsability of assessing all potential
# consequences resulting from its eventual inadequacies and bugs
# End users who are looking for a ready-to-use solution with commercial
# garantees and support are strongly adviced to contract a Free Software
# Service Company
#
# This program is Free Software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#
##############################################################################

import smtplib # to send emails
from Subscription import Subscription,Signature
31
from XMLSyncUtils import XMLSyncUtils, Parse
Jean-Paul Smets's avatar
Jean-Paul Smets committed
32 33
import commands
from Conduit.ERP5Conduit import ERP5Conduit
34
from AccessControl import getSecurityManager
35
from DateTime import DateTime
36
from zLOG import LOG, DEBUG, INFO
Jean-Paul Smets's avatar
Jean-Paul Smets committed
37 38 39 40 41 42 43

class SubscriptionSynchronization(XMLSyncUtils):

  def SubSyncInit(self, subscription):
    """
      Send the first XML message from the client
    """
Nicolas Delaby's avatar
Nicolas Delaby committed
44
    #LOG('SubSyncInit',0,'starting....')
Jean-Paul Smets's avatar
Jean-Paul Smets committed
45
    cmd_id = 1 # specifies a SyncML message-unique command identifier
46 47
    subscription.NewAnchor()
    subscription.initLastMessageId()
Fabien Morin's avatar
Fabien Morin committed
48 49

    #save the actual user to use it in all the session:
50
    user = getSecurityManager().getUser()
Fabien Morin's avatar
Fabien Morin committed
51 52 53
    subscription.setZopeUser(user)
    subscription.setAuthenticated(True)

Sebastien Robin's avatar
Sebastien Robin committed
54 55 56
    xml_list = []
    xml = xml_list.append
    xml('<SyncML>\n')
Jean-Paul Smets's avatar
Jean-Paul Smets committed
57
    # syncml header
58 59
    xml(self.SyncMLHeader(subscription.incrementSessionId(),
      subscription.incrementMessageId(), subscription.getPublicationUrl(),
60
      subscription.getSubscriptionUrl(), source_name=subscription.getLogin()))
Jean-Paul Smets's avatar
Jean-Paul Smets committed
61 62

    # syncml body
Sebastien Robin's avatar
Sebastien Robin committed
63
    xml(' <SyncBody>\n')
Jean-Paul Smets's avatar
Jean-Paul Smets committed
64 65 66 67 68

    # We have to set every object as NOT_SYNCHRONIZED
    subscription.startSynchronization()

    # alert message
Sebastien Robin's avatar
Sebastien Robin committed
69
    xml(self.SyncMLAlert(cmd_id, subscription.getSynchronizationType(),
70 71
                            subscription.getTargetURI(),
                            subscription.getSourceURI(),
72
                            subscription.getLastAnchor(),
Sebastien Robin's avatar
Sebastien Robin committed
73
                            subscription.getNextAnchor()))
Jean-Paul Smets's avatar
Jean-Paul Smets committed
74
    cmd_id += 1
75 76 77 78
    syncml_put = self.SyncMLPut(cmd_id, subscription)
    if syncml_put not in ('', None):
      xml(syncml_put)
      cmd_id += 1
Sebastien Robin's avatar
Sebastien Robin committed
79 80 81
    xml(' </SyncBody>\n')
    xml('</SyncML>\n')
    xml_a = ''.join(xml_list)
Jean-Paul Smets's avatar
Jean-Paul Smets committed
82

Sebastien Robin's avatar
Sebastien Robin committed
83
    self.sendResponse(from_url=subscription.subscription_url,
84 85 86
        to_url=subscription.publication_url, sync_id=subscription.getTitle(),
        xml=xml_a,domain=subscription,
        content_type=subscription.getSyncContentType())
87

Sebastien Robin's avatar
Sebastien Robin committed
88
    return {'has_response':1,'xml':xml_a}
Jean-Paul Smets's avatar
Jean-Paul Smets committed
89

90
  def SubSyncCred (self, subscription, msg=None, RESPONSE=None):
91 92 93 94 95 96 97 98 99 100
    """
      This method send crendentials
    """
    cmd_id = 1 # specifies a SyncML message-unique command identifier
    xml_list = []
    xml = xml_list.append
    xml('<SyncML>\n')
    # syncml header
    data = "%s:%s" % (subscription.getLogin(), subscription.getPassword())
    data=subscription.encode(subscription.getAuthenticationFormat(), data)
101 102
    xml(self.SyncMLHeader(
      subscription.incrementSessionId(),
103
      subscription.incrementMessageId(),
104
      subscription.getPublicationUrl(),
105 106
      subscription.getSubscriptionUrl(),
      source_name=subscription.getLogin(),
107
      dataCred=data,
108
      authentication_format=subscription.getAuthenticationFormat(),
109 110 111 112 113
      authentication_type=subscription.getAuthenticationType()))

    # syncml body
    xml(' <SyncBody>\n')

114 115 116
    # We have to set every object as NOT_SYNCHRONIZED
    subscription.startSynchronization()

117 118
    # alert message
    xml(self.SyncMLAlert(cmd_id, subscription.getSynchronizationType(),
119 120
                            subscription.getTargetURI(),
                            subscription.getSourceURI(),
121 122 123
                            subscription.getLastAnchor(),
                            subscription.getNextAnchor()))
    cmd_id += 1
124
    xml(self.SyncMLPut(cmd_id, subscription))
125
    cmd_id += 1
126
    xml('  <Final/>\n')
127 128 129 130 131 132
    xml(' </SyncBody>\n')
    xml('</SyncML>\n')
    xml_a = ''.join(xml_list)

    self.sendResponse(from_url=subscription.subscription_url,
        to_url=subscription.publication_url, sync_id=subscription.getTitle(),
133
        xml=xml_a, domain=subscription,
134
        content_type=subscription.getSyncContentType())
135

136
    return {'has_response':1, 'xml':xml_a}
137

Jean-Paul Smets's avatar
Jean-Paul Smets committed
138 139 140 141 142
  def SubSyncModif(self, subscription, xml_client):
    """
      Send the client modification, this happens after the Synchronization
      initialization
    """
143
    return self.SyncModif(subscription, xml_client)
Jean-Paul Smets's avatar
Jean-Paul Smets committed
144 145 146