def fromFilePath(fpath, url, mediaType, ip, to, mimeType = None, preview = None, filehash = None, filesize = None):
        mimeType = mimeType or MimeTools.getMIME(fpath)
        filehash = filehash or WATools.getFileHashForUpload(fpath)
        size = filesize or os.path.getsize(fpath)
        fileName = os.path.basename(fpath)

        return DownloadableMediaMessageProtocolEntity(mediaType, mimeType, filehash, url, ip, size, fileName, to = to, preview = preview)
Exemple #2
0
 def fromFilePath(fpath, url, mediaType, ip, to, mimeType = None, preview = None, filehash = None, filesize = None):
     mediaType = mediaType or MimeTools.getMIME(fpath)
     filehash = filehash or WATools.getFileHashForUpload2(fpath)
     size = filesize or os.path.getsize(fpath)
     fileName = os.path.basename(fpath)
     return DownloadableMediaMessageProtocolEntity(mediaType, mimeType, filehash, url, ip, size, fileName, to=to,
                                                   preview= preview)
 def fromBuilder(builder):
     url = builder.get("url")
     ip = builder.get("ip")
     assert url, "Url is required"
     mimeType = builder.get("mimetype", MimeTools.getMIME(builder.getOriginalFilepath()))
     filehash = WATools.getFileHashForUpload(builder.getFilepath())
     size = os.path.getsize(builder.getFilepath())
     fileName = os.path.basename(builder.getFilepath())
     return DownloadableMediaMessageProtocolEntity(builder.mediaType, mimeType, filehash, url, ip, size, fileName, to = builder.jid, preview = builder.get("preview"))
Exemple #4
0
 def fromBuilder(builder):
     url = builder.get("url")
     ip = builder.get("ip")
     assert url, "Url is required"
     mimeType = builder.get("mimetype", MimeTools.getMIME(builder.getOriginalFilepath()))
     filehash = WATools.getFileHashForUpload2(builder.getFilepath())
     size = os.path.getsize(builder.getFilepath())
     fileName = os.path.basename(builder.getFilepath())
     return DownloadableMediaMessageProtocolEntity(builder.mediaType, mimeType, filehash, url, ip, size, fileName, to = builder.jid, preview = builder.get("preview"))
Exemple #5
0
 def from_file(
         filepath, mimetype=None, file_length=None,
         file_sha256=None, url=None, media_key=None, context_info=None
 ):
     mimetype = MimeTools.getMIME(filepath) if mimetype is None else mimetype
     file_length = os.path.getsize(filepath) if file_length is None else file_length
     if file_sha256 is None:
         with open(filepath, 'rb') as f:
             file_sha256 = hashlib.sha256(f.read()).digest()
     return DownloadableMediaMessageAttributes(
         mimetype, file_length, file_sha256, url, media_key, context_info
     )
 def from_file(
         filepath, mimetype=None, file_length=None,
         file_sha256=None, url=None, media_key=None, context_info=None
 ):
     mimetype = MimeTools.getMIME(filepath) if mimetype is None else mimetype
     file_length = os.path.getsize(filepath) if file_length is None else file_length
     if file_sha256 is None:
         with open(filepath, 'rb') as f:
             file_sha256 = hashlib.sha256(f.read()).digest()
     return DownloadableMediaMessageAttributes(
         mimetype, file_length, file_sha256, url, media_key, context_info
     )
 def getExtension(self):
     return MimeTools.getExtension(self.mimeType)
 def getExtension(self):
     return MimeTools.getExtension(self.mimeType)
Exemple #9
0
    def run(self):

        sourcePath = self.sourcePath
        uploadUrl = self.uploadUrl
        _host = uploadUrl.replace("https://", "")

        self.url = _host[:_host.index('/')]

        try:
            filename = os.path.basename(sourcePath)
            filetype = MimeTools.getMIME(filename)
            filesize = os.path.getsize(sourcePath)

            self.sock.connect((self.url, self.port))
            ssl_sock = ssl.wrap_socket(self.sock)

            m = hashlib.md5()
            m.update(filename.encode())
            crypto = m.hexdigest() + os.path.splitext(filename)[1]

            boundary = "zzXXzzYYzzXXzzQQ"  # "-------" + m.hexdigest() #"zzXXzzYYzzXXzzQQ"
            contentLength = 0

            hBAOS = "--" + boundary + "\r\n"
            hBAOS += "Content-Disposition: form-data; name=\"to\"\r\n\r\n"
            hBAOS += self.jid + "\r\n"
            hBAOS += "--" + boundary + "\r\n"
            hBAOS += "Content-Disposition: form-data; name=\"from\"\r\n\r\n"
            hBAOS += self.accountJid.replace("@whatsapp.net", "") + "\r\n"

            hBAOS += "--" + boundary + "\r\n"
            hBAOS += "Content-Disposition: form-data; name=\"file\"; filename=\"" + crypto + "\"\r\n"
            hBAOS += "Content-Type: " + filetype + "\r\n\r\n"

            fBAOS = "\r\n--" + boundary + "--\r\n"

            contentLength += len(hBAOS)
            contentLength += len(fBAOS)
            contentLength += filesize

            POST = "POST %s\r\n" % uploadUrl
            POST += "Content-Type: multipart/form-data; boundary=" + boundary + "\r\n"
            POST += "Host: %s\r\n" % self.url
            POST += "User-Agent: %s\r\n" % self.getUserAgent()
            POST += "Content-Length: " + str(contentLength) + "\r\n\r\n"

            ssl_sock.write(bytearray(POST.encode()))
            ssl_sock.write(bytearray(hBAOS.encode()))

            totalsent = 0
            buf = 1024
            f = open(sourcePath, 'rb')
            stream = f.read()
            f.close()
            status = 0
            lastEmit = 0

            while totalsent < int(filesize):
                ssl_sock.write(stream[:buf])
                status = totalsent * 100 / filesize
                if lastEmit != status and status != 100 and filesize > 12288:
                    if self.progressCallback:
                        self.progressCallback(self.sourcePath, self.jid,
                                              uploadUrl, int(status))
                lastEmit = status
                stream = stream[buf:]
                totalsent = totalsent + buf

            ssl_sock.write(bytearray(fBAOS.encode()))

            sleep(1)
            data = ssl_sock.recv(8192)
            data += ssl_sock.recv(8192)
            data += ssl_sock.recv(8192)
            data += ssl_sock.recv(8192)
            data += ssl_sock.recv(8192)
            data += ssl_sock.recv(8192)
            data += ssl_sock.recv(8192)

            if self.progressCallback:
                self.progressCallback(self.sourcePath, self.jid, uploadUrl,
                                      100)

            lines = data.decode().splitlines()

            result = None

            for l in lines:
                if l.startswith("{"):
                    result = self.parser.parse(l, self.pvars)
                    break

            if not result:
                raise Exception("json data not found")

            if result["url"] is not None:
                if self.successCallback:
                    self.successCallback(sourcePath, self.jid, result["url"])
            else:
                logger.exception(
                    "uploadUrl: %s, result of uploading media has no url" %
                    uploadUrl)
                if self.errorCallback:
                    self.errorCallback(sourcePath, self.jid, uploadUrl)

        except:
            logger.exception("Error occured at transfer %s" %
                             sys.exc_info()[1])
            if self.errorCallback:
                self.errorCallback(sourcePath, self.jid, uploadUrl)
    def run(self):
        sourcePath = self.sourcePath
        uploadUrl = self.uploadUrl

        try:
            filename = os.path.basename(sourcePath)
            filetype = MimeTools.getMIME(filename)
            f = open(sourcePath, 'rb')
            stream = f.read()
            f.close()
            refkey = binascii.hexlify(os.urandom(32))
            stream = self.encryptMedia(stream, refkey, filetype)
            fenc = open(sourcePath + ".enc", 'wb')
            fenc.write(stream)
            fenc.seek(0, 2)
            filesize = fenc.tell()
            fenc.close()
            os.remove(sourcePath + ".enc")
            filesize2 = len(stream)

            sha1 = hashlib.sha256()
            sha1.update(stream)
            b64Hash = base64.b64encode(sha1.digest())

            file_enc_sha256 = hashlib.sha256(stream).hexdigest()

            #self.sock.connect((self.url, self.port))
            #ssl_sock = ssl.wrap_socket(self.sock)

            m = hashlib.md5()
            m.update(filename.encode())
            crypto = m.hexdigest() + os.path.splitext(filename)[1]

            digTo = hmac.new(
                "".encode("utf-8"),
                self.jid.replace("@s.whatsapp.net", "@c.us").encode("utf-8"),
                hashlib.sha256).digest()[:20]

            refTo = base64.b64encode(digTo).decode()

            digFrom = hmac.new(
                "".encode("utf-8"),
                self.accountJid.replace("@s.whatsapp.net",
                                        "@c.us").encode("utf-8"),
                hashlib.sha256).digest()[:20]
            refFrom = base64.b64encode(digFrom).decode()

            hBAOS = "------zzXXzzYYzzXXzzQQ\r\n"
            hBAOS += "Content-Disposition: form-data; name=\"hash\"\r\n\r\n"
            hBAOS += b64Hash.decode() + "\r\n"
            hBAOS += "------zzXXzzYYzzXXzzQQ\r\n"
            hBAOS += "Content-Disposition: form-data; name=\"refs\"\r\n\r\n"
            hBAOS += refTo + "\r\n"
            hBAOS += refFrom + "\r\n"
            hBAOS += "------zzXXzzYYzzXXzzQQ\r\n"
            hBAOS += "Content-Disposition: form-data; name=\"file\"; filename=\"" + "blob" + "\"\r\n"
            hBAOS += "Content-Type: " + "application/octet-stream" + "\r\n\r\n"

            fBAOS = "\r\n------zzXXzzYYzzXXzzQQ--"

            contentLength = len(hBAOS) + len(fBAOS) + len(stream)

            headers = {
                "content-length":
                str(contentLength),
                "user-agent":
                self.getUserAgent(),
                "content-type":
                "multipart/form-data; boundary=----zzXXzzYYzzXXzzQQ"
            }

            data = bytearray(hBAOS, 'utf-8') + stream + bytearray(
                fBAOS, 'utf-8')
            response = requests.post(uploadUrl, data=data, headers=headers)

            #lines = data.decode().splitlines()

            result = None

            if response.text.startswith("{"):
                result = self.parser.parse(response.text, self.pvars)

            if not result:
                raise Exception("json data not found")

            if result["url"] is not None:
                if self.successCallback:
                    # self.successCallback(sourcePath, self.jid, result["url"])
                    result["mediaKey"] = refkey
                    result["file_enc_sha256"] = file_enc_sha256
                    self.successCallback(sourcePath, self.jid, result)
            else:
                logger.exception(
                    "uploadUrl: %s, result of uploading media has no url" %
                    uploadUrl)
                if self.errorCallback:
                    self.errorCallback(sourcePath, self.jid, uploadUrl)

        except:
            logger.exception("Error occured at transfer %s" %
                             sys.exc_info()[1])
            if self.errorCallback:
                self.errorCallback(sourcePath, self.jid, uploadUrl)
Exemple #11
0
    def run(self):

        sourcePath = self.sourcePath
        uploadUrl = self.uploadUrl
        _host = uploadUrl.replace("https://", "")

        self.url = _host[:_host.index('/')]

        try:
            filename = os.path.basename(sourcePath)
            filetype = MimeTools.getMIME(filename)

            f = open(sourcePath, 'rb')
            stream = f.read()
            f.close()
            refkey = binascii.hexlify(os.urandom(32))
            stream = self.encryptMedia(stream, refkey, filetype)
            fenc = open(sourcePath + ".enc", 'wb')  # bahtiar
            fenc.write(stream)
            fenc.seek(0, 2)
            filesize = fenc.tell()
            fenc.close()
            os.remove(sourcePath + ".enc")
            filesize2 = len(stream)

            sha1 = hashlib.sha256()
            sha1.update(stream)
            b64Hash = base64.b64encode(sha1.digest())

            file_enc_sha256 = hashlib.sha256(stream).hexdigest()

            self.sock.connect((self.url, self.port))
            ssl_sock = ssl.wrap_socket(self.sock)

            m = hashlib.md5()
            m.update(filename.encode())
            crypto = m.hexdigest() + os.path.splitext(filename)[1]

            boundary = "zzXXzzYYzzXXzzQQ"  #"-------" + m.hexdigest() #"zzXXzzYYzzXXzzQQ"
            contentLength = 0

            digTo = hmac.new(
                "".encode("utf-8"),
                self.jid.replace("@s.whatsapp.net", "@c.us").encode("utf-8"),
                hashlib.sha256).digest()[:20]
            refTo = base64.b64encode(digTo).decode()
            digFrom = hmac.new(
                "".encode("utf-8"),
                self.accountJid.replace("@s.whatsapp.net",
                                        "@c.us").encode("utf-8"),
                hashlib.sha256).digest()[:20]
            refFrom = base64.b64encode(digFrom).decode()

            hBAOS = "--" + boundary + "\r\n"
            hBAOS += "Content-Disposition: form-data; name=\"hash\"\r\n\r\n"
            hBAOS += b64Hash.decode() + "\r\n"

            hBAOS += "--" + boundary + "\r\n"
            hBAOS += "Content-Disposition: form-data; name=\"refs\"\r\n\r\n"
            hBAOS += refFrom + "\r\n"
            hBAOS += refTo + "\r\n"

            hBAOS += "--" + boundary + "\r\n"
            hBAOS += "Content-Disposition: form-data; name=\"file\"; filename=\"" + "blob" + "\"\r\n"
            hBAOS += "Content-Type: " + "application/octet-stream" + "\r\n\r\n"

            fBAOS = "\r\n--" + boundary + "--\r\n"

            contentLength += len(hBAOS)
            contentLength += len(fBAOS)
            contentLength += filesize

            POST = "POST %s\r\n" % uploadUrl
            POST += "Content-Type: multipart/form-data; boundary=" + boundary + "\r\n"
            POST += "Host: %s\r\n" % self.url
            POST += "User-Agent: %s\r\n" % self.getUserAgent()
            POST += "Content-Length: " + str(contentLength) + "\r\n\r\n"

            ssl_sock.write(bytearray(POST.encode()))
            ssl_sock.write(bytearray(hBAOS.encode()))

            totalsent = 0
            buf = 1024
            status = 0
            lastEmit = 0

            while totalsent < int(filesize):
                ssl_sock.write(stream[:buf])
                status = totalsent * 100 / filesize
                if lastEmit != status and status != 100 and filesize > 12288:
                    if self.progressCallback:
                        self.progressCallback(self.sourcePath, self.jid,
                                              uploadUrl, int(status))
                lastEmit = status
                stream = stream[buf:]
                totalsent = totalsent + buf

            ssl_sock.write(bytearray(fBAOS.encode()))

            sleep(1)
            data = ssl_sock.recv(8192)
            data += ssl_sock.recv(8192)
            data += ssl_sock.recv(8192)
            data += ssl_sock.recv(8192)
            data += ssl_sock.recv(8192)
            data += ssl_sock.recv(8192)
            data += ssl_sock.recv(8192)

            if self.progressCallback:
                self.progressCallback(self.sourcePath, self.jid, uploadUrl,
                                      100)

            lines = data.decode().splitlines()

            result = None

            for l in lines:
                if l.startswith("{"):
                    result = self.parser.parse(l, self.pvars)
                    break

            if not result:
                raise Exception("json data not found")

            if result["url"] is not None:
                if self.successCallback:
                    # self.successCallback(sourcePath, self.jid, result["url"])
                    result["mediaKey"] = refkey
                    result["file_enc_sha256"] = file_enc_sha256
                    self.successCallback(sourcePath, self.jid, result)
            else:
                logger.exception(
                    "uploadUrl: %s, result of uploading media has no url" %
                    uploadUrl)
                if self.errorCallback:
                    self.errorCallback(sourcePath, self.jid, uploadUrl)

        except:
            logger.exception("Error occured at transfer %s" %
                             sys.exc_info()[1])
            if self.errorCallback:
                self.errorCallback(sourcePath, self.jid, uploadUrl)
Exemple #12
0
    def run(self):

        sourcePath = self.sourcePath
        uploadUrl = self.uploadUrl
        _host = uploadUrl.replace("https://","")

        self.url = _host[:_host.index('/')]


        try:
            filename = os.path.basename(sourcePath)
            filetype = MimeTools.getMIME(filename)
            filesize = os.path.getsize(sourcePath)

            self.sock.connect((self.url, self.port))
            ssl_sock = ssl.wrap_socket(self.sock)

            m = hashlib.md5()
            m.update(filename.encode())
            crypto = m.hexdigest() + os.path.splitext(filename)[1]

            boundary = "zzXXzzYYzzXXzzQQ"#"-------" + m.hexdigest() #"zzXXzzYYzzXXzzQQ"
            contentLength = 0

            hBAOS = "--" + boundary + "\r\n"
            hBAOS += "Content-Disposition: form-data; name=\"to\"\r\n\r\n"
            hBAOS += self.jid + "\r\n"
            hBAOS += "--" + boundary + "\r\n"
            hBAOS += "Content-Disposition: form-data; name=\"from\"\r\n\r\n"
            hBAOS += self.accountJid.replace("@whatsapp.net","") + "\r\n"

            hBAOS += "--" + boundary + "\r\n"
            hBAOS += "Content-Disposition: form-data; name=\"file\"; filename=\"" + crypto + "\"\r\n"
            hBAOS  += "Content-Type: " + filetype + "\r\n\r\n"

            fBAOS = "\r\n--" + boundary + "--\r\n"

            contentLength += len(hBAOS)
            contentLength += len(fBAOS)
            contentLength += filesize

            POST = "POST %s\r\n" % uploadUrl
            POST += "Content-Type: multipart/form-data; boundary=" + boundary + "\r\n"
            POST += "Host: %s\r\n" % self.url
            POST += "User-Agent: %s\r\n" % self.getUserAgent()
            POST += "Content-Length: " + str(contentLength) + "\r\n\r\n"

            ssl_sock.write(bytearray(POST.encode()))
            ssl_sock.write(bytearray(hBAOS.encode()))

            totalsent = 0
            buf = 1024
            f = open(sourcePath, 'rb')
            stream = f.read()
            f.close()
            status = 0
            lastEmit = 0

            while totalsent < int(filesize):
                ssl_sock.write(stream[:buf])
                status = totalsent * 100 / filesize
                if lastEmit!=status and status!=100 and filesize>12288:
                    if self.progressCallback:
                        self.progressCallback(self.sourcePath, self.jids, uploadUrl, int(status))
                lastEmit = status
                stream = stream[buf:]
                totalsent = totalsent + buf

            ssl_sock.write(bytearray(fBAOS.encode()))

            sleep(1)
            data = ssl_sock.recv(8192)
            data += ssl_sock.recv(8192)
            data += ssl_sock.recv(8192)
            data += ssl_sock.recv(8192)
            data += ssl_sock.recv(8192)
            data += ssl_sock.recv(8192)
            data += ssl_sock.recv(8192)

            if self.progressCallback:
                self.progressCallback(self.sourcePath, self.jids, uploadUrl, 100)


            lines = data.decode().splitlines()


            result = None

            for l in lines:
                if l.startswith("{"):
                    result = self.parser.parse(l, self.pvars)
                    break

            if not result:
                raise Exception("json data not found")


            if result["url"] is not None:
                if self.successCallback:
                    self.successCallback(sourcePath, self.jids, result["url"])
            else:
                logger.exception("uploadUrl: %s, result of uploading media has no url" % uploadUrl)
                if self.errorCallback:
                    self.errorCallback(sourcePath, self.jids, uploadUrl)

        except:
            logger.exception("Error occured at transfer %s"%sys.exc_info()[1])
            if self.errorCallback:
                self.errorCallback(sourcePath, self.jids, uploadUrl)
Exemple #13
0
    def get_extension(self):
        # try well known extensions
        if self.mime_type in wa_mimes:
            return wa_mimes[self.mime_type]

        return MimeTools.getExtension(self.mime_type)