More progress

OAuth, public read, custom domain support
This commit is contained in:
Matthew Burnett 2018-04-20 00:26:00 -04:00
parent d5bc81fc46
commit debb4e5cce
2 changed files with 76 additions and 20 deletions

View file

@ -1,9 +1,8 @@
using ShareX.HelpersLib; using Newtonsoft.Json;
using ShareX.HelpersLib;
using System.Collections.Generic; using System.Collections.Generic;
using System.Collections.Specialized; using System.Collections.Specialized;
using System.Diagnostics;
using System.IO; using System.IO;
using System.Linq;
namespace ShareX.UploadersLib.FileUploaders namespace ShareX.UploadersLib.FileUploaders
{ {
@ -13,47 +12,97 @@ public class GoogleCloudStorageNewFileUploaderService : FileUploaderService
public override bool CheckConfig(UploadersConfig config) public override bool CheckConfig(UploadersConfig config)
{ {
return true; return OAuth2Info.CheckOAuth(config.GoogleCloudStorageOAuth2Info);
} }
public override GenericUploader CreateUploader(UploadersConfig config, TaskReferenceHelper taskInfo) public override GenericUploader CreateUploader(UploadersConfig config, TaskReferenceHelper taskInfo)
{ {
return new GoogleCloudStorage return new GoogleCloudStorage(config.YouTubeOAuth2Info)
{ {
token = "", bucket = config.GoogleCloudStorageBucket
bucket = "cdn.riolu.com"
}; };
} }
} }
public sealed class GoogleCloudStorage : FileUploader public sealed class GoogleCloudStorage : FileUploader, IOAuth2
{ {
public string token { get; set; } public OAuth2Info AuthInfo => googleAuth.AuthInfo;
private GoogleOAuth2 googleAuth;
public GoogleCloudStorage(OAuth2Info oauth)
{
googleAuth = new GoogleOAuth2(oauth, this)
{
Scope = "https://www.googleapis.com/auth/devstorage.full_control"
};
}
public bool RefreshAccessToken()
{
return googleAuth.RefreshAccessToken();
}
public bool CheckAuthorization()
{
return googleAuth.CheckAuthorization();
}
public string GetAuthorizationURL()
{
return googleAuth.GetAuthorizationURL();
}
public bool GetAccessToken(string code)
{
return googleAuth.GetAccessToken(code);
}
public class ObjectACL
{
public string entity { get; set; }
public string role { get; set; }
}
public string bucket { get; set; } public string bucket { get; set; }
public string domain { get; set; }
public override UploadResult Upload(Stream stream, string fileName) public override UploadResult Upload(Stream stream, string fileName)
{ {
if (!CheckAuthorization()) return null;
if (string.IsNullOrEmpty(domain))
{
domain = "storage.googleapis.com";
}
string uploadurl = $"https://www.googleapis.com/upload/storage/v1/b/{bucket}/o"; string uploadurl = $"https://www.googleapis.com/upload/storage/v1/b/{bucket}/o";
string publicurl = $"https://storage.googleapis.com/{bucket}/{fileName}"; string publicurl = $"https://{domain}/{bucket}/{fileName}";
string aclurl = $"https://www.googleapis.com/storage/v1/b/{bucket}/o/{fileName}/acl";
string contentType = Helpers.GetMimeType(fileName); string contentType = Helpers.GetMimeType(fileName);
Dictionary<string, string> args = new Dictionary<string, string>(); Dictionary<string, string> args = new Dictionary<string, string>
args.Add("uploadType", "media");
args.Add("name", fileName);
NameValueCollection headers = new NameValueCollection
{ {
["Content-Length"] = stream.Length.ToString(), { "uploadType", "media" },
["Authorization"] = "Bearer " + token { "name", fileName }
}; };
ObjectACL requestacl = new ObjectACL
{
entity = "allUsers",
role = "READER"
};
NameValueCollection headers = googleAuth.GetAuthHeaders();
headers.Add("Content-Length", stream.Length.ToString());
NameValueCollection responseHeaders = SendRequestGetHeaders(HttpMethod.POST, uploadurl, stream, contentType, args, headers); NameValueCollection responseHeaders = SendRequestGetHeaders(HttpMethod.POST, uploadurl, stream, contentType, args, headers);
if (responseHeaders == null) if (responseHeaders != null)
{ {
Errors.Add("Upload to Google Cloud Storage failed."); string requestjson = JsonConvert.SerializeObject(requestacl);
return null; SendRequest(HttpMethod.POST, aclurl, requestjson, ContentTypeJSON, headers: googleAuth.GetAuthHeaders());
} }
return new UploadResult return new UploadResult

View file

@ -389,6 +389,13 @@ public class UploadersConfig : SettingsBase<UploadersConfig>
#endregion YouTube #endregion YouTube
#region Google Cloud Storage
public OAuth2Info GoogleCloudStorageOAuth2Info = null;
public string GoogleCloudStorageBucket = "";
#endregion Google Cloud Storage
#endregion File uploaders #endregion File uploaders
#region URL shorteners #region URL shorteners