Skip to content

Commit

Permalink
Fixed cloud.mail.ru, fixed crash in ScriptUploadEngine
Browse files Browse the repository at this point in the history
  • Loading branch information
zenden2k committed May 6, 2024
1 parent d05a509 commit 23b1313
Show file tree
Hide file tree
Showing 2 changed files with 75 additions and 103 deletions.
174 changes: 71 additions & 103 deletions Data/Scripts/cloud.mail.ru.nut
@@ -1,32 +1,10 @@
const CURLOPT_POSTFIELDSIZE = 60;

if(ServerParams.getParam("folder") == "") {
ServerParams.setParam("folder", "Screenshots") ;
}

function BeginLogin() {
try {
return Sync.beginAuth();
}
catch ( ex ) {
}
return true;
}

function EndLogin() {
try {
return Sync.endAuth();
} catch ( ex ) {

}
return true;
}

function getAuthorizationString() {
local token = ServerParams.getParam("token");
local tokenType = ServerParams.getParam("tokenType");
return tokenType + " " + token ;
}

function checkResponse() {
function _CheckResponse() {
if ( nm.responseCode() == 403 ) {
if ( nm.responseBody().find("Invalid token",0)!= null) {
WriteLog("warning", nm.responseBody());
Expand All @@ -36,7 +14,7 @@ function checkResponse() {
ServerParams.setParam("tokenType", "");
ServerParams.setParam("prevLogin", "");
ServerParams.setParam("tokenTime", "");
return 1 + DoLogin();
return 0;
} else {
WriteLog("error", "403 Access denied" );
return 0;
Expand All @@ -48,7 +26,7 @@ function checkResponse() {
return 1;
}

function CloudMailRu_GetServerAddress(character) {
function _GetServerAddress(character) {
nm.doGet("https://dispatcher.cloud.mail.ru/" + character);
if (nm.responseCode() == 200) {
local reg = CRegExp("(https://.+?) ", "");
Expand All @@ -59,8 +37,9 @@ function CloudMailRu_GetServerAddress(character) {
return null;
}

function _DoLogin()
{
function Authenticate() {
local token = ServerParams.getParam("token");
local tokenType = ServerParams.getParam("tokenType");
local login = ServerParams.getParam("Login");
local password = ServerParams.getParam("Password");
local scope = "offline_access files.readwrite";
Expand All @@ -69,7 +48,48 @@ function _DoLogin()
WriteLog("error", "E-mail should not be empty!");
return 0;
}

nm.setUserAgent("CloudScreenshoterWindows 17.04.1017 beta 5cfe3ab6");
local oServer = _GetServerAddress("o");

nm.addQueryParam("client_id", "cloud-win");
nm.addQueryParam("grant_type", "password");
nm.addQueryParam("username", login);
nm.addQueryParam("password", password);
nm.setUrl(oServer);
nm.doPost("");

if (nm.responseCode() == 200) {
local t = ParseJSON(nm.responseBody());
local accessToken = "";
if ("access_token" in t) {
accessToken = t.access_token;
}

if ( accessToken != "" ) {
token = accessToken;
local timestamp = time();
ServerParams.setParam("token", token);
ServerParams.setParam("expiresIn", t.expires_in);
ServerParams.setParam("refreshToken", t.refresh_token);
ServerParams.setParam("prevLogin", login);
ServerParams.setParam("tokenTime", timestamp.tostring());
return 1;
} else {
local errorStr = "";
if ("error" in t) {
errorStr = t.error;
}
WriteLog("error", "cloud.mail.ru: Authentication failed. " + errorStr);
}
} else {
WriteLog("error", "cloud.mail.ru: unable to obtain token (login failed)");
}

return 0;
}

function RefreshToken() {
local token = ServerParams.getParam("token");
local tokenType = ServerParams.getParam("tokenType");
if ( token != "" && tokenType != "" ) {
Expand All @@ -88,14 +108,14 @@ function _DoLogin()
}
refreshToken = ServerParams.getParam("refreshToken");
if ( time() > tokenTime + expiresIn && refreshToken != "") {
local oServer = CloudMailRu_GetServerAddress("o");
local oServer = _GetServerAddress("o");
// Refresh access token
nm.setUrl(oServer);
nm.addQueryParam("refresh_token", refreshToken);
nm.addQueryParam("client_id", "cloud-win");
nm.addQueryParam("grant_type", "refresh_token");
nm.doPost("");
if ( checkResponse() ) {
if ( _CheckResponse() ) {
local data = nm.responseBody();
local t = ParseJSON(data);
if ("access_token" in t) {
Expand All @@ -121,66 +141,14 @@ function _DoLogin()
return 1;
}
}

nm.setUserAgent("CloudScreenshoterWindows 17.04.1017 beta 5cfe3ab6");
local oServer = CloudMailRu_GetServerAddress("o");

nm.addQueryParam("client_id", "cloud-win");
nm.addQueryParam("grant_type", "password");
nm.addQueryParam("username", login);
nm.addQueryParam("password", password);
nm.setUrl(oServer);
nm.doPost("");

if (nm.responseCode() == 200) {
local t = ParseJSON(nm.responseBody());
local accessToken = "";
if ("access_token" in t) {
accessToken = t.access_token;
}

if ( accessToken != "" ) {
token = accessToken;
local timestamp = time();
ServerParams.setParam("token", token);
ServerParams.setParam("expiresIn", t.expires_in);
ServerParams.setParam("refreshToken", t.refresh_token);
ServerParams.setParam("prevLogin", login);
ServerParams.setParam("tokenTime", timestamp.tostring());
return 1;
} else {
local errorStr = "";
if ("error" in t) {
errorStr = t.error;
}
WriteLog("error", "cloud.mail.ru: Authentication failed. " + errorStr);
}
} else {
WriteLog("error", "cloud.mail.ru: unable to obtain token (login failed)");
}


return 0;
}

function DoLogin() {
if (!BeginLogin() ) {
return false;
}
local res = _DoLogin();

EndLogin();
return res;
return 1;
}

function GetFolderList(list) {
if(!DoLogin()) {
return 0;
}
return 0;
}

function CloudMailRu_PackNumber(number) {
function _PackNumber(number) {
local vec = "";
while (number >= 0x80) {
local b = number | 0x80;
Expand All @@ -191,7 +159,7 @@ function CloudMailRu_PackNumber(number) {
return vec;
}

function CloudMailRu_HexToBytes(hex) {
function _HexToBytes(hex) {
local res = "";
local lookup = ['0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'];
for (local i = 0; i < hex.len(); i += 2) {
Expand All @@ -202,35 +170,35 @@ function CloudMailRu_HexToBytes(hex) {
return res;
}

function CloudMailRu_SendMetaRequest(nc, url, remoteFileName, hashUpper, size, create) {
function _SendMetaRequest(nc, url, remoteFileName, hashUpper, size, create) {
nc.setUrl(url);
local vec = "";
vec += "\x67\x0";
vec += format("%c", remoteFileName.len() + 1);
vec += remoteFileName;
vec += "\x0";
vec += CloudMailRu_PackNumber(size);
vec += CloudMailRu_PackNumber(time());
vec += _PackNumber(size);
vec += _PackNumber(time());
vec += "\x0";
vec += CloudMailRu_HexToBytes(hashUpper);
vec += _HexToBytes(hashUpper);
vec += create? "\x1": "\x0";
nm.setMethod("POST");
nm.setCurlOptionInt(CURLOPT_POSTFIELDSIZE, vec.len());
return nc.doUpload("", vec);
}

function CloudMailRu_CreateFolder(nc, url, folderName) {
function _CreateFolder(nc, url, folderName) {
nc.setUrl(url);
local vec = "\x6a\x0";
vec += format("%c", folderName.len() + 1);
vec += folderName;
vec += "\x0\x0";
nm.setMethod("POST");
nm.setCurlOptionInt(CURLOPT_POSTFIELDSIZE, vec.len());
return nc.doUpload("", vec);
}

function UploadFile(FileName, options) {
if(!DoLogin()) {
return -1;
}

function UploadFile(FileName, options) {
local remoteFolderName = ServerParams.getParam("folder");
if (remoteFolderName == "") {
remoteFolderName = "Screenshots";
Expand All @@ -242,25 +210,25 @@ function UploadFile(FileName, options) {
local token = ServerParams.getParam("token");
local fileSize = GetFileSize(FileName);

local uServer = CloudMailRu_GetServerAddress("u");
local uServer = _GetServerAddress("u");
local fileHash = sha1_file_prefix(FileName, "mrCloud", fileSize.tostring()).toupper();
//WriteLog("error", fileHash);

local metaServer = CloudMailRu_GetServerAddress("m");
local metaServer = _GetServerAddress("m");

local res = CloudMailRu_CreateFolder(nm, metaServer + "?client_id=cloud-win&token=" + token, "/" + remoteFolderName );
local res = _CreateFolder(nm, metaServer + "?client_id=cloud-win&token=" + token, "/" + remoteFolderName );
if (!res || nm.responseCode() != 200) {
WriteLog("error", "Unable to create folder '" + remoteFolderName + "' on remote server.");
return 0;
}

// Creating stub image
res = CloudMailRu_SendMetaRequest(nm, metaServer + "?client_id=cloud-win&token=" + token, remoteFolder + remoteFileName, "01068324637F894C3AADC0FCDFA33B6A40CB4AD6", 23696, true);
res = _SendMetaRequest(nm, metaServer + "?client_id=cloud-win&token=" + token, remoteFolder + remoteFileName, "01068324637F894C3AADC0FCDFA33B6A40CB4AD6", 23696, true);
if (!res || nm.responseCode() != 200) {
WriteLog("error", "Unable to create stub file on remote server");
return 0;
}
local webLinkServer = CloudMailRu_GetServerAddress("w");
local webLinkServer = _GetServerAddress("w");
nm.setUrl(webLinkServer + "create?client_id=cloud-win&token="+ token);
nm.addQueryParam("file", remoteFileName);
nm.addQueryParam("folder", "/" + remoteFolder);
Expand Down Expand Up @@ -297,7 +265,7 @@ function UploadFile(FileName, options) {
}

//nm.setUrl(metaServer + "?client_id=cloud-win&token=" + token);
res = CloudMailRu_SendMetaRequest(nm, metaServer + "?client_id=cloud-win&token=" + token, remoteFolder + remoteFileName, fileHash, fileSize, false);
res = _SendMetaRequest(nm, metaServer + "?client_id=cloud-win&token=" + token, remoteFolder + remoteFileName, fileHash, fileSize, false);
if (res && nm.responseCode() == 200 && shortLink != "") {
options.setViewUrl("https://s.mail.ru/" + shortLink);
return 1;
Expand All @@ -311,7 +279,7 @@ function UploadFile(FileName, options) {
if (reg.match(nm.responseBody())) {
WriteLog("info", "You are lucky! Hash found on server!");
// Hash found on server
CloudMailRu_SendMetaRequest(nm, metaServer + "?client_id=cloud-win&token=" + token, remoteFolder + remoteFileName, fileHash, fileSize, false);
_SendMetaRequest(nm, metaServer + "?client_id=cloud-win&token=" + token, remoteFolder + remoteFileName, fileHash, fileSize, false);
if (nm.responseCode() == 200 && shortLink != "") {
options.setViewUrl("https://s.mail.ru/" + shortLink);
return 1;
Expand Down
4 changes: 4 additions & 0 deletions Source/Core/Upload/ScriptUploadEngine.cpp
Expand Up @@ -37,6 +37,10 @@ std::pair<int, Sqrat::Table> GetOperationResult(Sqrat::SharedPtr<Sqrat::Object>
int res = 0;

Sqrat::Table t;
if (!obj) {
LOG(WARNING) << "Invalid result type";
return { 0, t };
}

if (obj->GetType() == OT_INTEGER) {
res = obj->Cast<int>();
Expand Down

0 comments on commit 23b1313

Please sign in to comment.