| 30 |
using System; |
using System; |
| 31 |
using System.Net; |
using System.Net; |
| 32 |
using System.IO; |
using System.IO; |
| 33 |
|
using System.Text; |
| 34 |
using System.Xml; |
using System.Xml; |
| 35 |
using OpenMetaverse; |
using OpenMetaverse; |
| 36 |
using OpenMetaverse.StructuredData; |
using OpenMetaverse.StructuredData; |
| 39 |
{ |
{ |
| 40 |
public static class AssetClient |
public static class AssetClient |
| 41 |
{ |
{ |
| 42 |
public static bool TryGetAsset(UUID assetID, string assetURL, out byte[] assetData) |
public static bool TryGetAuthToken(Uri claimedIdentifier, string firstName, string lastName, string password, |
| 43 |
|
Uri serverUrl, out UUID authToken) |
| 44 |
|
{ |
| 45 |
|
authToken = UUID.Zero; |
| 46 |
|
serverUrl = new Uri(serverUrl, "authenticate"); |
| 47 |
|
|
| 48 |
|
OSDMap osd = new OSDMap(1); |
| 49 |
|
osd.Add("identifier", OSD.FromUri(claimedIdentifier)); |
| 50 |
|
byte[] postData = Encoding.UTF8.GetBytes(OSDParser.SerializeJson(osd).ToJson()); |
| 51 |
|
|
| 52 |
|
try |
| 53 |
|
{ |
| 54 |
|
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(serverUrl); |
| 55 |
|
request.Method = "POST"; |
| 56 |
|
request.ContentLength = postData.Length; |
| 57 |
|
request.ContentType = "application/json"; |
| 58 |
|
|
| 59 |
|
using (Stream stream = request.GetRequestStream()) |
| 60 |
|
stream.Write(postData, 0, postData.Length); |
| 61 |
|
|
| 62 |
|
HttpWebResponse response = (HttpWebResponse)request.GetResponse(); |
| 63 |
|
|
| 64 |
|
if (response.ResponseUri.Authority == claimedIdentifier.Authority) |
| 65 |
|
{ |
| 66 |
|
// This response came from the OpenID provider (user server). |
| 67 |
|
// Send back a form with our filled in data |
| 68 |
|
postData = Encoding.UTF8.GetBytes( |
| 69 |
|
String.Format("first={0}&last={1}&pass={2}", firstName, lastName, Utils.MD5(password))); |
| 70 |
|
|
| 71 |
|
request = (HttpWebRequest)WebRequest.Create(response.ResponseUri); |
| 72 |
|
request.Method = "POST"; |
| 73 |
|
request.ContentLength = postData.Length; |
| 74 |
|
request.ContentType = "application/x-www-form-urlencoded"; |
| 75 |
|
|
| 76 |
|
using (Stream stream = request.GetRequestStream()) |
| 77 |
|
stream.Write(postData, 0, postData.Length); |
| 78 |
|
|
| 79 |
|
response = (HttpWebResponse)request.GetResponse(); |
| 80 |
|
|
| 81 |
|
if (response.ResponseUri.Authority == serverUrl.Authority) |
| 82 |
|
{ |
| 83 |
|
// This response came from the OpenID consumer (asset server) |
| 84 |
|
if (response.StatusCode == HttpStatusCode.OK) |
| 85 |
|
{ |
| 86 |
|
using (Stream stream = response.GetResponseStream()) |
| 87 |
|
{ |
| 88 |
|
OSDMap map = OSDParser.DeserializeJson(stream) as OSDMap; |
| 89 |
|
|
| 90 |
|
if (map != null && map.ContainsKey("auth_token")) |
| 91 |
|
{ |
| 92 |
|
authToken = map["auth_token"].AsUUID(); |
| 93 |
|
return true; |
| 94 |
|
} |
| 95 |
|
} |
| 96 |
|
} |
| 97 |
|
} |
| 98 |
|
else |
| 99 |
|
{ |
| 100 |
|
} |
| 101 |
|
} |
| 102 |
|
} |
| 103 |
|
catch (WebException ex) |
| 104 |
|
{ |
| 105 |
|
PrintWebException(ex); |
| 106 |
|
} |
| 107 |
|
|
| 108 |
|
return false; |
| 109 |
|
} |
| 110 |
|
|
| 111 |
|
public static bool TryGetAsset(UUID assetID, UUID authToken, Uri assetLocation, out byte[] assetData) |
| 112 |
{ |
{ |
| 113 |
assetData = null; |
assetData = null; |
| 114 |
|
|
| 115 |
try |
try |
| 116 |
{ |
{ |
| 117 |
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(assetURL); |
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(assetLocation); |
| 118 |
|
AddAuthorizeHeader(request, authToken); |
| 119 |
HttpWebResponse response = (HttpWebResponse)request.GetResponse(); |
HttpWebResponse response = (HttpWebResponse)request.GetResponse(); |
| 120 |
|
|
| 121 |
if (response.StatusCode == HttpStatusCode.OK) |
if (response.StatusCode == HttpStatusCode.OK) |
| 136 |
catch (WebException ex) |
catch (WebException ex) |
| 137 |
{ |
{ |
| 138 |
if (ex.Response == null || ((HttpWebResponse)ex.Response).StatusCode != HttpStatusCode.NotFound) |
if (ex.Response == null || ((HttpWebResponse)ex.Response).StatusCode != HttpStatusCode.NotFound) |
| 139 |
Console.WriteLine("[ERROR] " + ex.Message); |
PrintWebException(ex); |
| 140 |
} |
} |
| 141 |
|
|
| 142 |
return false; |
return false; |
| 143 |
} |
} |
| 144 |
|
|
| 145 |
public static bool TryGetMetadata(UUID assetID, string serverURL, out byte[] metadata) |
public static bool TryGetMetadata(UUID assetID, UUID authToken, Uri serverUrl, out byte[] metadata) |
| 146 |
{ |
{ |
| 147 |
metadata = null; |
metadata = null; |
| 148 |
serverURL = serverURL.TrimEnd('/'); |
serverUrl = new Uri(serverUrl, String.Format("{0}/metadata", assetID)); |
|
string requestURL = String.Format("{0}/{1}/metadata", serverURL, assetID); |
|
| 149 |
|
|
| 150 |
try |
try |
| 151 |
{ |
{ |
| 152 |
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(requestURL); |
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(serverUrl); |
| 153 |
|
AddAuthorizeHeader(request, authToken); |
| 154 |
HttpWebResponse response = (HttpWebResponse)request.GetResponse(); |
HttpWebResponse response = (HttpWebResponse)request.GetResponse(); |
| 155 |
|
|
| 156 |
if (response.StatusCode == HttpStatusCode.OK) |
if (response.StatusCode == HttpStatusCode.OK) |
| 171 |
catch (WebException ex) |
catch (WebException ex) |
| 172 |
{ |
{ |
| 173 |
if (ex.Response == null || ((HttpWebResponse)ex.Response).StatusCode != HttpStatusCode.NotFound) |
if (ex.Response == null || ((HttpWebResponse)ex.Response).StatusCode != HttpStatusCode.NotFound) |
| 174 |
Console.WriteLine("[ERROR] " + ex.Message); |
PrintWebException(ex); |
| 175 |
} |
} |
| 176 |
|
|
| 177 |
return false; |
return false; |
| 178 |
} |
} |
| 179 |
|
|
| 180 |
public static UUID CreateAsset(string name, string description, string contentType, bool temporary, string serverURL, byte[] assetData) |
public static UUID CreateAsset(string name, string description, string contentType, bool temporary, |
| 181 |
|
UUID authToken, Uri serverUrl, byte[] assetData, UUID assetID) |
| 182 |
{ |
{ |
| 183 |
return CreateAsset(name, description, contentType, temporary, serverURL, assetData, UUID.Zero); |
string requestURL = String.Format("{0}{1}", serverUrl, "createasset"); |
|
} |
|
| 184 |
|
|
| 185 |
public static UUID CreateAsset(string name, string description, string contentType, bool temporary, string serverURL, byte[] assetData, |
OSDMap osd = new OSDMap(); |
|
UUID assetID) |
|
|
{ |
|
|
serverURL = serverURL.TrimEnd('/'); |
|
|
string requestURL = serverURL + "/createasset"; |
|
|
|
|
|
OSDMap map = new OSDMap(); |
|
| 186 |
|
|
| 187 |
if (assetID != UUID.Zero) map["id"] = OSD.FromUUID(assetID); |
if (assetID != UUID.Zero) osd["id"] = OSD.FromUUID(assetID); |
| 188 |
map["name"] = OSD.FromString(name); |
osd["name"] = OSD.FromString(name); |
| 189 |
map["description"] = OSD.FromString(description); |
osd["description"] = OSD.FromString(description); |
| 190 |
map["type"] = OSD.FromString(contentType); |
osd["type"] = OSD.FromString(contentType); |
| 191 |
map["temporary"] = OSD.FromBoolean(temporary); |
osd["temporary"] = OSD.FromBoolean(temporary); |
| 192 |
map["data"] = OSD.FromBinary(assetData); |
osd["data"] = OSD.FromBinary(assetData); |
| 193 |
|
|
| 194 |
LitJson.JsonData jsonData = OSDParser.SerializeJson(map); |
byte[] postData = Encoding.UTF8.GetBytes(OSDParser.SerializeJson(osd).ToJson()); |
|
string jsonString = jsonData.ToJson(); |
|
|
byte[] postData = System.Text.Encoding.UTF8.GetBytes(jsonString); |
|
| 195 |
|
|
| 196 |
try |
try |
| 197 |
{ |
{ |
| 198 |
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(requestURL); |
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(requestURL); |
| 199 |
|
AddAuthorizeHeader(request, authToken); |
| 200 |
request.Method = "POST"; |
request.Method = "POST"; |
| 201 |
request.ContentLength = postData.Length; |
request.ContentLength = postData.Length; |
| 202 |
|
request.ContentType = "application/json"; |
| 203 |
|
|
| 204 |
using (Stream stream = request.GetRequestStream()) |
using (Stream stream = request.GetRequestStream()) |
| 205 |
{ |
{ |
| 235 |
} |
} |
| 236 |
catch (WebException ex) |
catch (WebException ex) |
| 237 |
{ |
{ |
| 238 |
Console.WriteLine("[ERROR] " + ex.Message); |
PrintWebException(ex); |
| 239 |
} |
} |
| 240 |
|
|
| 241 |
return UUID.Zero; |
return UUID.Zero; |
| 242 |
} |
} |
| 243 |
|
|
| 244 |
|
static void AddAuthorizeHeader(HttpWebRequest request, UUID authToken) |
| 245 |
|
{ |
| 246 |
|
if (authToken != UUID.Zero) |
| 247 |
|
request.Headers.Add(HttpRequestHeader.Authorization, String.Format("OpenGrid {0}", authToken)); |
| 248 |
|
} |
| 249 |
|
|
| 250 |
|
static void PrintWebException(WebException ex) |
| 251 |
|
{ |
| 252 |
|
if (ex.Response != null) |
| 253 |
|
{ |
| 254 |
|
HttpWebResponse response = (HttpWebResponse)ex.Response; |
| 255 |
|
|
| 256 |
|
if (!String.IsNullOrEmpty(response.StatusDescription)) |
| 257 |
|
{ |
| 258 |
|
Console.WriteLine("[ERROR] The remote server returned an error: " + response.StatusDescription); |
| 259 |
|
return; |
| 260 |
|
} |
| 261 |
|
} |
| 262 |
|
|
| 263 |
|
Console.WriteLine("[ERROR] " + ex.Message); |
| 264 |
|
} |
| 265 |
} |
} |
| 266 |
} |
} |