Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mrDoctorWho/vk4xmpp.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gateway.py69
-rw-r--r--library/xmpp/protocol.py3
-rw-r--r--locales/locale.ru3
3 files changed, 71 insertions, 4 deletions
diff --git a/gateway.py b/gateway.py
index 9911f58..50051ed 100644
--- a/gateway.py
+++ b/gateway.py
@@ -198,9 +198,28 @@ class VKLogin(object):
def captchaChallenge(self):
if self.engine.captcha:
logger.debug("VKLogin: sending message with captcha to %s" % self.jidFrom)
- msgSend(Component, self.jidFrom, _("WARNING: VK sent captcha to you."\
- " Please, go to %s and enter text from image to chat."\
- " Example: !captcha my_captcha_key. Tnx") % self.engine.captcha["img"], TransportID)
+ body = _("WARNING: VK sent captcha to you."\
+ " Please, go to %s and enter text from image to chat."\
+ " Example: !captcha my_captcha_key. Tnx") % self.engine.captcha["img"]
+ msg = xmpp.Message(self.jidFrom, body, "chat", frm = TransportID)
+ msg.setTimestamp(0)
+ msg.setTag('x',namespace=xmpp.NS_OOB)
+ msg.getTag('x',namespace=xmpp.NS_OOB).setTagData('url',self.engine.captcha["img"])
+ msg.setTag('captcha',namespace=xmpp.NS_CAPTCHA)
+ msg.getTag('captcha',namespace=xmpp.NS_CAPTCHA).setTag('x',attrs={'type':'form'},namespace=xmpp.NS_DATA)
+ base64_date = vCardGetPhoto(self.engine.captcha["img"])
+ base64_hash = hashlib.sha1(base64_date.decode('base64')).hexdigest()
+ msg.getTag('captcha',namespace=xmpp.NS_CAPTCHA).setTag('x',attrs={'type':'form'},namespace=xmpp.NS_DATA).\
+ addChild('field', {'type':'hidded', 'var':'FORM_TYPE'},payload = [xmpp.Node('value',payload=[xmpp.NS_CAPTCHA])])
+ msg.getTag('captcha',namespace=xmpp.NS_CAPTCHA).setTag('x',attrs={'type':'form'},namespace=xmpp.NS_DATA).\
+ addChild('field', {'type':'hidded', 'var':'from'},payload = [xmpp.Node('value',payload=[TransportID])])
+ msg.getTag('captcha',namespace=xmpp.NS_CAPTCHA).setTag('x',attrs={'type':'form'},namespace=xmpp.NS_DATA).\
+ addChild('field', {'label':_('Enter shown text'), 'var':'ocr'},payload = [\
+ xmpp.Node('required'),\
+ xmpp.Node('media',{'xmlns':xmpp.NS_MEDIA},payload=[xmpp.Node('uri',{'type':'image/jpg'},payload = ['cid:sha1+%s@bob.xmpp.org' % base64_hash])])])
+ msg.setTag('data', {'cid':'sha1+%s@bob.xmpp.org' % base64_hash, 'type':'image/jpg', 'max-age':'0'},namespace=xmpp.NS_URN_OOB)
+ msg.getTag('data', {'cid':'sha1+%s@bob.xmpp.org' % base64_hash, 'type':'image/jpg', 'max-age':'0'},namespace=xmpp.NS_URN_OOB).setData(base64_date)
+ Sender(Component, msg)
else:
logger.error("VKLogin: captchaChallenge called with no captcha for user %s" % self.jidFrom)
@@ -465,6 +484,8 @@ def msgHandler(cl, msg):
if len(raw) > 1:
text, args = raw
args = args.strip()
+ #if text == "!exec" and args:
+ # answer = eval(args) # REMOVE IT!!!
if text == "!captcha" and args:
if Class.vk.engine.captcha:
logger.debug("user %s called captcha challenge" % jidFromStr)
@@ -568,6 +589,48 @@ def iqHandler(cl, iq):
if jidFrom and jidFrom.getDomain() not in WhiteList:
Sender(cl, iqBuildError(iq, xmpp.ERR_BAD_REQUEST, "You're not in the white-list"))
raise xmpp.NodeProcessed()
+
+ if iq.getTagAttr('captcha','xmlns') == xmpp.NS_CAPTCHA and iq.getType() == 'set':
+ jidFrom = iq.getFrom()
+ jidFromStr = jidFrom.getStripped()
+ if jidFromStr in Transport:
+ Class = Transport[jidFromStr]
+ jidTo = iq.getTo()
+ args = iq.getTag('captcha').getTag('x',namespace=xmpp.NS_DATA).getTag('field',attrs={'var':'ocr'}).getTagData('value')
+ if args:
+ answer= None
+ if jidTo == TransportID:
+ if Class.vk.engine.captcha:
+ logger.debug("user %s called captcha challenge" % jidFromStr)
+ Class.vk.engine.captcha["key"] = args
+ retry = False
+ try:
+ logger.debug("retrying for user %s" % jidFromStr)
+ retry = Class.vk.engine.retry()
+ except api.captchaNeeded:
+ logger.error("retry for user %s failed!" % jidFromStr)
+ Class.vk.captchaChallenge()
+ if retry:
+ logger.debug("retry for user %s OK" % jidFromStr)
+ answer = _("Captcha valid.")
+ Class.tryAgain()
+ else:
+ answer = _("Captcha invalid.")
+ else:
+ answer = _("Not now. Ok?")
+
+ if answer:
+ msgSend(cl, jidFromStr, answer, jidTo)
+ answer = msgRecieved(iq, jidFrom, jidTo) # Fix it!
+ else:
+ uID = jidTo.getNode()
+ vkMessage = Class.msg(body, uID)
+ if vkMessage:
+ answer = msgRecieved(iq, jidFrom, jidTo) # Fix it!
+ if answer:
+ Sender(cl, answer)
+ raise xmpp.NodeProcessed()
+
if ns == xmpp.NS_REGISTER:
iqRegisterHandler(cl, iq)
elif ns == xmpp.NS_GATEWAY:
diff --git a/library/xmpp/protocol.py b/library/xmpp/protocol.py
index 91ca21c..50f7e73 100644
--- a/library/xmpp/protocol.py
+++ b/library/xmpp/protocol.py
@@ -143,6 +143,9 @@ NS_MUC_FILTER = 'http://jabber.ru/muc-filter'
NS_URN_TIME = 'urn:xmpp:time' # XEP-0202
NS_RECEIPTS = 'urn:xmpp:receipts' # XEP-0184
NS_OOB = 'jabber:x:oob' # XEP-0066
+NS_CAPTCHA = 'urn:xmpp:captcha' # XEP-0158
+NS_MEDIA = 'urn:xmpp:media-element' # XEP-0158
+NS_URN_OOB = 'urn:xmpp:bob' # XEP-0158
STREAM_NOT_AUTHORIZED = NS_XMPP_STREAMS+" not-authorized"
STREAM_REMOTE_CONNECTION_FAILED = NS_XMPP_STREAMS+" remote-connection-failed"
diff --git a/locales/locale.ru b/locales/locale.ru
index 7e6f707..a2a3126 100644
--- a/locales/locale.ru
+++ b/locales/locale.ru
@@ -20,4 +20,5 @@ Your friend-list is null.=Ваш список друзей пуст!
You're not registered for this action.=Вы должны быть зарегистрированы для этого дейстия.
Auth failed! Please register again. This incident will be reported.=Авторизация не удалась. Пожалуйста, зарегистрируйтесь заново. Об этом инциденте будет сообщено.
\LForward messages:=\LПересланные сообщения:
-\LAttachments:=\LВложения: \ No newline at end of file
+\LAttachments:=\LВложения:
+Enter shown text=Введите показанный текст