Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
  • Loading branch information
pozitronik committed Apr 5, 2020
2 parents 97a7602 + b6b5c2c commit 32f282c
Show file tree
Hide file tree
Showing 6 changed files with 40 additions and 22 deletions.
29 changes: 19 additions & 10 deletions CMLHTTP.pas
Original file line number Diff line number Diff line change
Expand Up @@ -311,13 +311,13 @@ function TCloudMailRuHTTP.OptionsMethod(URL: WideString; var Answer: WideString;
try
HTTP.Intercept := Throttle;
HTTP.OnWork := self.Progress;

HTTP.Options(URL, ResultStream);
Answer := ResultStream.DataString;
except
On E: Exception do
begin
result := false; //todo: add self.ExceptionHandler()
self.ExceptionHandler(E, URL, HTTP_METHOD_OPTIONS);
result := false;
end;
end;

Expand Down Expand Up @@ -357,7 +357,7 @@ function TCloudMailRuHTTP.Put(URL: WideString; var PostData: TStream; ResultData
except
On E: Exception do
begin
result := self.ExceptionHandler(E, URL);
result := self.ExceptionHandler(E, URL, HTTP_METHOD_PUT);
end;
end;
end;
Expand Down Expand Up @@ -403,13 +403,22 @@ function TCloudMailRuHTTP.ExceptionHandler(E: Exception; URL: WideString; HTTPMe
var
method_string: WideString; //â çàâèñèìîñòè îò ìåòîäà èñõîäíîãî çàïðîñà ìåíÿåòñÿ òåêñò ñîîáùåíèÿ
begin
if HTTPMethod = HTTP_METHOD_GET then
begin
method_string := 'ïîëó÷åíèè äàííûõ ñ àäðåñà ';
result := FS_FILE_READERROR; //äëÿ GetFile, GetForm íå èíòåðåñóåò êîä îøèáêè
end else begin
method_string := 'îòïðàâêå äàííûõ íà àäðåñ ';
result := CLOUD_OPERATION_FAILED; //Äëÿ âñåõ Post-çàïðîñîâ
case HTTPMethod of
HTTP_METHOD_GET:
begin
method_string := 'ïîëó÷åíèè äàííûõ ñ àäðåñà ';
result := FS_FILE_READERROR; //äëÿ GetFile, GetForm íå èíòåðåñóåò êîä îøèáêè
end;
HTTP_METHOD_POST, HTTP_METHOD_PUT:
begin
method_string := 'îòïðàâêå äàííûõ íà àäðåñ ';
result := CLOUD_OPERATION_FAILED; //Äëÿ âñåõ Post-çàïðîñîâ
end;
HTTP_METHOD_OPTIONS:
begin
method_string := 'çàïðîñòå ïàðàìåòðîâ ';
result := CLOUD_OPERATION_FAILED; //Äëÿ âñåõ Post-çàïðîñîâ
end;
end;

if E is EAbort then
Expand Down
4 changes: 3 additions & 1 deletion CMLTypes.pas
Original file line number Diff line number Diff line change
Expand Up @@ -101,8 +101,10 @@ interface
{Методы HTTP}
HTTP_METHOD_GET = 0;
HTTP_METHOD_POST = 1;
HTTP_METHOD_PUT = 2;
HTTP_METHOD_OPTIONS = 3;

HTTP_METHODS = [HTTP_METHOD_GET, HTTP_METHOD_POST];
HTTP_METHODS = [HTTP_METHOD_GET, HTTP_METHOD_POST, HTTP_METHOD_PUT, HTTP_METHOD_OPTIONS];

{Типы шардов}
SHARD_TYPE_DEFAULT = ''; //несистемный шард, в нашей логике означает использование того шарда, что получен при инициализации
Expand Down
27 changes: 17 additions & 10 deletions CloudMailRu.pas
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,8 @@ TCloudMailRu = class
//JSONParser: TCloudMailRuJSONParser; //JSON parser

public_link: WideString; //public_ params is active for public clouds only
public_download_token: WideString; //token for public urls, refreshes on request
(*seems to be not used since 25.03.2020 - shared downloads do not require token anymore*)
//public_download_token: WideString; //token for public urls, refreshes on request
public_shard: WideString; //public downloads shard url
Shard: WideString; //download shard url

Expand Down Expand Up @@ -440,6 +441,9 @@ function TCloudMailRu.getSharedLinksListing(var DirListing: TCloudMailRuDirListi
result := self.HTTP.GetPage(API_FOLDER_SHARED_LINKS + '?' + self.united_params, JSON, ShowProgress);
if result then
result := CloudResultToBoolean(CMLJSONParser.getOperationResult(JSON), 'Shared links listing error: ');

if result then
result := CMLJSONParser.getDirListing(JSON, DirListing);
end;

function TCloudMailRu.getIncomingLinksListing(var IncomingListing: TCloudMailRuIncomingInviteInfoListing; ShowProgress: Boolean): Boolean;
Expand All @@ -455,6 +459,9 @@ function TCloudMailRu.getIncomingLinksListing(var IncomingListing: TCloudMailRuI
if (ShowProgress) then
self.HTTP.SetProgressNames('Incoming links listing', '...');
result := self.HTTP.GetPage(API_FOLDER_SHARED_INCOMING + '?' + self.united_params, JSON, ShowProgress) and CloudResultToBoolean(CMLJSONParser.getOperationResult(JSON), 'Incoming requests listing error: ');

if result then
result := CMLJSONParser.getIncomingInviteListing(JSON, IncomingListing);
end;

function TCloudMailRu.getIncomingLinksListing(var IncomingListing: TCloudMailRuDirListing; var InvitesListing: TCloudMailRuIncomingInviteInfoListing; ShowProgress: Boolean = false): Boolean;
Expand Down Expand Up @@ -622,15 +629,15 @@ function TCloudMailRu.getSharedFileUrl(remotePath: WideString; DoUrlEncode: Bool
else
self.getShard(usedShard, ShardType);

result := IncludeSlash(usedShard) + IncludeSlash(self.public_link) + PathToUrl(remotePath, true, DoUrlEncode) + '?key=' + self.public_download_token
result := IncludeSlash(usedShard) + IncludeSlash(self.public_link) + PathToUrl(remotePath, true, DoUrlEncode);
end;

function TCloudMailRu.getFileShared(remotePath, localPath: WideString; var resultHash: WideString; LogErrors: Boolean): integer;
var
FileStream: TBufferedFileStream;
begin
result := FS_FILE_NOTFOUND;
if (self.public_shard = EmptyWideStr) or (self.public_download_token = EmptyWideStr) then
if (self.public_shard = EmptyWideStr) then
exit;
try
FileStream := TBufferedFileStream.Create(GetUNCFilePath(localPath), fmCreate);
Expand Down Expand Up @@ -750,7 +757,6 @@ function TCloudMailRu.getToken: Boolean;
result := extractTokenFromText(JSON, token) and extract_x_page_id_FromText(JSON, x_page_id) and extract_build_FromText(JSON, build); //and extract_upload_url_FromText(JSON, self.upload_url);
self.united_params := '&api=2&build=' + build + '&x-page-id=' + x_page_id + '&email=' + self.user + '%40' + self.domain + '&x-email=' + self.user + '%40' + self.domain + '&token=' + token + '&_=' + DateTimeToUnix(now).ToString + '810';
Log(LogLevelDetail, MSGTYPE_DETAILS, 'Current upload shard is undefined, trying to get one');
result := result and self.getShard(self.upload_url, SHARD_TYPE_UPLOAD); //todo временное решение
end;
end;

Expand All @@ -766,11 +772,6 @@ function TCloudMailRu.getSharedToken(): Boolean;
result := self.HTTP.GetPage(self.OptionsSet.AccountSettings.public_url, PageContent, Progress);
if result then
begin
if not extractPublicTokenFromText(PageContent, self.public_download_token) then //refresh public download token
begin
Log(LogLevelError, MSGTYPE_IMPORTANTERROR, 'Can''t get public share download token');
exit(false);
end;
if not extractPublicShard(PageContent, self.public_shard) then
begin
Log(LogLevelError, MSGTYPE_IMPORTANTERROR, 'Can''t get public share download share');
Expand Down Expand Up @@ -1365,9 +1366,15 @@ function TCloudMailRu.putFileToCloud(FileName: WideString; FileStream: TStream;
exit; //Проверка на вызов без инициализации
if self.public_account then
exit;
if (EmptyWideStr = self.upload_url) then
begin
Log(LogLevelDetail, MSGTYPE_DETAILS, 'Current upload shard is undefined, trying to get one');
self.getShard(self.upload_url, SHARD_TYPE_UPLOAD);
end;

UploadUrl := self.upload_url + '?cloud_domain=2&x-email=' + self.user + '%40' + self.domain(*+ '&fileapi' + DateTimeToUnix(now).ToString + '0246'*);
Return := TStringList.Create;
self.HTTP.OptionsMethod(UploadUrl, PostAnswer, ProgressEnabled);
//self.HTTP.OptionsMethod(UploadUrl, PostAnswer, ProgressEnabled); //not required at current moment, see issue #232
result := self.HTTP.putFile(UploadUrl, FileName, FileStream, PostAnswer);

if (result = CLOUD_OPERATION_OK) then
Expand Down
Binary file modified MailRuCloud.wfx
Binary file not shown.
Binary file modified MailRuCloud.wfx64
Binary file not shown.
2 changes: 1 addition & 1 deletion README.MD
Original file line number Diff line number Diff line change
Expand Up @@ -295,7 +295,7 @@ TCx64 поддерживается полностью.

# Регистрация нового аккаунта
Плагин позволяет регистрировать учётную запись к сервисам mail.ru. Диалог создания новой учётной записи вызывается нажатием кнопки **Register new** в окне управления аккаунтами, либо при попытке создания нового каталога в списке аккаунтов (сначала будет вызван стандартный диалог создания каталога, указанное в нём имя будет передано в диалог создания новой учётной записи).<br/>
Для регистрации новой учётной записи требуется заполнить все активные поля диалога (это минимальный набор полей, требуемый при регистрации) и нажать кнопку **Sign up**. Если введённые данные будут приняты сервером, диалог отобразит графическую капчу, решение которй нужно ввести в соответствующее поле, и подтвердить регистрацию нажатием кнопки **Confirm**.<br />
Для регистрации новой учётной записи требуется заполнить все активные поля диалога (это минимальный набор полей, требуемый при регистрации) и нажать кнопку **Sign up**. Если введённые данные будут приняты сервером, диалог отобразит графическую капчу, решение которой нужно ввести в соответствующее поле, и подтвердить регистрацию нажатием кнопки **Confirm**.<br />
В случае успеха зарегистрированный аккаунт появится в настройках/списке аккаунтов, и будет доступен для работы.<br />
В случае ошибки на любом этапе (проверка регистрационных данных, проверка капчи, иное взаимодействие с сервисом регистрации) *сырой* текст ошибки будет выведен в диалоге as is.

Expand Down

0 comments on commit 32f282c

Please sign in to comment.