diff options
4 files changed, 60 insertions, 6 deletions
diff --git a/src/DotNetOpenAuth/OAuthWrap/ChannelElements/AccessToken.cs b/src/DotNetOpenAuth/OAuthWrap/ChannelElements/AccessToken.cs index e770f09..acdcb07 100644 --- a/src/DotNetOpenAuth/OAuthWrap/ChannelElements/AccessToken.cs +++ b/src/DotNetOpenAuth/OAuthWrap/ChannelElements/AccessToken.cs @@ -17,11 +17,22 @@ namespace DotNetOpenAuth.OAuthWrap.ChannelElements { /// Initializes a new instance of the <see cref="AccessToken"/> class. /// </summary> /// <param name="channel">The channel.</param> - internal AccessToken(OAuthWrapAuthorizationServerChannel channel, TimeSpan lifetime) + private AccessToken(OAuthWrapAuthorizationServerChannel channel, TimeSpan? lifetime = null) : base(channel, true, true, true, lifetime) { Contract.Requires<ArgumentNullException>(channel != null, "channel"); } + internal AccessToken(OAuthWrapAuthorizationServerChannel channel, IAuthorizationDescription authorization) + : this(channel) { + Contract.Requires<ArgumentNullException>(channel != null, "channel"); + Contract.Requires<ArgumentNullException>(authorization != null, "authorization"); + + this.ClientIdentifier = authorization.ClientIdentifier; + this.UtcCreationDate = authorization.UtcIssued; + this.User = authorization.User; + this.Scope = authorization.Scope; + } + internal static AccessToken Decode(OAuthWrapAuthorizationServerChannel channel, string value, TimeSpan lifetime, IProtocolMessage containingMessage) { Contract.Requires<ArgumentNullException>(channel != null, "channel"); Contract.Requires<ArgumentException>(!String.IsNullOrEmpty(value)); diff --git a/src/DotNetOpenAuth/OAuthWrap/ChannelElements/IAuthorizationDescription.cs b/src/DotNetOpenAuth/OAuthWrap/ChannelElements/IAuthorizationDescription.cs index d7735b9..0940160 100644 --- a/src/DotNetOpenAuth/OAuthWrap/ChannelElements/IAuthorizationDescription.cs +++ b/src/DotNetOpenAuth/OAuthWrap/ChannelElements/IAuthorizationDescription.cs @@ -7,12 +7,14 @@ namespace DotNetOpenAuth.OAuthWrap.ChannelElements { using System; using System.Collections.Generic; + using System.Diagnostics.Contracts; using System.Linq; using System.Text; /// <summary> /// Describes a delegated authorization between a resource server, a client, and a user. /// </summary> + [ContractClass(typeof(IAuthorizationDescriptionContract))] public interface IAuthorizationDescription { /// <summary> /// Gets the identifier of the client authorized to access protected data. @@ -35,4 +37,33 @@ namespace DotNetOpenAuth.OAuthWrap.ChannelElements { /// </summary> string Scope { get; } } + + [ContractClassFor(typeof(IAuthorizationDescription))] + internal abstract class IAuthorizationDescriptionContract : IAuthorizationDescription { + private IAuthorizationDescriptionContract() { + } + + string IAuthorizationDescription.ClientIdentifier { + get { + Contract.Ensures(!string.IsNullOrEmpty(Contract.Result<string>())); + throw new NotImplementedException(); + } + } + + DateTime IAuthorizationDescription.UtcIssued { + get { throw new NotImplementedException(); } + } + + string IAuthorizationDescription.User { + get { + Contract.Ensures(!string.IsNullOrEmpty(Contract.Result<string>())); + throw new NotImplementedException(); + } + } + + string IAuthorizationDescription.Scope { + get { throw new NotImplementedException(); } + } + } + } diff --git a/src/DotNetOpenAuth/OAuthWrap/ChannelElements/OAuthWrapAuthorizationServerChannel.cs b/src/DotNetOpenAuth/OAuthWrap/ChannelElements/OAuthWrapAuthorizationServerChannel.cs index 3670ad9..05d4d83 100644 --- a/src/DotNetOpenAuth/OAuthWrap/ChannelElements/OAuthWrapAuthorizationServerChannel.cs +++ b/src/DotNetOpenAuth/OAuthWrap/ChannelElements/OAuthWrapAuthorizationServerChannel.cs @@ -69,12 +69,13 @@ namespace DotNetOpenAuth.OAuthWrap.ChannelElements { public virtual AccessTokenSuccessResponse PrepareAccessToken(IAccessTokenRequest request) { Contract.Requires<ArgumentNullException>(request != null, "request"); + var accessToken = new AccessToken(this, request.AuthorizationDescription); + var refreshToken = new RefreshToken(this, request.AuthorizationDescription); var response = new AccessTokenSuccessResponse(request) { Scope = request.AuthorizationDescription.Scope, - Lifetime = TimeSpan.FromDays(1), // reasonable default for access token lifetime - // TODO: code here to initialize the response - AccessToken = "TODO", - RefreshToken = "TODO", + AccessToken = accessToken.Encode(), + RefreshToken = refreshToken.Encode(), + ////Lifetime = TimeSpan.FromDays(1), // reasonable default for access token lifetime }; return response; diff --git a/src/DotNetOpenAuth/OAuthWrap/ChannelElements/RefreshToken.cs b/src/DotNetOpenAuth/OAuthWrap/ChannelElements/RefreshToken.cs index c523127..19b267d 100644 --- a/src/DotNetOpenAuth/OAuthWrap/ChannelElements/RefreshToken.cs +++ b/src/DotNetOpenAuth/OAuthWrap/ChannelElements/RefreshToken.cs @@ -17,11 +17,22 @@ namespace DotNetOpenAuth.OAuthWrap.ChannelElements { /// Initializes a new instance of the <see cref="RefreshToken"/> class. /// </summary> /// <param name="channel">The channel.</param> - internal RefreshToken(OAuthWrapAuthorizationServerChannel channel) + private RefreshToken(OAuthWrapAuthorizationServerChannel channel) : base(channel, true, true, true) { Contract.Requires<ArgumentNullException>(channel != null, "channel"); } + internal RefreshToken(OAuthWrapAuthorizationServerChannel channel, IAuthorizationDescription authorization) + : this(channel) { + Contract.Requires<ArgumentNullException>(channel != null, "channel"); + Contract.Requires<ArgumentNullException>(authorization != null, "authorization"); + + this.ClientIdentifier = authorization.ClientIdentifier; + this.UtcCreationDate = authorization.UtcIssued; + this.User = authorization.User; + this.Scope = authorization.Scope; + } + internal static RefreshToken Decode(OAuthWrapAuthorizationServerChannel channel, string value, IProtocolMessage containingMessage) { Contract.Requires<ArgumentNullException>(channel != null, "channel"); Contract.Requires<ArgumentException>(!String.IsNullOrEmpty(value)); |