1279
+ − 1 #!/usr/bin/python
+ − 2 # -*- coding: utf-8 -*-
+ − 3
+ − 4 # SAT plugin for Delayed Delivery (XEP-0334)
1766
+ − 5 # Copyright (C) 2009-2016 Jérôme Poisson (goffi@goffi.org)
+ − 6 # Copyright (C) 2013-2016 Adrien Cossa (souliane@mailoo.org)
1279
+ − 7
+ − 8 # This program is free software: you can redistribute it and/or modify
+ − 9 # it under the terms of the GNU Affero General Public License as published by
+ − 10 # the Free Software Foundation, either version 3 of the License, or
+ − 11 # (at your option) any later version.
+ − 12
+ − 13 # This program is distributed in the hope that it will be useful,
+ − 14 # but WITHOUT ANY WARRANTY; without even the implied warranty of
+ − 15 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ − 16 # GNU Affero General Public License for more details.
+ − 17
+ − 18 # You should have received a copy of the GNU Affero General Public License
+ − 19 # along with this program. If not, see <http://www.gnu.org/licenses/>.
+ − 20
+ − 21 from sat.core.i18n import _
+ − 22 from sat.core.log import getLogger
+ − 23 log = getLogger ( __name__ )
+ − 24
+ − 25 from sat.core import exceptions
+ − 26
+ − 27 from wokkel import disco , iwokkel
+ − 28 try :
+ − 29 from twisted.words.protocols.xmlstream import XMPPHandler
+ − 30 except ImportError :
+ − 31 from wokkel.subprotocols import XMPPHandler
+ − 32 from twisted.python import failure
+ − 33 from zope.interface import implements
+ − 34
+ − 35
+ − 36 NS_MPH = 'urn:xmpp:hints'
+ − 37
+ − 38 PLUGIN_INFO = {
+ − 39 "name" : "Message Processing Hints" ,
+ − 40 "import_name" : "XEP-0334" ,
+ − 41 "type" : "XEP" ,
+ − 42 "protocols" : [ "XEP-0334" ],
+ − 43 "main" : "XEP_0334" ,
+ − 44 "handler" : "yes" ,
+ − 45 "description" : _ ( """Implementation of Message Processing Hints""" )
+ − 46 }
+ − 47
+ − 48
+ − 49 class XEP_0334 ( object ):
+ − 50
+ − 51 def __init__ ( self , host ):
+ − 52 log . info ( _ ( "Message Processing Hints plugin initialization" ))
+ − 53 self . host = host
+ − 54 host . trigger . add ( "sendMessage" , self . sendMessageTrigger )
+ − 55 host . trigger . add ( "MessageReceived" , self . messageReceivedTrigger )
+ − 56
+ − 57 def getHandler ( self , profile ):
+ − 58 return XEP_0334_handler ( self , profile )
+ − 59
+ − 60 def sendMessageTrigger ( self , mess_data , pre_xml_treatments , post_xml_treatments , profile ):
+ − 61 """Add the hints element to the message to be sent"""
+ − 62 hints = []
+ − 63 for key in ( 'no-permanent-storage' , 'no-storage' , 'no-copy' ):
+ − 64 if mess_data [ 'extra' ] . get ( key , None ):
+ − 65 hints . append ( key )
+ − 66
+ − 67 def treatment ( mess_data ):
+ − 68 message = mess_data [ 'xml' ]
+ − 69 for key in hints :
+ − 70 message . addElement (( NS_MPH , key ))
+ − 71 if key in ( 'no-permanent-storage' , 'no-storage' ):
+ − 72 mess_data [ 'extra' ][ 'no_storage' ] = True
+ − 73 # TODO: the core doesn't process this 'no_storage' info yet
+ − 74 # it will be added after the frontends refactorization
+ − 75 return mess_data
+ − 76
+ − 77 if hints :
+ − 78 post_xml_treatments . addCallback ( treatment )
+ − 79 return True
+ − 80
+ − 81 def messageReceivedTrigger ( self , message , post_treat , profile ):
+ − 82 """Check for hints in the received message"""
+ − 83 hints = []
+ − 84 for key in ( 'no-permanent-storage' , 'no-storage' ):
+ − 85 try :
+ − 86 message . elements ( uri = NS_MPH , name = key ) . next ()
+ − 87 hints . append ( key )
+ − 88 except StopIteration :
+ − 89 pass
+ − 90
+ − 91 def post_treat_hints ( data ):
+ − 92 raise failure . Failure ( exceptions . SkipHistory ())
+ − 93
+ − 94 if hints :
+ − 95 post_treat . addCallback ( post_treat_hints )
+ − 96 return True
+ − 97
+ − 98
+ − 99 class XEP_0334_handler ( XMPPHandler ):
+ − 100 implements ( iwokkel . IDisco )
+ − 101
+ − 102 def __init__ ( self , plugin_parent , profile ):
+ − 103 self . plugin_parent = plugin_parent
+ − 104 self . host = plugin_parent . host
+ − 105 self . profile = profile
+ − 106
+ − 107 def getDiscoInfo ( self , requestor , target , nodeIdentifier = '' ):
+ − 108 return [ disco . DiscoFeature ( NS_MPH )]
+ − 109
+ − 110 def getDiscoItems ( self , requestor , target , nodeIdentifier = '' ):
+ − 111 return []