Beispiel #1
0
	def method(self, method, args=None, nodecode=False, force=False):
		args = args or {}
		result = {}
		Stats["method"] += 1
		if not self.engine.captcha and (self.Online or force):
			try:
				result = self.engine.method(method, args, nodecode)
			except api.CaptchaNeeded:
				logger.error("VKLogin: running captcha challenge for %s" % self.source)
				self.captchaChallenge()
				result = 0
			except api.NotAllowed:
				if self.engine.lastMethod[0] == "messages.send":
					msgSend(Component, self.source, _("You're not allowed to perform this action."), vk2xmpp(args.get("user_id", TransportID)))
			except api.VkApiError as e:
				roster = False
				if e.message == "User authorization failed: user revoke access for this token.":
					logger.critical("VKLogin: %s" % e.message)
					roster = True
				elif e.message == "User authorization failed: invalid access_token.":
					msgSend(Component, self.source, _(e.message + " Please, register again"), TransportID)
				try:
					deleteUser(Transport.get(self.source, self), roster, False)
				except KeyError:
					pass

				self.Online = False
				logger.error("VKLogin: apiError %s for user %s" % (e.message, self.source))
			except api.NetworkNotFound:
				logger.critical("VKLogin: network unavailable. Is vk down?")
				self.Online = False
		return result
Beispiel #2
0
	def method(self, method, args = None):
		args = args or {}
		result = {}
		if not self.engine.captcha and self.Online:
			try:
				result = self.engine.method(method, args)
			except api.CaptchaNeeded:
				logger.error("VKLogin: running captcha challenge for %s" % self.jidFrom)
				self.captchaChallenge()
			except api.NotAllowed:
				if self.engine.lastMethod[0] == "messages.send":
					msgSend(Component, self.jidFrom, _("You're not allowed to perform this action."), vk2xmpp(args.get("user_id", TransportID)))
			except api.VkApiError as e:
				if e.message == "User authorization failed: user revoke access for this token.":
					try:
						logger.critical("VKLogin: %s" % e.message)
						Transport[self.jidFrom].deleteUser()
					except KeyError:
						pass
				elif e.message == "User authorization failed: invalid access_token.":
					msgSend(Component, self.jidFrom, _(e.message + " Please, register again"), TransportID)
				self.Online = False
				logger.error("VKLogin: apiError %s for user %s" % (e.message, self.jidFrom))
			except api.NetworkNotFound:
				logger.critical("VKLogin: network unavailable. Is vk down?")
				self.Online = False
		return result
Beispiel #3
0
	def captchaChallenge(self):
		if self.engine.captcha:
			logger.debug("VKLogin: sending message with captcha to %s" % self.jidFrom)
			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"]
			Types = (dict(type = "form"), dict(type = "hidden", var = "form"))
			msg = xmpp.Message(self.jidFrom, body, "chat", frm = TransportID)
			msg.setTag("x", {}, xmpp.NS_OOB)
			xTag = msg.getTag("x", {}, xmpp.NS_OOB)
			xTag.setTagData("url", self.engine.captcha["img"])
			msg.setTag("captcha", {}, xmpp.NS_CAPTCHA)
			cTag = msg.getTag("captcha", {}, xmpp.NS_CAPTCHA)
			cTag.setTag("x", Types[0], xmpp.NS_DATA)
			imgData = vCardGetPhoto(self.engine.captcha["img"], False)
			imgHash = sha1(imgData).hexdigest()
			imgEncoded = imgData.encode("base64")
			cxTag = cTag.setTag("x", Types[0], xmpp.NS_DATA)
			cxTag.addChild("field", dict(type = "hidden", var = "FORM_TYPE"), 
									[xmpp.Node("value", payload = [xmpp.NS_CAPTCHA])])
			cxTag.addChild("field", dict(type = "hidden", var = "from"),
									[xmpp.Node("value", payload = [TransportID])])
			cxTag.addChild("field", {"label": _("Enter shown text"), "var": "ocr"}, 
									[xmpp.Node("required"),	xmpp.Node("media", {"xmlns": xmpp.NS_MEDIA}, 
									[xmpp.Node("uri", {"type": "image/jpg"}, ["cid:sha1+%[email protected]" % imgHash])])])
			msg.setTag("data", {"cid": "*****@*****.**" % imgHash, "type":"image/jpg", "max-age":"0"}, xmpp.NS_URN_OOB)
			obTag = msg.getTag("data", {"cid": "*****@*****.**" % imgHash, "type": "image/jpg", "max-age": "0"}, xmpp.NS_URN_OOB)
			obTag.setData(imgEncoded)
			Sender(Component, msg)
			Presence = xmpp.protocol.Presence(self.jidFrom, frm = TransportID)
			Presence.setStatus(body)
			Presence.setShow("xa")
			Sender(Component, Presence)
		else:
			logger.error("VKLogin: captchaChallenge called without captcha for user %s" % self.jidFrom)
Beispiel #4
0
 def method(self, method, args=None):
     args = args or {}
     result = {}
     if not self.engine.captcha and self.Online:
         try:
             result = self.engine.method(method, args)
         except api.CaptchaNeeded:
             logger.error("VKLogin: running captcha challenge for %s" %
                          self.jidFrom)
             self.captchaChallenge()
         except api.NotAllowed:
             if self.engine.lastMethod[0] == "messages.send":
                 msgSend(Component, self.jidFrom,
                         _("You're not allowed to perform this action."),
                         vk2xmpp(args.get("user_id", TransportID)))
         except api.VkApiError as e:
             if e.message == "User authorization failed: user revoke access for this token.":
                 try:
                     logger.critical("VKLogin: %s" % e.message)
                     Transport[self.jidFrom].deleteUser()
                 except KeyError:
                     pass
             elif e.message == "User authorization failed: invalid access_token.":
                 msgSend(Component, self.jidFrom,
                         _(e.message + " Please, register again"),
                         TransportID)
             self.Online = False
             logger.error("VKLogin: apiError %s for user %s" %
                          (e.message, self.jidFrom))
         except api.NetworkNotFound:
             logger.critical("VKLogin: network unavailable. Is vk down?")
             self.Online = False
     return result
Beispiel #5
0
 def captchaChallenge(self):
     if self.engine.captcha:
         logger.debug("VKLogin: sending message with captcha to %s" %
                      self.jidFrom)
         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"]
         Types = (dict(type="form"), dict(type="hidden", var="form"))
         msg = xmpp.Message(self.jidFrom, body, "chat", frm=TransportID)
         msg.setTag("x", {}, xmpp.NS_OOB)
         xTag = msg.getTag("x", {}, xmpp.NS_OOB)
         xTag.setTagData("url", self.engine.captcha["img"])
         msg.setTag("captcha", {}, xmpp.NS_CAPTCHA)
         cTag = msg.getTag("captcha", {}, xmpp.NS_CAPTCHA)
         cTag.setTag("x", Types[0], xmpp.NS_DATA)
         imgData = vCardGetPhoto(self.engine.captcha["img"], False)
         imgHash = sha1(imgData).hexdigest()
         imgEncoded = imgData.encode("base64")
         cxTag = cTag.setTag("x", Types[0], xmpp.NS_DATA)
         cxTag.addChild("field", dict(type="hidden", var="FORM_TYPE"),
                        [xmpp.Node("value", payload=[xmpp.NS_CAPTCHA])])
         cxTag.addChild("field", dict(type="hidden", var="from"),
                        [xmpp.Node("value", payload=[TransportID])])
         cxTag.addChild("field", {
             "label": _("Enter shown text"),
             "var": "ocr"
         }, [
             xmpp.Node("required"),
             xmpp.Node("media", {"xmlns": xmpp.NS_MEDIA}, [
                 xmpp.Node("uri", {"type": "image/jpg"},
                           ["cid:sha1+%[email protected]" % imgHash])
             ])
         ])
         msg.setTag(
             "data", {
                 "cid": "*****@*****.**" % imgHash,
                 "type": "image/jpg",
                 "max-age": "0"
             }, xmpp.NS_URN_OOB)
         obTag = msg.getTag(
             "data", {
                 "cid": "*****@*****.**" % imgHash,
                 "type": "image/jpg",
                 "max-age": "0"
             }, xmpp.NS_URN_OOB)
         obTag.setData(imgEncoded)
         Sender(Component, msg)
         Presence = xmpp.protocol.Presence(self.jidFrom, frm=TransportID)
         Presence.setStatus(body)
         Presence.setShow("xa")
         Sender(Component, Presence)
     else:
         logger.error(
             "VKLogin: captchaChallenge called without captcha for user %s"
             % self.jidFrom)
Beispiel #6
0
 def captchaChallenge(self):
     if self.engine.captcha:
         logger.debug("VKLogin: sending message with captcha to %s" %
                      self.jidFrom)
         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)
         xTag = msg.setTag("x", {}, xmpp.NS_OOB)
         xTag.setTagData("url", self.engine.captcha["img"])
         cTag = msg.setTag("captcha", {}, xmpp.NS_CAPTCHA)
         imgData = vCardGetPhoto(self.engine.captcha["img"], False)
         if imgData:
             imgHash = sha1(imgData).hexdigest()
             imgEncoded = imgData.encode("base64")
             form = xmpp.DataForm("form")
             form.setField("FORM_TYPE", xmpp.NS_CAPTCHA, "hidden")
             form.setField("from", TransportID, "hidden")
             field = form.setField("ocr")
             field.setLabel(_("Enter shown text"))
             field.delAttr("type")
             field.setPayload([
                 xmpp.Node("required"),
                 xmpp.Node("media", {"xmlns": xmpp.NS_MEDIA}, [
                     xmpp.Node("uri", {"type": "image/jpg"},
                               ["cid:sha1+%[email protected]" % imgHash])
                 ])
             ])
             cTag.addChild(node=form)
             obTag = msg.setTag(
                 "data", {
                     "cid": "*****@*****.**" % imgHash,
                     "type": "image/jpg",
                     "max-age": "0"
                 }, xmpp.NS_URN_OOB)
             obTag.setData(imgEncoded)
         else:
             logger.critical(
                 "VKLogin: can't add captcha image to message url:%s" %
                 self.engine.captcha["img"])
         Sender(Component, msg)
         Presence = xmpp.protocol.Presence(self.jidFrom, frm=TransportID)
         Presence.setStatus(body)
         Presence.setShow("xa")
         Sender(Component, Presence)
     else:
         logger.error(
             "VKLogin: captchaChallenge called without captcha for user %s"
             % self.jidFrom)
Beispiel #7
0
	def sendMessages(self):
		messages = self.vk.getMessages(None, 200, lastMsgID = self.lastMsgID) # messages.getLastActivity
		if messages:
			messages = messages[1:]
			messages = sorted(messages, lambda a, b: a["date"] - b["date"])
			if messages:
				self.lastMsgID = messages[-1]["mid"]
				read = list()
				for message in messages:
					read.append(str(message.get("mid", 0)))
					fromjid = vk2xmpp(message["uid"])
					body = uHTML(message["body"])
					body += self.parseAttachments(message)
					if message.has_key("fwd_messages"):
						body += _("\nForward messages:")
						fwd_messages = sorted(message["fwd_messages"], lambda a, b: a["date"] - b["date"])
						for fwd in fwd_messages:
							idFrom = fwd["uid"]
							date = fwd["date"]
							fwdBody = uHTML(fwd["body"])
							date = datetime.fromtimestamp(date).strftime("%d.%m.%Y %H:%M:%S")
							if idFrom not in self.friends:
								name = self.vk.method("users.get", {"fields": "screen_name", "user_ids": idFrom})
								if name:
									name = name.pop()
									name = u"%s %s" % (name["first_name"], name["last_name"])
							else:
								name = self.friends[idFrom]["name"]
							body += "\n[%s] <%s> %s" % (date, name, fwdBody)
							body += self.parseAttachments(fwd)
					msgSend(self.cl, self.jUser, body, fromjid, message["date"])
				self.vk.msgMarkAsRead(read)
				if UseLastMessageID:
					with Database(DatabaseFile, Semaphore) as db:
						db("update users set lastMsgID=? where jid=?", (self.lastMsgID, self.jUser))
Beispiel #8
0
	def parseAttachments(self, msg):
		body = str()
		if msg.has_key("attachments"):
			if msg["body"]:
				body += _("\nAttachments:")
			attachments = msg["attachments"]
			for att in attachments:
				key = att.get("type")
				if key == "wall":
					continue	
				elif key == "photo":
					keys = ("src_xxxbig", "src_xxbig", "src_xbig", "src_big", "url", "src", "src_small")
					for dKey in keys:
						if att[key].has_key(dKey):
							body += "\n" + att[key][dKey]
							break
				elif key == "video":
					body += "\nVideo: http://vk.com/video%(owner_id)s_%(vid)s — %(title)s"
				elif key == "audio":
					body += "\nAudio: %(performer)s — %(title)s — %(url)s"
				elif key == "doc":
					body += "\nDocument: %(title)s — %(url)s"
				else:
					body += "\nUnknown attachment: " + str(att[key])
				body = body % att.get(key, {})
		return body
Beispiel #9
0
    def method(self, method, args=None, force=False, notoken=False):
        """
		This is a duplicate function of self.engine.method
		Needed to handle errors properly exactly in __main__
		Args:
			method: a VK API method
			args: method arguments
			force: whether to force execution (ignore self.online and captcha)
			notoken: whether to cut the token from the request
		Returns:
			The method execution result
		See library/vkapi.py for more information about exceptions
		"""
        args = args or {}
        result = {}
        self.methods += 1
        Stats["method"] += 1
        if not self.engine.captcha and (self.online or force):
            try:
                result = self.engine.method(method, args, notoken=notoken)
            except (api.InternalServerError, api.AccessDenied) as e:
                if force:
                    raise

            except api.CaptchaNeeded as e:
                executeHandlers("evt04", (self.source, self.engine.captcha))
                self.online = False

            except api.NetworkNotFound as e:
                self.online = False

            except api.NotAllowed as e:
                if self.engine.lastMethod[0] == "messages.send":
                    sendMessage(
                        self.source, vk2xmpp(args.get("user_id", TransportID)),
                        _("You're not allowed to perform this action."))

            except api.VkApiError as e:
                # There are several types of VkApiError
                # But the user definitely must be removed.
                # The question is: how?
                # Should we completely exterminate them or just remove?
                roster = False
                m = e.message
                # TODO: Make new exceptions for each of the conditions below
                if m == "User authorization failed: user revoke access for this token.":
                    roster = True
                elif m == "User authorization failed: invalid access_token.":
                    sendMessage(self.source, TransportID,
                                m + " Please, register again")
                utils.runThread(removeUser, (self.source, roster))
                logger.error("VK: apiError %s (jid: %s)", m, self.source)
                self.online = False
            else:
                return result
            logger.error(
                "VK: error %s occurred while executing"
                " method(%s) (%s) (jid: %s)", e.__class__.__name__, method,
                e.message, self.source)
            return result
Beispiel #10
0
def removeUser(user, roster=False, notify=True):
	"""
	Removes user from database
	Parameters:
		user: User class object or jid without resource
		roster: remove vk contacts from user's roster
			(only if User class object was in the first param)
	"""
	if isinstance(user, (str, unicode)):  # unicode is the default, but... who knows
		source = user
	elif user:
		source = user.source
	user = Transport.get(source)
	if notify:
		# Would russians understand the joke?
		sendMessage(source, TransportID,
			_("Your record was EXTERMINATED from the database."
				" Let us know if you feel exploited."), -1)
	logger.debug("User: removing user from db (jid: %s)" % source)
	runDatabaseQuery("delete from users where jid=?", (source,), True)
	logger.debug("User: deleted (jid: %s)", source)
	if source in Transport:
		del Transport[source]
	if roster and user:
		friends = user.friends
		user.exists = False  # Make the Daleks happy
		if friends:
			logger.debug("User: removing myself from roster (jid: %s)", source)
			for id in friends.keys() + [TransportID]:
				jid = vk2xmpp(id)
				sendPresence(source, jid, "unsubscribe")
				sendPresence(source, jid, "unsubscribed")
			user.settings.exterminate()
			executeHandlers("evt03", (user,))
		user.vk.online = False
Beispiel #11
0
def removeUser(user, roster=False, semph=Semaphore):
	"""
	Removes user from database
	Parameters:
		user: User class object or jid without resource
		roster: remove vk contacts from user's roster (only if User class object was in first param)
		semph: use semaphore if needed
	"""
	if isinstance(user, (str, unicode)): # unicode is default, but... who knows
		source = user
	else:
		source = user.source
	user = Transport.get(source) ## here's probability it's not the User object
	sendMessage(Component, source, TransportID, _("The record in database about you was EXTERMINATED! If you weren't asked for it, then let us know."), -1) ## Will russians understand this joke?
	logger.debug("User: removing user from db (jid: %s)" % source)
	with Database(DatabaseFile, semph) as db:
		db("delete from users where jid=?", (source,))
		db.commit()

	if roster and user:
		friends = user.friends
		user.exists = False ## Make the Daleks happy
		if friends:
			logger.debug("User: removing myself from roster (jid: %s)" % source)
			for id in friends.keys():
				jid = vk2xmpp(id)
				sendPresence(source, jid, "unsubscribe")
				sendPresence(source, jid, "unsubscribed")
			sendPresence(source, TransportID, "unsubscribe")
			sendPresence(source, TransportID, "unsubscribed")
			user.settings.exterminate()
			executeHandlers("evt03", (user,))
		Poll.remove(user)
		user.vk.online = False
		del Transport[source]
Beispiel #12
0
	def method(self, method, args=None, force=False, notoken=False):
		"""
		This is a duplicate function of self.engine.method
		Needed to handle errors properly exactly in __main__
		Args:
			method: a VK API method
			args: method arguments
			force: whether to force execution (ignore self.online and captcha)
			notoken: whether to cut the token from the request
		Returns:
			The method execution result
		See library/vkapi.py for more information about exceptions
		"""
		args = args or {}
		result = {}
		self.methods += 1
		Stats["method"] += 1
		if not self.engine.captcha and (self.online or force):
			try:
				result = self.engine.method(method, args, notoken=notoken)
			except (api.InternalServerError, api.AccessDenied) as e:
				if force:
					raise

			except api.CaptchaNeeded as e:
				executeHandlers("evt04", (self.source, self.engine.captcha))
				self.online = False

			except api.NetworkNotFound as e:
				self.online = False

			except api.NotAllowed as e:
				if self.engine.lastMethod[0] == "messages.send":
					sendMessage(self.source,
						vk2xmpp(args.get("user_id", TransportID)),
						_("You're not allowed to perform this action."))

			except api.VkApiError as e:
				# There are several types of VkApiError
				# But the user definitely must be removed.
				# The question is: how?
				# Should we completely exterminate them or just remove?
				roster = False
				m = e.message
				# TODO: Make new exceptions for each of the conditions below
				if m == "User authorization failed: user revoke access for this token.":
					roster = True
				elif m == "User authorization failed: invalid access_token.":
					sendMessage(self.source, TransportID,
						m + " Please, register again")
				utils.runThread(removeUser, (self.source, roster))
				logger.error("VK: apiError %s (jid: %s)", m, self.source)
				self.online = False
			else:
				return result
			logger.error("VK: error %s occurred while executing"
				" method(%s) (%s) (jid: %s)",
				e.__class__.__name__, method, e.message, self.source)
			return result
Beispiel #13
0
	def method(self, method, args=None, nodecode=False, force=False):
		"""
		This is a duplicate function of self.engine.method
		Needed to handle errors properly exactly in __main__
		Parameters:
			method: obviously VK API method
			args: method aruments
			nodecode: decode flag (make json.loads or not)
			force: says that method will be executed even the captcha and not online
		See library/vkapi.py for more information about exceptions
		Returns method result
		"""
		args = args or {}
		result = {}
		Stats["method"] += 1
		if not self.engine.captcha and (self.online or force):
			try:
				result = self.engine.method(method, args, nodecode)
			except api.InternalServerError as e:
				logger.error("VK: internal server error occurred while executing method(%s) (%s) (jid: %s)" % (method, e.message, self.source))
			
			except api.CaptchaNeeded:
				logger.error("VK: running captcha challenge (jid: %s)" % self.source)
				self.captchaChallenge()
				result = 0 ## why?
			
			except api.NotAllowed:
				if self.engine.lastMethod[0] == "messages.send":
					sendMessage(Component, self.source, vk2xmpp(args.get("user_id", TransportID)), _("You're not allowed to perform this action."))
			
			except api.NetworkNotFound:
				logger.critical("VK: network is unavailable. Is vk down or you have network problems?")
				self.online = False
			
			except api.VkApiError as e:
				roster = False
				if e.message == "User authorization failed: user revoke access for this token.":
					logger.critical("VK: %s" % e.message)
					roster = True
				elif e.message == "User authorization failed: invalid access_token.":
					sendMessage(Component, self.source, TransportID, _(e.message + " Please, register again"))
				## We are removing this user from database. Why? Just in case.
				removeUser(Transport.get(self.source, self), roster, False)
				logger.error("VK: apiError %s for user %s" % (e.message, self.source))
				self.online = False
		return result
Beispiel #14
0
	def method(self, method, args=None, force=False):
		"""
		This is a duplicate function of self.engine.method
		Needed to handle errors properly exactly in __main__
		Parameters:
			method: obviously VK API method
			args: method aruments
			nodecode: decode flag (make json.loads or not)
			force: says that method will be executed even the captcha and not online
		See library/vkapi.py for more information about exceptions
		Returns method execution result
		"""
		args = args or {}
		result = {}
		Stats["method"] += 1
		if not self.engine.captcha and (self.online or force):
			try:
				result = self.engine.method(method, args)
			except (api.InternalServerError, api.AccessDenied) as e:
				if force:
					raise

			except api.CaptchaNeeded as e:
				executeHandlers("evt04", (self, self.engine.captcha["img"]))
				self.online = False

			except api.NetworkNotFound as e:
				self.online = False

			except api.NotAllowed as e:
				if self.engine.lastMethod[0] == "messages.send":
					sendMessage(Component, self.source,
						vk2xmpp(args.get("user_id", TransportID)),
						_("You're not allowed to perform this action."))

			except api.VkApiError as e:
				# There are several types of VkApiError
				# But the user defenitely must be removed.
				# The question is: how?
				# Are they should be completely exterminated or just removed?
				roster = False
				m = e.message
				# Probably should be done in vkapi.py by status codes
				if m == "User authorization failed: user revoke access for this token.":
					roster = True
				elif m == "User authorization failed: invalid access_token.":
					sendMessage(Component, self.source, TransportID,
						m + " Please, register again")
				utils.runThread(removeUser, (self.source, roster))
				logger.error("VK: apiError %s (jid: %s)", m, self.source)
				self.online = False
			else:
				return result
			logger.error("VK: error %s occurred while executing"
				" method(%s) (%s) (jid: %s)",
				e.__class__.__name__, method, e.message, self.source)
			return result
Beispiel #15
0
def main():
	Counter = [0, 0]
	getPid()
	initDatabase(DatabaseFile)
	globals()["Component"] = xmpp.Component(Host, debug = DEBUG_XMPPPY)
	Print("\n#-# Connecting: ", False)
	if not Component.connect((Server, Port)):
		Print("fail.\n", False)
		crashLog("main.connect")
	else:
		Print("ok.\n", False)
		Print("#-# Auth: ", False)
		if not Component.auth(TransportID, Password):
			Print("fail (%s/%s)!\n" % (Component.lastErr, Component.lastErrCode), True)
		else:
			Print("ok.\n", False)
			Print("#-# Initializing users", False)
			with Database(DatabaseFile) as db:
				users = db("select * from users").fetchall()
				for user in users:
					jid, phone = user[:2]
					Transport[jid] = tUser((phone, None), jid)
					try:
						if Transport[jid].connect():
							TransportsList.append(Transport[jid])
							if DefaultStatus == 1:
								Transport[jid].init(None, False)
							Print(".", False)
							Counter[0] += 1
						else:
							Print("!", False)
							Counter[1] += 1
							crashLog("main.connect", 0, False)
							msgSend(Component, jid, _("Auth failed! If this error repeated, please register again. This incident will be reported."), TransportID)
					except KeyboardInterrupt:
						exit()
					except:
						crashLog("main.init")
						continue
			Print("\n#-# Connected %d/%d users." % (Counter[0], len(TransportsList)))
			if Counter[1]:
				Print("#-# Failed to connect %d users." % Counter[1])

			globals()["lengthOfTransportsList"] = int(ceil(float(len(TransportsList)) / SLICE_STEP) * SLICE_STEP)
			Component.RegisterHandler("iq", iqHandler)
			Component.RegisterHandler("presence", prsHandler)
			Component.RegisterHandler("message", msgHandler)
			Component.RegisterDisconnectHandler(disconnectHandler)

			for start in xrange(0, lengthOfTransportsList, SLICE_STEP):
				end = start + SLICE_STEP
				threadRun(hyperThread, (start, end), "hyperThread-%d" % start)

			Print("\n#-# Finished.")
Beispiel #16
0
	def captchaChallenge(self):
		if self.engine.captcha:
			logger.debug("VKLogin: sending message with captcha to %s" % self.jidFrom)
			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)
			xTag = msg.setTag("x", {}, xmpp.NS_OOB)
			xTag.setTagData("url", self.engine.captcha["img"])
			cTag = msg.setTag("captcha", {}, xmpp.NS_CAPTCHA)
			imgData = vCardGetPhoto(self.engine.captcha["img"], False)
			if imgData:
				imgHash = sha1(imgData).hexdigest()
				imgEncoded = imgData.encode("base64")
				form = xmpp.DataForm("form")
				form.setField("FORM_TYPE", xmpp.NS_CAPTCHA, "hidden")
				form.setField("from", TransportID, "hidden")
				field = form.setField("ocr")
				field.setLabel(_("Enter shown text"))
				field.delAttr("type")
				field.setPayload([xmpp.Node("required"),
					xmpp.Node("media", {"xmlns": xmpp.NS_MEDIA},
						[xmpp.Node("uri", {"type": "image/jpg"},
							["cid:sha1+%[email protected]" % imgHash])])])
				cTag.addChild(node=form)
				obTag = msg.setTag("data", {"cid": "*****@*****.**" % imgHash, "type": "image/jpg", "max-age": "0"}, xmpp.NS_URN_OOB)
				obTag.setData(imgEncoded)
			else:
				logger.critical("VKLogin: can't add captcha image to message url:%s" % self.engine.captcha["img"])
			Sender(Component, msg)
			Presence = xmpp.protocol.Presence(self.jidFrom, frm = TransportID)
			Presence.setStatus(body)
			Presence.setShow("xa")
			Sender(Component, Presence)
		else:
			logger.error("VKLogin: captchaChallenge called without captcha for user %s" % self.jidFrom)
Beispiel #17
0
    def connect(self):
        logger.debug("tUser: connecting %s" % self.jidFrom)
        self.auth = False
        try:
            self.auth = self.vk.auth(self.token)
            logger.debug("tUser: auth=%s for %s" % (self.auth, self.jidFrom))
        except api.CaptchaNeeded:
            self.rosterSubscribe()
            self.vk.captchaChallenge()
            return True
        except api.TokenError as e:
            if e.message == "User authorization failed: user revoke access for this token.":
                logger.critical("tUser: %s" % e.message)
                self.deleteUser()
            elif e.message == "User authorization failed: invalid access_token.":
                msgSend(Component, self.jidFrom,
                        _(e.message + " Please, register again"), TransportID)
            self.vk.Online = False
        except:
            crashLog("tUser.Connect")
            return False

        if self.auth and self.vk.getToken():
            logger.debug("tUser: updating db for %s because auth done " %
                         self.jidFrom)
            if not self.existsInDB:
                with Database(DatabaseFile, Semaphore) as db:
                    db("insert into users values (?,?,?,?,?)",
                       (self.jidFrom, self.username, self.vk.getToken(),
                        self.lastMsgID, self.rosterSet))
            elif self.password:
                with Database(DatabaseFile, Semaphore) as db:
                    db("update users set token=? where jid=?",
                       (self.vk.getToken(), self.jidFrom))
            try:
                json = self.vk.method("users.get")
                self.UserID = json[0]["uid"]
            except (KeyError, TypeError):
                logger.error("tUser: could not recieve user id. JSON: %s" %
                             str(json))
                self.UserID = 0

            jidToID[self.UserID] = self.jidFrom
            self.friends = self.vk.getFriends()
            self.vk.Online = True
        if not UseLastMessageID:
            self.lastMsgID = 0
        return self.vk.Online
Beispiel #18
0
	def connect(self):
		logger.debug("tUser: connecting %s" % self.jidFrom)
		self.auth = False
		try:
			self.auth = self.vk.auth(self.token)
			logger.debug("tUser: auth=%s for %s" % (self.auth, self.jidFrom))
		except api.CaptchaNeeded:
			self.rosterSubscribe()
			self.vk.captchaChallenge()
			return True
		except api.TokenError as e:
			if e.message == "User authorization failed: user revoke access for this token.":
				logger.critical("tUser: %s" % e.message)
				self.deleteUser()
			elif e.message == "User authorization failed: invalid access_token.":
				msgSend(Component, self.jidFrom, _(e.message + " Please, register again"), TransportID)
			self.vk.Online = False
		except:
			crashLog("tUser.Connect")
			return False

		if self.auth and self.vk.getToken():
			logger.debug("tUser: updating db for %s because auth done " % self.jidFrom)
			if not self.existsInDB:
				with Database(DatabaseFile, Semaphore) as db:
					db("insert into users values (?,?,?,?,?)", (self.jidFrom, self.username,
						self.vk.getToken(), self.lastMsgID, self.rosterSet))
			elif self.password:
				with Database(DatabaseFile, Semaphore) as db:
					db("update users set token=? where jid=?", (self.vk.getToken(), self.jidFrom))
			try:
				json = self.vk.method("users.get")
				self.UserID = json[0]["uid"]
			except (KeyError, TypeError):
				logger.error("tUser: could not recieve user id. JSON: %s" % str(json))
				self.UserID = 0

			jidToID[self.UserID] = self.jidFrom
			self.friends = self.vk.getFriends()
			self.vk.Online = True
		if not UseLastMessageID:
			self.lastMsgID = 0
		return self.vk.Online
Beispiel #19
0
	def method(self, method, args = {}, force = False):
		result = {}
		if not self.engine.captcha and self.Online or force:
			try:
				result = self.engine.method(method, args)
			except api.CaptchaNeeded:
				logger.error("VKLogin: running captcha challenge for %s" % self.jidFrom)
				self.captchaChallenge()
			except api.VkApiError as e:
				if e.message == "User authorization failed: user revoke access for this token.":
					try:
						Transport[self.jidFrom].deleteUser()
					except KeyError:
						pass
				elif e.message == "User authorization failed: invalid access_token.":
					msgSend(Component, self.jidFrom, _(e.message + " Please, register again"), TransportID)
				self.Online = False
				logger.error("VKLogin: apiError %s for user %s" % (e.message, self.jidFrom))
		return result
Beispiel #20
0
def removeUser(user, roster=False, notify=True):
    """
	Removes user from the database
	Args:
		user: User class object or jid without resource
		roster: remove vk contacts from user's roster
			(only if User class object was in the first param)
		notify: whether to let the user know that they're being exterminated
	"""
    if isinstance(user,
                  (str, unicode)):  # unicode is the default, but... who knows
        source = user
    elif user:
        source = user.source
    else:
        raise RuntimeError("Invalid user argument: %s" % str(user))
    if notify:
        sendMessage(
            source, TransportID,
            _("Your record was EXTERMINATED from the database."
              " Let us know if you feel exploited."), -1)
    logger.debug("User: removing user from db (jid: %s)" % source)
    runDatabaseQuery("delete from users where jid=?", (source, ), True)
    logger.debug("User: deleted (jid: %s)", source)

    user = Users.get(source)
    if user:
        del Users[source]
        if roster:
            friends = user.friends
            user.exists = False  # Make the Daleks happy
            if friends:
                logger.debug("User: removing myself from roster (jid: %s)",
                             source)
                for id in friends.keys() + [TransportID]:
                    jid = vk2xmpp(id)
                    sendPresence(source, jid, "unsubscribe")
                    sendPresence(source, jid, "unsubscribed")
                user.settings.exterminate()
                executeHandlers("evt03", (user, ))
            user.vk.online = False
Beispiel #21
0
 def method(self, method, args={}, force=False):
     result = {}
     if not self.engine.captcha and self.Online or force:
         try:
             result = self.engine.method(method, args)
         except api.CaptchaNeeded:
             logger.error("VKLogin: running captcha challenge for %s" %
                          self.jidFrom)
             self.captchaChallenge()
         except api.VkApiError as e:
             if e.message == "User authorization failed: user revoke access for this token.":
                 try:
                     Transport[self.jidFrom].deleteUser()
                 except KeyError:
                     pass
             elif e.message == "User authorization failed: invalid access_token.":
                 msgSend(Component, self.jidFrom,
                         _(e.message + " Please, register again"),
                         TransportID)
             self.Online = False
             logger.error("VKLogin: apiError %s for user %s" %
                          (e.message, self.jidFrom))
     return result
Beispiel #22
0
def main():
    Counter = [0, 0]
    getPid()
    initDatabase(DatabaseFile)
    globals()["Component"] = xmpp.Component(Host, debug=DEBUG_XMPPPY)
    Print("\n#-# Connecting: ", False)
    if not Component.connect((Server, Port)):
        Print("fail.\n", False)
        crashLog("main.connect")
    else:
        Print("ok.\n", False)
        Print("#-# Auth: ", False)
        if not Component.auth(TransportID, Password):
            Print(
                "fail (%s/%s)!\n" % (Component.lastErr, Component.lastErrCode),
                True)
        else:
            Print("ok.\n", False)
            Print("#-# Initializing users", False)
            with Database(DatabaseFile) as db:
                users = db("select * from users").fetchall()
                for user in users:
                    jid, phone = user[:2]
                    Transport[jid] = tUser((phone, None), jid)
                    try:
                        if Transport[jid].connect():
                            TransportsList.append(Transport[jid])
                            if DefaultStatus == 1:
                                Transport[jid].init(None, False)
                            Print(".", False)
                            Counter[0] += 1
                        else:
                            Print("!", False)
                            Counter[1] += 1
                            crashLog("main.connect", 0, False)
                            msgSend(
                                Component, jid,
                                _("Auth failed! If this error repeated, please register again. This incident will be reported."
                                  ), TransportID)
                    except KeyboardInterrupt:
                        exit()
                    except:
                        crashLog("main.init")
                        continue
            Print("\n#-# Connected %d/%d users." %
                  (Counter[0], len(TransportsList)))
            if Counter[1]:
                Print("#-# Failed to connect %d users." % Counter[1])

            globals()["lengthOfTransportsList"] = int(
                ceil(float(len(TransportsList)) / SLICE_STEP) * SLICE_STEP)
            Component.RegisterHandler("iq", iqHandler)
            Component.RegisterHandler("presence", prsHandler)
            Component.RegisterHandler("message", msgHandler)
            Component.RegisterDisconnectHandler(disconnectHandler)

            for start in xrange(0, lengthOfTransportsList, SLICE_STEP):
                end = start + SLICE_STEP
                threadRun(hyperThread, (start, end), "hyperThread-%d" % start)

            Print("\n#-# Finished.")
Beispiel #23
0
isNumber = lambda obj: (not apply(int, (obj,)) is None)

def vk2xmpp(id):
	if not isNumber(id) and "@" in id:
		id = id.split("@")[0]
		if isNumber(id):
			id = int(id)
	elif id == TransportID:
		return id
	else:
		id = u"%s@%s" % (id, TransportID)
	return id

DESC = _("© simpleApps, 2013 — 2014."
	"\nYou can support developing of any project"
	" via donation by WebMoney:"
	"\nZ405564701378 | R330257574689.")

def updateTransportsList(user, add = True):
	global lengthOfTransportsList
	if user in TransportsList:
		if add:
			return
		TransportsList.remove(user)
	elif add: 
		TransportsList.append(user)
	else:
		return
	length = len(TransportsList)
	if length > lengthOfTransportsList:
		start = lengthOfTransportsList
Beispiel #24
0
isNumber = lambda obj: (not apply(int, (obj, )) is None)


def vk2xmpp(id):
    if not isNumber(id) and "@" in id:
        id = id.split("@")[0]
        if isNumber(id):
            id = int(id)
    elif id == TransportID:
        return id
    else:
        id = u"%s@%s" % (id, TransportID)
    return id

DESC = _("© simpleApps, 2013."\
    "\nYou can support developing of any project"\
    " via donation by WebMoney:"\
    "\nZ405564701378 | R330257574689.")


def updateTransportsList(user, add=True):
    global lengthOfTransportsList
    if add and user not in TransportsList:
        TransportsList.append(user)
    elif user in TransportsList:
        TransportsList.remove(user)
    length = len(TransportsList)
    if length > lengthOfTransportsList:
        start = lengthOfTransportsList
        lengthOfTransportsList += SLICE_STEP
        end = lengthOfTransportsList
        threadRun(hyperThread, (start, end), "updateTransportsList")
Beispiel #25
0
# 06 - user became offline (linear)
## Messages: 01 outgoing (vk->xmpp), 02 incoming (xmpp), 03 is used to modify message (xmpp)
## Presences: 01 status change, 02 - is used to modify presence (xmpp)
Handlers = {"msg01": [], "msg02": [],
			"msg03": [],
			"evt01": [], "evt02": [],
			"evt03": [], "evt04": [],
			"evt05": [], "evt06": [],
			"prs01": [], "prs02": []}

Stats = {"msgin": 0, ## from vk
		 "msgout": 0, ## to vk
		 "method": 0}

DESC = _("© simpleApps, 2013 — 2014."
	"\nYou can support developing of this project"
	" via donation by:\nYandex.Money: 410012169830956"
	"\nWebMoney: Z405564701378 | R330257574689.")

def initDatabase(filename):
	"""
	Initializes database if it doesn't exists
	"""
	if not os.path.exists(filename):
		with Database(filename) as db:
			db("create table users (jid text, username text, token text, lastMsgID integer, rosterSet bool)")
			db.commit()
	return True

def execute(handler, list=()):
	"""
	Just executes handler(*list) safely
Beispiel #26
0
isNumber = lambda obj: (not apply(int, (obj,)) is None)

def vk2xmpp(id):
	if not isNumber(id) and "@" in id:
			id = id.split("@")[0]
			if isNumber(id):
				id = int(id)
	elif id == TransportID:
		return id
	else:
		id = u"%s@%s" % (id, TransportID)
	return id

DESC = _("© simpleApps, 2013."\
	   "\nYou can support developing of any project"\
	   " via donation by WebMoney:"\
	   "\nZ405564701378 | R330257574689.")
ProblemReport = _("If you found any problems, please contact us:\n"\
				"http://github.com/mrDoctorWho/vk4xmpp • xmpp:[email protected]")

def updateTransportsList(user, add=True): #$
	global lengthOfTransportsList
	if add and user not in TransportsList:
		TransportsList.append(user)
	elif user in TransportsList:
		TransportsList.remove(user)
	length = len(TransportsList)
	if length > lengthOfTransportsList:
		start = lengthOfTransportsList
		lengthOfTransportsList += SLICE_STEP
		end = lengthOfTransportsList