You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
298 lines
11 KiB
298 lines
11 KiB
using System; |
|
using System.IO; |
|
using System.Net; |
|
|
|
using Unity.Plastic.Newtonsoft.Json; |
|
|
|
using Codice.Client.Common.WebApi; |
|
using Codice.CM.Common; |
|
using Codice.LogWrapper; |
|
using PlasticGui.Help.NewVersions; |
|
using PlasticGui.WebApi.Responses; |
|
|
|
namespace Unity.PlasticSCM.Editor.WebApi |
|
{ |
|
internal static class WebRestApiClient |
|
{ |
|
internal static class PlasticScm |
|
{ |
|
internal static TokenExchangeResponse TokenExchange(string unityAccessToken) |
|
{ |
|
Uri endpoint = mWebApiUris.GetFullUri( |
|
string.Format(TokenExchangeEndpoint, unityAccessToken)); |
|
|
|
try |
|
{ |
|
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(endpoint); |
|
request.Method = "GET"; |
|
request.ContentType = "application/json"; |
|
return GetResponse<TokenExchangeResponse>(request); |
|
} |
|
catch (Exception ex) |
|
{ |
|
mLog.ErrorFormat( |
|
"Unable to exchange tokens '{0}': {1}", |
|
endpoint.ToString(), ex.Message); |
|
|
|
mLog.DebugFormat( |
|
"StackTrace:{0}{1}", |
|
Environment.NewLine, ex.StackTrace); |
|
|
|
return null; |
|
} |
|
} |
|
|
|
internal static IsCollabProjectMigratedResponse IsCollabProjectMigrated(string bearerToken, string projectId) |
|
{ |
|
Uri endpoint = mWebApiUris.GetFullUri(string.Format( |
|
IsCollabProjectMigratedEndpoint, projectId)); |
|
|
|
try |
|
{ |
|
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(endpoint); |
|
request.Method = "GET"; |
|
request.ContentType = "application/json"; |
|
request.Headers.Add( |
|
HttpRequestHeader.Authorization, |
|
string.Format("Bearer {0}", bearerToken)); |
|
|
|
return GetResponse<IsCollabProjectMigratedResponse>(request); |
|
} |
|
catch (Exception ex) |
|
{ |
|
mLog.ErrorFormat( |
|
"Unable to retrieve is collab migrated '{0}': {1}", |
|
endpoint.ToString(), ex.Message); |
|
|
|
mLog.DebugFormat( |
|
"StackTrace:{0}{1}", |
|
Environment.NewLine, ex.StackTrace); |
|
|
|
return null; |
|
} |
|
} |
|
|
|
internal static NewVersionResponse GetLastVersion(Edition plasticEdition) |
|
{ |
|
Uri endpoint = mWebApiUris.GetFullUri( |
|
WebApiEndpoints.LastVersion.NewVersion, |
|
"9.0.0.0", |
|
WebApiEndpoints.LastVersion.GetEditionString(plasticEdition), |
|
WebApiEndpoints.LastVersion.GetPlatformString()); |
|
|
|
try |
|
{ |
|
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(endpoint); |
|
request.Method = "GET"; |
|
request.ContentType = "application/json"; |
|
|
|
return GetResponse<NewVersionResponse>(request); |
|
} |
|
catch (Exception ex) |
|
{ |
|
mLog.ErrorFormat( |
|
"Unable to retrieve new versions from '{0}': {1}", |
|
endpoint.ToString(), ex.Message); |
|
|
|
mLog.DebugFormat( |
|
"StackTrace:{0}{1}", |
|
Environment.NewLine, ex.StackTrace); |
|
|
|
return null; |
|
} |
|
} |
|
|
|
internal static CredentialsResponse GetCredentials(string unityToken) |
|
{ |
|
Uri endpoint = mWebApiUris.GetFullUri( |
|
WebApiEndpoints.Authentication.Credentials, |
|
unityToken); |
|
|
|
try |
|
{ |
|
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(endpoint); |
|
request.Method = "GET"; |
|
request.ContentType = "application/json"; |
|
|
|
return GetResponse<CredentialsResponse>(request); |
|
} |
|
catch (Exception ex) |
|
{ |
|
return new CredentialsResponse |
|
{ |
|
Error = BuildLoggedErrorFields(ex, endpoint) |
|
}; |
|
} |
|
} |
|
|
|
internal static CurrentUserAdminCheckResponse IsUserAdmin( |
|
string organizationName, |
|
string authToken) |
|
{ |
|
Uri endpoint = mWebApiUris.GetFullUri( |
|
IsUserAdminEnpoint, |
|
organizationName); |
|
|
|
try |
|
{ |
|
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(endpoint); |
|
request.Method = "GET"; |
|
request.ContentType = "application/json"; |
|
|
|
string authenticationToken = "Basic " + authToken; |
|
|
|
request.Headers.Add( |
|
HttpRequestHeader.Authorization, authenticationToken); |
|
|
|
return GetResponse<CurrentUserAdminCheckResponse>(request); |
|
} |
|
catch (Exception ex) |
|
{ |
|
mLog.ErrorFormat( |
|
"Unable to retrieve is user admin '{0}': {1}", |
|
endpoint.ToString(), ex.Message); |
|
|
|
mLog.DebugFormat( |
|
"StackTrace:{0}{1}", |
|
Environment.NewLine, ex.StackTrace); |
|
|
|
return new CurrentUserAdminCheckResponse |
|
{ |
|
Error = BuildLoggedErrorFields(ex, endpoint) |
|
}; |
|
} |
|
} |
|
|
|
const string IsBetaEnabledEndpoint = "api/unity-package/beta/is-enabled"; |
|
const string TokenExchangeEndpoint = "api/oauth/unityid/exchange/{0}"; |
|
const string IsCollabProjectMigratedEndpoint = "api/cloud/unity/projects/{0}/is-migrated"; |
|
const string IsUserAdminEnpoint = "api/cloud/organizations/{0}/is-user-admin"; |
|
static readonly PlasticWebApiUris mWebApiUris = PlasticWebApiUris.BuildDefault(); |
|
} |
|
|
|
internal static class CloudServer |
|
{ |
|
internal static string WebLogin( |
|
string webServerUri, |
|
string organizationName, |
|
OrganizationCredentials credentials) |
|
{ |
|
Uri endpoint = new Uri( |
|
new Uri(webServerUri), |
|
string.Format(WebLoginEndPoint, organizationName)); |
|
|
|
try |
|
{ |
|
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(endpoint); |
|
request.Method = "POST"; |
|
request.ContentType = "application/json"; |
|
request.Timeout = 5000; |
|
|
|
WriteBody(request, credentials); |
|
|
|
return GetResponse<string>(request); |
|
} |
|
catch (Exception ex) |
|
{ |
|
mLog.ErrorFormat( |
|
"Unable to retrieve the organization login '{0}': {1}", |
|
endpoint.ToString(), ex.Message); |
|
|
|
mLog.DebugFormat( |
|
"StackTrace:{0}{1}", |
|
Environment.NewLine, ex.StackTrace); |
|
|
|
return null; |
|
} |
|
} |
|
|
|
internal static ChangesetFromCollabCommitResponse GetChangesetFromCollabCommit( |
|
string webServerUri, |
|
string organizationName, |
|
string webLoginAccessToken, |
|
string projectId, |
|
string commitSha) |
|
{ |
|
Uri endpoint = new Uri( |
|
new Uri(webServerUri), |
|
string.Format(GetChangesetFromCollabCommitEndpoint, |
|
organizationName, projectId, commitSha)); |
|
|
|
try |
|
{ |
|
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(endpoint); |
|
request.Method = "GET"; |
|
request.ContentType = "application/json"; |
|
request.Headers.Add( |
|
HttpRequestHeader.Authorization, |
|
string.Format("Bearer {0}", webLoginAccessToken)); |
|
|
|
return GetResponse<ChangesetFromCollabCommitResponse>(request); |
|
} |
|
catch (Exception ex) |
|
{ |
|
mLog.ErrorFormat( |
|
"Unable to retrieve the changeset from collab commit '{0}': {1}", |
|
endpoint.ToString(), ex.Message); |
|
|
|
mLog.DebugFormat( |
|
"StackTrace:{0}{1}", |
|
Environment.NewLine, ex.StackTrace); |
|
|
|
return null; |
|
} |
|
} |
|
|
|
const string WebLoginEndPoint = "api/v1/organizations/{0}/login/accesstoken"; |
|
const string GetChangesetFromCollabCommitEndpoint = "cloudapi/v1/organizations/{0}/repos/{1}/collabcommit/{2}/changeset"; |
|
} |
|
|
|
static void WriteBody(WebRequest request, object body) |
|
{ |
|
using (Stream st = request.GetRequestStream()) |
|
using (StreamWriter writer = new StreamWriter(st)) |
|
{ |
|
writer.Write(JsonConvert.SerializeObject(body)); |
|
} |
|
} |
|
|
|
static TRes GetResponse<TRes>(WebRequest request) |
|
{ |
|
using (WebResponse response = request.GetResponse()) |
|
using (StreamReader reader = new StreamReader(response.GetResponseStream())) |
|
{ |
|
string json = reader.ReadToEnd(); |
|
|
|
if (string.IsNullOrEmpty(json)) |
|
return default(TRes); |
|
|
|
return JsonConvert.DeserializeObject<TRes>(json); |
|
} |
|
} |
|
|
|
static ErrorResponse.ErrorFields BuildLoggedErrorFields( |
|
Exception ex, Uri endpoint) |
|
{ |
|
LogException(ex, endpoint); |
|
|
|
return new ErrorResponse.ErrorFields |
|
{ |
|
ErrorCode = ErrorCodes.ClientError, |
|
Message = ex.Message |
|
}; |
|
} |
|
|
|
static void LogException(Exception ex, Uri endpoint) |
|
{ |
|
mLog.ErrorFormat( |
|
"There was an error while calling '{0}': {1}", |
|
endpoint.ToString(), ex.Message); |
|
|
|
mLog.DebugFormat( |
|
"StackTrace:{0}{1}", |
|
Environment.NewLine, ex.StackTrace); |
|
} |
|
|
|
static readonly ILog mLog = LogManager.GetLogger("WebRestApiClient"); |
|
} |
|
}
|
|
|