summaryrefslogtreecommitdiff
path: root/examples
diff options
context:
space:
mode:
Diffstat (limited to 'examples')
-rwxr-xr-xexamples/confirm_answer.py39
-rwxr-xr-xexamples/confirm_ask.py32
2 files changed, 51 insertions, 20 deletions
diff --git a/examples/confirm_answer.py b/examples/confirm_answer.py
index 2b2015a2..9cfe30f1 100755
--- a/examples/confirm_answer.py
+++ b/examples/confirm_answer.py
@@ -29,18 +29,33 @@ class AnswerConfirm(slixmpp.ClientXMPP):
def __init__(self, jid, password, trusted):
slixmpp.ClientXMPP.__init__(self, jid, password)
- self.trusted = trusted
- self.api.register(self.confirm, 'xep_0070', 'get_confirm')
-
- def confirm(self, jid, id, url, method):
- log.info('Received confirm request %s from %s to access %s using '
- 'method %s' % (id, jid, url, method))
- if jid not in self.trusted:
- log.info('Denied')
- return False
- log.info('Confirmed')
- return True
-
+ self.add_event_handler("http_confirm", self.confirm)
+ self.add_event_handler("session_start", self.start)
+
+ def start(self, *args):
+ self.make_presence().send()
+
+ def prompt(self, stanza):
+ confirm = stanza['confirm']
+ print('Received confirm request %s from %s to access %s using '
+ 'method %s' % (
+ confirm['id'], stanza['from'], confirm['url'],
+ confirm['method'])
+ )
+ result = input("Do you accept (y/N)? ")
+ return 'y' == result.lower()
+
+ def confirm(self, stanza):
+ if self.prompt(stanza):
+ reply = stanza.reply()
+ else:
+ reply = stanza.reply()
+ reply.enable('error')
+ reply['error']['type'] = 'auth'
+ reply['error']['code'] = '401'
+ reply['error']['condition'] = 'not-authorized'
+ reply.append(stanza['confirm'])
+ reply.send()
if __name__ == '__main__':
# Setup the command line arguments.
diff --git a/examples/confirm_ask.py b/examples/confirm_ask.py
index 2c500729..e3cd184a 100755
--- a/examples/confirm_ask.py
+++ b/examples/confirm_ask.py
@@ -16,7 +16,7 @@ from getpass import getpass
from argparse import ArgumentParser
import slixmpp
-from slixmpp.exceptions import XMPPError
+from slixmpp.exceptions import XMPPError, IqError
from slixmpp import asyncio
log = logging.getLogger(__name__)
@@ -37,24 +37,40 @@ class AskConfirm(slixmpp.ClientXMPP):
self.method = method
# Will be used to set the proper exit code.
- self.confirmed = None
+ self.confirmed = asyncio.Future()
self.add_event_handler("session_start", self.start)
+ self.add_event_handler("message", self.start)
+ self.add_event_handler("http_confirm_message", self.confirm)
+
+ def confirm(self, message):
+ print(message)
+ if message['confirm']['id'] == self.id:
+ if message['type'] == 'error':
+ self.confirmed.set_result(False)
+ else:
+ self.confirmed.set_result(True)
@asyncio.coroutine
def start(self, event):
log.info('Sending confirm request %s to %s who wants to access %s using '
'method %s...' % (self.id, self.recipient, self.url, self.method))
- confirmed = yield from self['xep_0070'].ask_confirm(self.recipient,
- id=self.id,
- url=self.url,
- method=self.method,
- message='Plz say yes or no for {method} {url} ({id}).')
+ try:
+ confirmed = yield from self['xep_0070'].ask_confirm(self.recipient,
+ id=self.id,
+ url=self.url,
+ method=self.method,
+ message='Plz say yes or no for {method} {url} ({id}).')
+ if isinstance(confirmed, slixmpp.Message):
+ confirmed = yield from self.confirmed
+ else:
+ confirmed = True
+ except IqError:
+ confirmed = False
if confirmed:
print('Confirmed')
else:
print('Denied')
- self.confirmed = confirmed
self.disconnect()