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
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
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)
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
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)
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)
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))
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
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
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
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]
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
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
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
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.")
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)
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
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
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
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
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.")
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
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")
# 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
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