diff options
Diffstat (limited to 'src/DotNetOpenId/Extensions')
7 files changed, 213 insertions, 80 deletions
diff --git a/src/DotNetOpenId/Extensions/AttributeExchangeFetchRequest.cs b/src/DotNetOpenId/Extensions/AttributeExchangeFetchRequest.cs index ad27769..245f19a 100644 --- a/src/DotNetOpenId/Extensions/AttributeExchangeFetchRequest.cs +++ b/src/DotNetOpenId/Extensions/AttributeExchangeFetchRequest.cs @@ -1,27 +1,45 @@ using System;
using System.Collections.Generic;
using System.Text;
-using DotNetOpenId.RelyingParty;
+using System.Globalization;
namespace DotNetOpenId.Extensions {
/// <summary>
/// The Attribute Exchange Fetch message, request leg.
/// </summary>
- public struct AttributeExchangeFetchRequest {
- /// <summary>
- /// Adds the properties of this Attribute Exchange request to an outgoing
- /// OpenID authentication request.
- /// </summary>
- public void AddToRequest(Provider.IAuthenticationRequest authenticationRequest) {
- throw new NotImplementedException();
- }
+ public class AttributeExchangeFetchRequest : IExtensionRequest {
+ readonly string Mode = "fetch_request";
+
/// <summary>
/// Reads an incoming authentication request (from a relying party)
/// for Attribute Exchange properties and returns an instance of this
/// struct with them.
/// </summary>
- public static AttributeExchangeFetchRequest ReadFromRequest(IAuthenticationResponse response) {
- throw new NotImplementedException();
+ public static AttributeExchangeFetchRequest ReadFromRequest(Provider.IRequest request) {
+ var obj = new AttributeExchangeFetchRequest();
+ return ((IExtensionRequest)obj).ReadFromRequest(request) ? obj : null;
}
+
+ #region IExtensionRequest Members
+ string IExtensionRequest.TypeUri { get { return Constants.ae.ns; } }
+
+ public void AddToRequest(RelyingParty.IAuthenticationRequest authenticationRequest) {
+ var fields = new Dictionary<string, string> {
+ { "mode", Mode },
+ };
+ authenticationRequest.AddExtensionArguments(Constants.ae.ns, fields);
+ }
+
+ bool IExtensionRequest.ReadFromRequest(DotNetOpenId.Provider.IRequest request) {
+ var fields = request.GetExtensionArguments(Constants.ae.ns);
+ if (fields == null) return false;
+ string mode;
+ fields.TryGetValue("mode", out mode);
+ if (mode != Mode) return false;
+
+ return true;
+ }
+
+ #endregion
}
}
diff --git a/src/DotNetOpenId/Extensions/AttributeExchangeFetchResponse.cs b/src/DotNetOpenId/Extensions/AttributeExchangeFetchResponse.cs index 4e7dbc2..db72875 100644 --- a/src/DotNetOpenId/Extensions/AttributeExchangeFetchResponse.cs +++ b/src/DotNetOpenId/Extensions/AttributeExchangeFetchResponse.cs @@ -2,25 +2,44 @@ using System.Collections.Generic;
using System.Text;
using DotNetOpenId.RelyingParty;
+using System.Globalization;
namespace DotNetOpenId.Extensions {
/// <summary>
/// The Attribute Exchange Fetch message, response leg.
/// </summary>
- public struct AttributeExchangeFetchResponse {
- /// <summary>
- /// Adds the values of this struct to an authentication response being prepared
- /// by an OpenID Provider.
- /// </summary>
- public void AddToResponse(Provider.IAuthenticationRequest authenticationRequest) {
- throw new NotImplementedException();
- }
+ public class AttributeExchangeFetchResponse : IExtensionResponse {
+ readonly string Mode = "fetch_response";
+
/// <summary>
/// Reads a Provider's response for Attribute Exchange values and returns
/// an instance of this struct with the values.
/// </summary>
public static AttributeExchangeFetchResponse ReadFromResponse(IAuthenticationResponse response) {
- throw new NotImplementedException();
+ var obj = new AttributeExchangeFetchResponse();
+ return ((IExtensionResponse)obj).ReadFromResponse(response) ? obj : null;
+ }
+
+ #region IExtensionResponse Members
+ string IExtensionResponse.TypeUri { get { return Constants.ae.ns; } }
+
+ public void AddToResponse(Provider.IRequest authenticationRequest) {
+ var fields = new Dictionary<string, string> {
+ { "mode", Mode },
+ };
+ authenticationRequest.AddExtensionArguments(Constants.ae.ns, fields);
}
+
+ bool IExtensionResponse.ReadFromResponse(IAuthenticationResponse response) {
+ var fields = response.GetExtensionArguments(Constants.ae.ns);
+ if (fields == null) return false;
+ string mode;
+ fields.TryGetValue("mode", out mode);
+ if (mode != Mode) return false;
+
+ return true;
+ }
+
+ #endregion
}
}
diff --git a/src/DotNetOpenId/Extensions/AttributeExchangeStoreRequest.cs b/src/DotNetOpenId/Extensions/AttributeExchangeStoreRequest.cs index 1fdc715..0523d6c 100644 --- a/src/DotNetOpenId/Extensions/AttributeExchangeStoreRequest.cs +++ b/src/DotNetOpenId/Extensions/AttributeExchangeStoreRequest.cs @@ -2,26 +2,45 @@ using System.Collections.Generic;
using System.Text;
using DotNetOpenId.RelyingParty;
+using System.Globalization;
namespace DotNetOpenId.Extensions {
/// <summary>
/// The Attribute Exchange Store message, request leg.
/// </summary>
- public struct AttributeExchangeStoreRequest {
- /// <summary>
- /// Adds the properties of this Attribute Exchange request to an outgoing
- /// OpenID authentication request.
- /// </summary>
- public void AddToRequest(Provider.IAuthenticationRequest authenticationRequest) {
- throw new NotImplementedException();
- }
+ public class AttributeExchangeStoreRequest : IExtensionRequest {
+ readonly string Mode = "store_request";
+
/// <summary>
/// Reads an incoming authentication request (from a relying party)
/// for Attribute Exchange properties and returns an instance of this
/// struct with them.
/// </summary>
- public static AttributeExchangeStoreRequest ReadFromRequest(IAuthenticationResponse response) {
- throw new NotImplementedException();
+ public static AttributeExchangeStoreRequest ReadFromRequest(Provider.IRequest request) {
+ var obj = new AttributeExchangeStoreRequest();
+ return ((IExtensionRequest)obj).ReadFromRequest(request) ? obj : null;
}
+
+ #region IExtensionRequest Members
+ string IExtensionRequest.TypeUri { get { return Constants.ae.ns; } }
+
+ public void AddToRequest(RelyingParty.IAuthenticationRequest authenticationRequest) {
+ var fields = new Dictionary<string, string> {
+ { "mode", Mode },
+ };
+ authenticationRequest.AddExtensionArguments(Constants.ae.ns, fields);
+ }
+
+ bool IExtensionRequest.ReadFromRequest(DotNetOpenId.Provider.IRequest request) {
+ var fields = request.GetExtensionArguments(Constants.ae.ns);
+ if (fields == null) return false;
+ string mode;
+ fields.TryGetValue("mode", out mode);
+ if (mode != Mode) return false;
+
+ return true;
+ }
+
+ #endregion
}
}
diff --git a/src/DotNetOpenId/Extensions/AttributeExchangeStoreResponse.cs b/src/DotNetOpenId/Extensions/AttributeExchangeStoreResponse.cs index b28d2be..dbdbabd 100644 --- a/src/DotNetOpenId/Extensions/AttributeExchangeStoreResponse.cs +++ b/src/DotNetOpenId/Extensions/AttributeExchangeStoreResponse.cs @@ -2,25 +2,44 @@ using System.Collections.Generic;
using System.Text;
using DotNetOpenId.RelyingParty;
+using System.Globalization;
namespace DotNetOpenId.Extensions {
/// <summary>
/// The Attribute Exchange Store message, response leg.
/// </summary>
- public struct AttributeExchangeStoreResponse {
- /// <summary>
- /// Adds the values of this struct to an authentication response being prepared
- /// by an OpenID Provider.
- /// </summary>
- public void AddToResponse(Provider.IAuthenticationRequest authenticationRequest) {
- throw new NotImplementedException();
- }
+ public class AttributeExchangeStoreResponse : IExtensionResponse {
+ readonly string Mode = "store_response";
+
/// <summary>
/// Reads a Provider's response for Attribute Exchange values and returns
/// an instance of this struct with the values.
/// </summary>
public static AttributeExchangeStoreResponse ReadFromResponse(IAuthenticationResponse response) {
- throw new NotImplementedException();
+ var obj = new AttributeExchangeStoreResponse();
+ return ((IExtensionResponse)obj).ReadFromResponse(response) ? obj : null;
+ }
+
+ #region IExtensionResponse Members
+ string IExtensionResponse.TypeUri { get { return Constants.ae.ns; } }
+
+ public void AddToResponse(Provider.IRequest authenticationRequest) {
+ var fields = new Dictionary<string, string> {
+ { "mode", Mode },
+ };
+ authenticationRequest.AddExtensionArguments(Constants.ae.ns, fields);
}
+
+ bool IExtensionResponse.ReadFromResponse(IAuthenticationResponse response) {
+ var fields = response.GetExtensionArguments(Constants.ae.ns);
+ if (fields == null) return false;
+ string mode;
+ fields.TryGetValue("mode", out mode);
+ if (mode != Mode) return false;
+
+ return true;
+ }
+
+ #endregion
}
}
diff --git a/src/DotNetOpenId/Extensions/IExtension.cs b/src/DotNetOpenId/Extensions/IExtension.cs new file mode 100644 index 0000000..1f3480b --- /dev/null +++ b/src/DotNetOpenId/Extensions/IExtension.cs @@ -0,0 +1,49 @@ +using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace DotNetOpenId.Extensions {
+ /// <summary>
+ /// The contract an OpenID extension can implement for messages from relying party to provider
+ /// to make handling extensions generally easier.
+ /// Extensions are not required to implement this interface, however.
+ /// </summary>
+ public interface IExtensionRequest {
+ /// <summary>
+ /// Gets the TypeURI the extension uses in the OpenID protocol and in XRDS advertisements.
+ /// </summary>
+ string TypeUri { get; }
+ /// <summary>
+ /// Adds the properties of this Attribute Exchange request to an outgoing
+ /// OpenID authentication request.
+ /// </summary>
+ void AddToRequest(RelyingParty.IAuthenticationRequest authenticationRequest);
+ /// <summary>
+ /// Reads the extension information on an authentication request to the provider.
+ /// </summary>
+ /// <returns>True if the extension found any of its parameters in the request.</returns>
+ bool ReadFromRequest(Provider.IRequest request);
+ }
+
+ /// <summary>
+ /// The contract an OpenID extension can implement for messages from provider to relying party
+ /// to make handling extensions generally easier.
+ /// Extensions are not required to implement this interface, however.
+ /// </summary>
+ public interface IExtensionResponse {
+ /// <summary>
+ /// Gets the TypeURI the extension uses in the OpenID protocol and in XRDS advertisements.
+ /// </summary>
+ string TypeUri { get; }
+ /// <summary>
+ /// Adds the values of this struct to an authentication response being prepared
+ /// by an OpenID Provider.
+ /// </summary>
+ void AddToResponse(Provider.IRequest authenticationRequest);
+ /// <summary>
+ /// Reads a Provider's response for extension values.
+ /// </summary>
+ /// <returns>True if the extension found any of its parameters in the response.</returns>
+ bool ReadFromResponse(RelyingParty.IAuthenticationResponse response);
+ }
+}
diff --git a/src/DotNetOpenId/Extensions/SimpleRegistrationFieldValues.cs b/src/DotNetOpenId/Extensions/SimpleRegistrationFieldValues.cs index f7cf70d..e6fbe21 100644 --- a/src/DotNetOpenId/Extensions/SimpleRegistrationFieldValues.cs +++ b/src/DotNetOpenId/Extensions/SimpleRegistrationFieldValues.cs @@ -22,14 +22,9 @@ namespace DotNetOpenId.Extensions /// authenticating user.
/// </summary>
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2218:OverrideGetHashCodeOnOverridingEquals"), Serializable()]
- public struct SimpleRegistrationFieldValues
+ public class SimpleRegistrationFieldValues : IExtensionResponse
{
/// <summary>
- /// An empty struct. Useful for comparisons.
- /// </summary>
- public static readonly SimpleRegistrationFieldValues Empty = new SimpleRegistrationFieldValues();
-
- /// <summary>
/// The nickname the user goes by.
/// </summary>
public string Nickname { get; set; }
@@ -109,11 +104,23 @@ namespace DotNetOpenId.Extensions public string TimeZone { get; set; }
/// <summary>
+ /// Reads a Provider's response for Simple Registration values and returns
+ /// an instance of this struct with the values.
+ /// </summary>
+ public static SimpleRegistrationFieldValues ReadFromResponse(IAuthenticationResponse response) {
+ var obj = new SimpleRegistrationFieldValues();
+ return ((IExtensionResponse)obj).ReadFromResponse(response) ? obj : null;
+ }
+
+ #region IExtensionResponse Members
+ string IExtensionResponse.TypeUri { get { return Constants.sreg.sreg_ns; } }
+
+ /// <summary>
/// Adds the values of this struct to an authentication response being prepared
/// by an OpenID Provider.
/// </summary>
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1011:ConsiderPassingBaseTypesAsParameters")]
- public void AddToResponse(Provider.IAuthenticationRequest authenticationRequest) {
+ public void AddToResponse(Provider.IRequest authenticationRequest) {
if (authenticationRequest == null) throw new ArgumentNullException("authenticationRequest");
Dictionary<string, string> fields = new Dictionary<string, string>();
if (BirthDate != null) {
@@ -149,48 +156,44 @@ namespace DotNetOpenId.Extensions }
authenticationRequest.AddExtensionArguments(Constants.sreg.sreg_ns, fields);
}
- /// <summary>
- /// Reads a Provider's response for Simple Registration values and returns
- /// an instance of this struct with the values.
- /// </summary>
- public static SimpleRegistrationFieldValues ReadFromResponse(IAuthenticationResponse response) {
+
+ bool IExtensionResponse.ReadFromResponse(IAuthenticationResponse response) {
var sreg = response.GetExtensionArguments(Constants.sreg.sreg_ns);
- if (sreg == null) return new SimpleRegistrationFieldValues();
+ if (sreg == null) return false;
string nickname, email, fullName, dob, genderString, postalCode, country, language, timeZone;
- DateTime? birthDate = null;
- Gender? gender = null;
+ BirthDate = null;
+ Gender = null;
sreg.TryGetValue(Constants.sreg.nickname, out nickname);
+ Nickname = nickname;
sreg.TryGetValue(Constants.sreg.email, out email);
+ Email = email;
sreg.TryGetValue(Constants.sreg.fullname, out fullName);
+ FullName = fullName;
if (sreg.TryGetValue(Constants.sreg.dob, out dob)) {
DateTime bd;
if (DateTime.TryParse(dob, out bd))
- birthDate = bd;
+ BirthDate = bd;
}
if (sreg.TryGetValue(Constants.sreg.gender, out genderString)) {
switch (genderString) {
- case Constants.sreg.Genders.Male: gender = DotNetOpenId.Extensions.Gender.Male; break;
- case Constants.sreg.Genders.Female: gender = DotNetOpenId.Extensions.Gender.Female; break;
+ case Constants.sreg.Genders.Male: Gender = DotNetOpenId.Extensions.Gender.Male; break;
+ case Constants.sreg.Genders.Female: Gender = DotNetOpenId.Extensions.Gender.Female; break;
}
}
sreg.TryGetValue(Constants.sreg.postcode, out postalCode);
+ PostalCode = postalCode;
sreg.TryGetValue(Constants.sreg.country, out country);
+ Country = country;
sreg.TryGetValue(Constants.sreg.language, out language);
+ Language = language;
sreg.TryGetValue(Constants.sreg.timezone, out timeZone);
+ TimeZone = timeZone;
- return new SimpleRegistrationFieldValues() {
- Nickname = nickname,
- Email = email,
- FullName = fullName,
- BirthDate = birthDate,
- Gender = gender,
- PostalCode = postalCode,
- Country = country,
- Language = language,
- TimeZone = timeZone,
- };
+ return true;
}
+ #endregion
+
/// <summary>
/// Tests equality of two <see cref="SimpleRegistrationFieldValues"/> objects.
/// </summary>
@@ -228,5 +231,6 @@ namespace DotNetOpenId.Extensions if (one == null ^ other == null) return false;
return one.Equals(other);
}
+
}
}
\ No newline at end of file diff --git a/src/DotNetOpenId/Extensions/SimpleRegistrationRequestFields.cs b/src/DotNetOpenId/Extensions/SimpleRegistrationRequestFields.cs index 1b125ce..32be3c9 100644 --- a/src/DotNetOpenId/Extensions/SimpleRegistrationRequestFields.cs +++ b/src/DotNetOpenId/Extensions/SimpleRegistrationRequestFields.cs @@ -12,12 +12,7 @@ namespace DotNetOpenId.Extensions { /// </summary>
#pragma warning disable 0659, 0661
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2218:OverrideGetHashCodeOnOverridingEquals")]
- public struct SimpleRegistrationRequestFields {
- /// <summary>
- /// Gets a <see cref="SimpleRegistrationRequestFields"/> struct where no information is requested.
- /// </summary>
- public static readonly SimpleRegistrationRequestFields None = new SimpleRegistrationRequestFields();
-
+ public class SimpleRegistrationRequestFields : IExtensionRequest {
/// <summary>
/// The level of interest a relying party has in the nickname of the user.
/// </summary>
@@ -135,28 +130,37 @@ namespace DotNetOpenId.Extensions { /// and returns information on what profile fields the consumer is requesting/requiring.
/// </summary>
public static SimpleRegistrationRequestFields ReadFromRequest(IRequest request) {
- SimpleRegistrationRequestFields fields = new SimpleRegistrationRequestFields();
+ var fields = new SimpleRegistrationRequestFields();
+ ((IExtensionRequest)fields).ReadFromRequest(request);
+ return fields;
+ }
+
+ #region IExtensionRequest Members
+ string IExtensionRequest.TypeUri { get { return Constants.sreg.sreg_ns; } }
+
+ bool IExtensionRequest.ReadFromRequest(IRequest request) {
var args = request.GetExtensionArguments(Constants.sreg.sreg_ns);
- if (args == null) return fields;
+ if (args == null) return false;
string policyUrl;
if (args.TryGetValue(Constants.sreg.policy_url, out policyUrl)
&& !string.IsNullOrEmpty(policyUrl)) {
- fields.PolicyUrl = new Uri(policyUrl);
+ PolicyUrl = new Uri(policyUrl);
}
string optionalFields;
if (args.TryGetValue(Constants.sreg.optional, out optionalFields)) {
- fields.SetProfileRequestFromList(optionalFields.Split(','), SimpleRegistrationRequest.Request);
+ SetProfileRequestFromList(optionalFields.Split(','), SimpleRegistrationRequest.Request);
}
string requiredFields;
if (args.TryGetValue(Constants.sreg.required, out requiredFields)) {
- fields.SetProfileRequestFromList(requiredFields.Split(','), SimpleRegistrationRequest.Require);
+ SetProfileRequestFromList(requiredFields.Split(','), SimpleRegistrationRequest.Require);
}
- return fields;
+ return true;
}
+
/// <summary>
/// Adds a description of the information the relying party site would like
/// the Provider to include with a positive authentication assertion as an
@@ -172,6 +176,7 @@ namespace DotNetOpenId.Extensions { request.AddExtensionArguments(Constants.sreg.sreg_ns, fields);
}
+ #endregion
/// <summary>
/// Renders the requested information as a string.
|