summaryrefslogtreecommitdiffstats
path: root/samples/ServiceProvider/App_Code/DatabaseTokenManager.cs
blob: acc8b94f385bbf90bdd23b0fed21c41d67306c42 (plain)
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
//-----------------------------------------------------------------------
// <copyright file="DatabaseTokenManager.cs" company="Andrew Arnott">
//     Copyright (c) Andrew Arnott. All rights reserved.
// </copyright>
//-----------------------------------------------------------------------

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using DotNetOAuth.ChannelElements;

public class DatabaseTokenManager : ITokenManager {
	#region ITokenManager Members

	public string GetConsumerSecret(string consumerKey) {
		var consumerRow = Global.DataContext.OAuthConsumers.SingleOrDefault(
			consumerCandidate => consumerCandidate.ConsumerKey == consumerKey);
		if (consumerRow == null) {
			throw new ArgumentException();
		}

		return consumerRow.ConsumerSecret;
	}

	public string GetTokenSecret(string token) {
		var tokenRow = Global.DataContext.OAuthTokens.SingleOrDefault(
			tokenCandidate => tokenCandidate.Token == token);
		if (tokenRow == null) {
			throw new ArgumentException();
		}

		return tokenRow.TokenSecret;
	}

	public void StoreNewRequestToken(string consumerKey, string requestToken, string requestTokenSecret, IDictionary<string, string> requestParameters, IDictionary<string, string> responseParameters) {
		var consumer = Global.DataContext.OAuthConsumers.Single(consumerRow => consumerRow.ConsumerKey == consumerKey);
		string scope = requestParameters["scope"];
		OAuthToken newToken = new OAuthToken {
			OAuthConsumer = consumer,
			Token = requestToken,
			TokenSecret = requestTokenSecret,
			IssueDate = DateTime.UtcNow,
			Scope = scope,
		};

		Global.DataContext.OAuthTokens.InsertOnSubmit(newToken);
	}

	/// <summary>
	/// Checks whether a given request token has already been authorized
	/// by some user for use by the Consumer that requested it.
	/// </summary>
	/// <param name="requestToken">The Consumer's request token.</param>
	/// <returns>
	/// True if the request token has already been fully authorized by the user
	/// who owns the relevant protected resources.  False if the token has not yet
	/// been authorized, has expired or does not exist.
	/// </returns>
	public bool IsRequestTokenAuthorized(string requestToken) {
		var tokenFound = Global.DataContext.OAuthTokens.SingleOrDefault(
			token => token.Token == requestToken &&
			token.State == TokenAuthorizationState.AuthorizedRequestToken);
		return tokenFound != null;
	}

	public void ExpireRequestTokenAndStoreNewAccessToken(string consumerKey, string requestToken, string accessToken, string accessTokenSecret) {
		var data = Global.DataContext;
		var consumerRow = data.OAuthConsumers.Single(consumer => consumer.ConsumerKey == consumerKey);
		var tokenRow = data.OAuthTokens.Single(token => token.Token == requestToken && token.OAuthConsumer == consumerRow);
		Debug.Assert(tokenRow.State == TokenAuthorizationState.AuthorizedRequestToken, "The token should be authorized already!");

		// Update the existing row to be an access token.
		tokenRow.IssueDate = DateTime.UtcNow;
		tokenRow.State = TokenAuthorizationState.AccessToken;
		tokenRow.Token = accessToken;
		tokenRow.TokenSecret = accessTokenSecret;
	}

	/// <summary>
	/// Classifies a token as a request token or an access token.
	/// </summary>
	/// <param name="token">The token to classify.</param>
	/// <returns>Request or Access token, or invalid if the token is not recognized.</returns>
	public TokenType GetTokenType(string token) {
		var tokenRow = Global.DataContext.OAuthTokens.SingleOrDefault(tokenCandidate => tokenCandidate.Token == token);
		if (tokenRow == null) {
			return TokenType.InvalidToken;
		} else if (tokenRow.State == TokenAuthorizationState.AccessToken) {
			return TokenType.AccessToken;
		} else {
			return TokenType.RequestToken;
		}
	}

	#endregion

	public void AuthorizeRequestToken(string requestToken, User user) {
		if (requestToken == null) {
			throw new ArgumentNullException("requestToken");
		}
		if (user == null) {
			throw new ArgumentNullException("user");
		}

		var tokenRow = Global.DataContext.OAuthTokens.SingleOrDefault(
			tokenCandidate => tokenCandidate.Token == requestToken &&
			tokenCandidate.State == TokenAuthorizationState.UnauthorizedRequestToken);
		if (tokenRow == null) {
			throw new ArgumentException();
		}

		tokenRow.State = TokenAuthorizationState.AuthorizedRequestToken;
		tokenRow.User = user;
	}
}