def generateAuthorizationHeader(url=None, data=None):
    signature = ""
    if data:
        encodedata = urlencode(data)
        xxxx = SECRET_KEY + encodedata
        md = hashlib.md5(xxxx.encode())
        signature = md.hexdigest()
    elif url:
        urlencode(url)
        xx = SECRET_KEY + url
        signature = hashlib.md5(xx.encode()).hexdigest()
    return {SIGNATURE_HEADER: signature}
 def editFolder(self, folder_id, name):
     url = self.serverURL + "/clapi/file/editFolder/"
     data = {"folder_id": folder_id, "name": name}
     self.browser.add_header(extraHeader=generateAuthorizationHeader(data=data))
     r = self.browser.open(url, urlencode(data))
     html = r.content
     return html
    def createUploadSession(self, file_hash, file_size, file_name, erfk, folder_id=None):
        url = self.serverURL + "/clapi/session/createUploadSession/"
        data = {
            "file_hash": file_hash,
            "file_size": file_size,
            "file_name": file_name,
            "erfk": reverseString(base64.b64encode(erfk)),
            # todo: remember to change this to send reverse base64 to server
        }

        if folder_id:
            data["folder_id"] = folder_id
        self.browser.add_header(extraHeader=generateAuthorizationHeader(data=data))
        for ti in range(3):
            try:
                r = self.browser.open(url, urlencode(data))
                html = r.content
            except Exception as e:
                print("retry upload ti=%s due to error=%s" % (ti + 1, e))
                time.sleep(0.5)
            else:  # OK
                break

        result = json.loads(html.decode("utf-8"))
        # print result
        upload_session_id = result["session_id"]
        print("Upload sesison id=%s" % (upload_session_id))

        return result
    def deleteFolder(self, *folderIDList):
        url = self.serverURL + "/clapi/file/deleteFolder/"
        data = [("folder_id", folder_id) for folder_id in folderIDList]

        self.browser.add_header(extraHeader=generateAuthorizationHeader(data=data))
        r = self.browser.open(url, urlencode(data))
        html = r.content
        return
 def newFolder(self, folder_name, folder_id):
     url = self.serverURL + "/clapi/file/newFolder/"
     data = {"folder_name": folder_name}
     if folder_id:  # folder_id==None mean root folder
         data["folder_id"] = folder_id
     self.browser.add_header(extraHeader=generateAuthorizationHeader(data=data))
     r = self.browser.open(url, urlencode(data))
     html = r.content
     return json.loads(html.decode("utf-8"))["folder_id"]
 def moveFile(self, *fileIDList, **kwargs):
     url = self.serverURL + "/clapi/file/moveFile/"
     folder_id = kwargs["folder_id"]
     if folder_id is None:
         folder_id = 0
     data = [("file_id", file_id) for file_id in fileIDList] + [("folder_id", folder_id)]
     self.browser.add_header(extraHeader=generateAuthorizationHeader(data=data))
     r = self.browser.open(url, urlencode(data))
     html = r.content
 def deleteFile(self, *fileIDList):
     url = self.serverURL + "/clapi/file/deleteFile/"
     data = [("file_id", file_id) for file_id in fileIDList]
     self.browser.add_header(extraHeader=generateAuthorizationHeader(data=data))
     r = self.browser.open(url, urlencode(data))
     html = r.content
     if "success" in html.decode("utf-8"):
         return True
     else:
         return
    def upload_chunk(
        self,
        upload_url,
        key,
        len_data,
        getData,
        postData,
        resumableChunkNumber,
        resumableChunkSize,
        resumableFilename,
        files,
    ):
        uploaded_chunk = True
        i = 0
        while i < 5:
            try:
                response = requests.get(upload_url + "?" + urlencode(getData), timeout=30)
                html = response.content
            except Exception as e:
                print(e)
                time.sleep(1)
            else:
                if response.status_code != 200:
                    print(response.content())
                    time.sleep(1)
                    i += 1
                    continue
                break
            i += 1
        if i >= 5:
            uploaded_chunk = False

        if (
            html.find("chunk uploaded") == -1
            and html.find("chunks already exists") == -1
            and html.find("file_id=") == -1
        ):
            print("upload chunk")
            i = 0
            while i < 5:
                try:
                    response = requests.post(upload_url, data=postData, files=files)
                    # response = requests.post(upload_url, data=mem, headers={'Content-Type': mem.content_type})
                    html = response.content
                except Exception as e:
                    print(e)
                    time.sleep(1)
                else:
                    # print response.status_code
                    if response.status_code != 200:
                        print("upload_3 failed with response=%s" % (response.content))
                        # c = open('error3.html','w')
                        # c.write(response.text)
                        # c.close()
                        time.sleep(1)
                        i += 1
                        continue
                    else:
                        break
                i += 1
            if i >= 5:
                uploaded_chunk = False

        print("upload response=%s" % (html))
        if uploaded_chunk:
            self.processQueue.put({"uploaded": len_data})
        else:
            self.processQueue.put(
                {
                    "upload_error": (
                        upload_url,
                        key,
                        len_data,
                        getData,
                        postData,
                        resumableChunkNumber,
                        resumableChunkSize,
                        resumableFilename,
                        files,
                    )
                }
            )
        self.processQueue.put("upload ready")
        return
 def deleteUserFile(self, userFile_id):
     url = self.serverURL + "/clapi/file/deleteFile/"
     data = {"file_id": userFile_id}
     self.browser.add_header(extraHeader=generateAuthorizationHeader(data=data))
     r = self.browser.open(url, urlencode(data))
     html = r.content
    def encryptResumableUpload(
        self,
        upload_url,
        filePath,
        resumableIdentifier,
        file_size,
        key="000102030405060708090a0b0c0d0e0f",
        progressFunction=None,
    ):

        self.uploadQueque = Queue()
        self.processQueue = Queue()
        self.thread_upload_chunk = []
        resumableTotalSize = os.path.getsize(filePath)
        # resumableChunkSize = 512 * 1024  # 1MB
        if resumableTotalSize < 50 * 1024 * 1024:
            resumableChunkSize = 1 * 1024 * 1024  # 1MB
        else:
            resumableChunkSize = 10 * 1024 * 1024  # 10MB

        resumableTotalChunks = file_size / resumableChunkSize
        if resumableTotalChunks == 0:
            resumableTotalChunks = 1

        resumableFilename = os.path.split(filePath)[1].encode("utf-8")
        resumableRelativePath = filePath.encode("utf-8")

        key = "".join([chr(int(key[i : i + 2], 16)) for i in range(0, len(key), 2)])
        # print 'filekey:'+str(key)
        f = open(filePath, "rb")
        result = None
        resumableChunkNumber = 1

        self.uploadedSize = 0
        # last_data = 0
        start_time = time.time()
        last_data = False
        self.stop = False

        while self.uploadedSize < resumableTotalSize:
            if self.stop:
                result = None
                break
            if (
                resumableChunkNumber < resumableTotalChunks
            ):  # if uploadedSize <= resumableTotalSize - 2 * resumableChunkSize:
                data = f.read(resumableChunkSize)
            else:
                print("last data")
                print(resumableIdentifier)
                print(resumableTotalChunks)
                print(resumableChunkNumber)
                print(resumableFilename)
                data = f.read()
                print(len(data))
                last_data = True
                # print last_data
            print("len:" + str(len(data)))
            if len(data) == 0:
                result = None
                break
            postData = {
                "resumableChunkNumber": str(resumableChunkNumber),
                "resumableChunkSize": str(resumableChunkSize),
                "resumableTotalSize": str(resumableTotalSize),
                "resumableTotalChunks": str(resumableTotalChunks),
                "resumableFilename": str(resumableFilename),
                "resumableIdentifier": str(resumableIdentifier),
                "resumableRelativePath": str(resumableRelativePath),
                "resumableCurrentChunkSize": str(len(data)),
                "resumableType": "",
            }

            getData = {
                "resumableChunkNumber": resumableChunkNumber,
                "resumableChunkSize": resumableChunkSize,
                "resumableTotalSize": resumableTotalSize,
                "resumableCurrentChunkSize": str(len(data)),
                "resumableType": "",
                "resumableTotalChunks": resumableTotalChunks,
                "resumableIdentifier": resumableIdentifier,
                "resumableFilename": resumableFilename,
                "resumableRelativePath": resumableRelativePath,
            }
            if not last_data:
                # print 'upload Chunk'
                if resumableTotalChunks < 5:
                    totalopenThead = resumableTotalChunks
                else:
                    totalopenThead = 5
                if totalopenThead == 1:
                    totalopenThead = 0
                while len(self.thread_upload_chunk) < totalopenThead:
                    print("Creat Upload Chunk Thread")
                    th = Upload_chunk(self.uploadQueque, self.processQueue)
                    th.start()
                    self.thread_upload_chunk.append(th)
                while len(self.thread_upload_chunk):
                    try:
                        uploaded_data = self.processQueue.get_nowait()
                    except:
                        pass
                    else:
                        if uploaded_data == "upload ready":
                            counter_value = (resumableChunkNumber - 1) * resumableChunkSize / 16
                            ctr = Counter.new(128, initial_value=1 + counter_value)
                            # print ctr
                            cipher = AES.new(key, AES.MODE_CTR, counter=ctr)
                            # encode_data = cipher.encrypt(data)
                            # print len(data)
                            files = {
                                "file": (
                                    resumableFilename.decode("utf-8").encode("ascii", "ignore"),
                                    cipher.encrypt(data),
                                )
                            }
                            # postData.update({
                            #     'file': (resumableFilename.decode("utf-8").encode('ascii', 'ignore'), cipher.encrypt(data))
                            # })
                            self.uploadQueque.put(
                                (
                                    upload_url,
                                    key,
                                    len(data),
                                    getData,
                                    postData,
                                    resumableChunkNumber,
                                    resumableChunkSize,
                                    resumableFilename,
                                    files,
                                )
                            )
                            # del postData
                            # del encode_data
                            # del data
                            resumableChunkNumber += 1
                            break
                        elif uploaded_data.has_key("callback"):
                            self.uploadedSize += uploaded_data["callback"]
                            uploaded_time = time.time() - start_time
                            upload_speed = self.uploadedSize / uploaded_time
                            progressFunction(0, 0, resumableChunkSize, self.uploadedSize, speed=int(upload_speed))
                        elif uploaded_data.has_key("uploaded"):
                            self.uploadedSize += uploaded_data["uploaded"]
                            uploaded_time = time.time() - start_time
                            upload_speed = self.uploadedSize / uploaded_time
                            progressFunction(0, 0, resumableChunkSize, self.uploadedSize, speed=int(upload_speed))
                        elif uploaded_data.has_key("upload_error"):
                            data_error = uploaded_data["upload_error"]
                            upload_url, key, len_data, getData, postData, resumableChunkNumber, resumableChunkSize, resumableFilename = (
                                data_error
                            )
                            # reset uploaded data
                            self.uploadedSize -= len_data
                            #
                            self.uploadQueque.put(
                                (
                                    upload_url,
                                    key,
                                    len_data,
                                    getData,
                                    postData,
                                    resumableChunkNumber,
                                    resumableChunkSize,
                                    resumableFilename,
                                )
                            )

                        else:
                            result = None
                            break

            else:
                stopped_th = 0
                while len(self.thread_upload_chunk):
                    if len(self.thread_upload_chunk) == stopped_th:
                        break
                    try:
                        uploaded_data = self.processQueue.get_nowait()
                    except:
                        pass
                    else:
                        if uploaded_data == "upload ready":
                            self.uploadQueque.put("stop")
                        elif uploaded_data == "stopped":
                            stopped_th += 1
                            if len(self.thread_upload_chunk) == stopped_th:
                                break
                        elif uploaded_data.has_key("callback"):
                            self.uploadedSize += uploaded_data["callback"]
                            uploaded_time = time.time() - start_time
                            upload_speed = self.uploadedSize / uploaded_time
                            progressFunction(0, 0, resumableChunkSize, self.uploadedSize, speed=int(upload_speed))
                        elif uploaded_data.has_key("uploaded"):
                            self.uploadedSize += uploaded_data["uploaded"]
                            uploaded_time = time.time() - start_time
                            upload_speed = self.uploadedSize / uploaded_time
                            progressFunction(0, 0, resumableChunkSize, self.uploadedSize, speed=int(upload_speed))
                        elif uploaded_data.has_key("upload_error"):
                            data_error = uploaded_data["upload_error"]
                            upload_url, key, len_data, getData, postData, resumableChunkNumber, resumableChunkSize, resumableFilename = (
                                data_error
                            )
                            # reset uploaded data
                            self.uploadedSize -= len_data
                            self.uploadQueque.put(
                                (
                                    upload_url,
                                    key,
                                    len_data,
                                    getData,
                                    postData,
                                    resumableChunkNumber,
                                    resumableChunkSize,
                                    resumableFilename,
                                )
                            )

                if self.stop:
                    break
                print("Check file")
                i = 0
                while i < 5:
                    try:
                        response = requests.get(upload_url + "?" + urlencode(getData), timeout=30)
                        html = response.content
                    except Exception as e:
                        print(e)
                        time.sleep(1)
                    else:
                        if response.status_code != 200:
                            print(response.content)
                            time.sleep(1)
                            i += 1
                            continue
                        break
                    i += 1
                if i >= 5:
                    result = None
                    break

                # print response.content

                if (
                    html.find("chunk uploaded") == -1
                    and html.find("chunks already exists") == -1
                    and html.find("file_id=") == -1
                ):
                    print("uploading chunk")

                    i = 0
                    while i < 5:
                        try:
                            response = requests.post(upload_url, data=postData, files=files)
                            html = response.content
                        except Exception as e:
                            print(e)
                            time.sleep(1)
                        else:
                            if response.status_code != 200:
                                print("upload_3 failed with response=%s" % response.content)
                                # c = open('error3.html','w')
                                # c.write(response.text)
                                # c.close()
                                time.sleep(1)
                                i += 1
                                continue
                            else:
                                break
                        i += 1
                    if i >= 5:
                        result = None
                        break
                    print("upload done")
                    resumableChunkNumber += 1
                # else:
                self.uploadedSize += len(data)
                print("upload response=%s" % (html))

                # print '===='
                # print self.uploadedSize
                # print resumableTotalSize
                if self.uploadedSize >= resumableTotalSize or resumableChunkNumber >= resumableTotalChunks + 1:
                    print(html)
                    if self.uploadedSize > resumableTotalSize:
                        print("error")
                        print(self.uploadedSize, resumableTotalSize)
                    result = response.text.split("=")[1]
                    break
                    # time.sleep(0.5)
        f.close()
        return result