/
SitefinityRestClient.cs
141 lines (117 loc) · 4.64 KB
/
SitefinityRestClient.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
using RestSharp;
using RestSharp.Deserializers;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading.Tasks;
using timw255.Sitefinity.RestClient.Exceptions;
using timw255.Sitefinity.RestClient.SitefinityClient.Exceptions;
namespace timw255.Sitefinity.RestClient
{
public class SitefinityRestClient : IDisposable
{
private RestSharp.RestClient _restClient;
private string _baseUrl;
private string _username;
private string _password;
public SitefinityRestClient(string username, string password, string baseUrl)
{
this._username = username;
this._password = password;
this._baseUrl = String.Concat(baseUrl.TrimEnd('/'), "/");
Uri uriResult;
Uri.TryCreate(this._baseUrl, UriKind.Absolute, out uriResult);
this._restClient = new RestSharp.RestClient(uriResult);
this._restClient.CookieContainer = new CookieContainer();
this._restClient.ClearHandlers();
this._restClient.AddHandler("application/json", new JsonDeserializer());
this.SignIn();
}
protected internal IRestResponse ExecuteRequest(IRestRequest request, bool isRetry = false)
{
IRestResponse response = _restClient.Execute(request);
if (response.StatusCode == HttpStatusCode.Forbidden || response.StatusCode == HttpStatusCode.Unauthorized)
{
if (isRetry)
{
throw new SitefinityException("User already logged in");
}
else
{
SelfLogout();
ExecuteRequest(request, true);
}
}
if (response.StatusCode != HttpStatusCode.OK)
{
throw new InvalidRequestException(response.StatusDescription);
}
return response;
}
private void SignIn()
{
RestRequest request = new RestRequest("Sitefinity/Authenticate", Method.GET);
IRestResponse response = _restClient.Execute(request);
switch (response.StatusCode)
{
case HttpStatusCode.OK:
request = new RestRequest("Sitefinity/Authenticate/SWT?realm={realm}&redirect_uri={redirectUri}&deflate=true", Method.POST);
request.AddUrlSegment("realm", _baseUrl);
request.AddUrlSegment("redirectUri", "/Sitefinity");
request.AddParameter("wrap_name", _username, ParameterType.GetOrPost);
request.AddParameter("wrap_password", _password, ParameterType.GetOrPost);
request.AddParameter("sf_persistent", "true", ParameterType.GetOrPost);
response = _restClient.Execute(request);
switch (response.StatusCode)
{
case HttpStatusCode.OK:
if (response.ResponseUri.AbsolutePath == "/Sitefinity/SignOut/selflogout")
{
SelfLogout();
}
break;
case HttpStatusCode.Unauthorized:
throw new SitefinityException("Invalid username or password");
default:
break;
}
break;
case HttpStatusCode.Redirect:
throw new NotImplementedException("External STS not supported");
default:
break;
}
}
private void SelfLogout()
{
RestRequest request = new RestRequest("Sitefinity/SignOut/selflogout?ReturnUrl=%2fSitefinity%2fdashboard", Method.POST);
request.AddParameter("__EVENTTARGET", "ctl04$ctl00$ctl00$ctl00$ctl00$ctl00$selfLogoutButton");
request.AddParameter("__EVENTARGUMENT", "");
_restClient.Execute(request);
return;
}
private void SignOut()
{
RestRequest request = new RestRequest("Sitefinity/SignOut?sts_signout=true", Method.GET);
ExecuteRequest(request);
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
~SitefinityRestClient()
{
Dispose(false);
}
protected virtual void Dispose(bool disposing)
{
if (disposing)
{
this.SignOut();
}
}
}
}