summaryrefslogtreecommitdiffstats
path: root/source/Janrain.OpenId/Server/AssociateRequest.cs
blob: a4e9f94520202751cb5f1213086fc3e468d9d9cf (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
using System;
using System.Collections.Specialized;
using System.Text;

namespace Janrain.OpenId.Server
{
    public class AssociateRequest : Request
    {

        #region Private Members

        private string _assoc_type = QueryStringArgs.HMAC_SHA1;
        private ServerSession _session;

        #endregion

        #region Constructor(s)

        public AssociateRequest(NameValueCollection query)
            : base()
        {
            string session_type = query.Get(QueryStringArgs.openid.session_type);

            if (session_type == null)
            {
                _session = new PlainTextServerSession();
            }
            else if (session_type == QueryStringArgs.DH_SHA1)
            {
                _session = new DiffieHellmanServerSession(query);
            }
            else
            {
                throw new ProtocolException(query, "Unknown sessoin type " + session_type);
            }
        }

        #endregion

        #region Properties

        public override string Mode
        {
            get { return QueryStringArgs.Modes.associate; }
        }

        #endregion

        #region Methods

        public Response Answer(Association assoc)
        {

            #region  Trace
            if (TraceUtil.Switch.TraceInfo)
            {
                TraceUtil.ServerTrace("Start processing response for AssociateRequest");
                if (TraceUtil.Switch.TraceVerbose)
                {
                    TraceUtil.ServerTrace("Association to be sent follows:");
                    TraceUtil.ServerTrace(assoc.ToString());
                }
            }
            #endregion

            Response response = new Response(this);

            response.Fields[QueryStringArgs.openidnp.expires_in] = assoc.ExpiresIn;
            response.Fields[QueryStringArgs.openidnp.assoc_type] = QueryStringArgs.HMAC_SHA1;
            response.Fields[QueryStringArgs.openidnp.assoc_handle] = assoc.Handle;

            NameValueCollection nvc = _session.Answer(assoc.Secret);
            foreach (string key in nvc)
            {
                response.Fields[key] = nvc[key];
            }

            if (_session.SessionType != "plaintext")
            {
                response.Fields[QueryStringArgs.openidnp.session_type] = _session.SessionType;
            }

            #region  Trace
            if (TraceUtil.Switch.TraceInfo)
            {
                TraceUtil.ServerTrace("End processing response for AssociateRequest. AssociateRequest response successfully created. ");
                if (TraceUtil.Switch.TraceVerbose)
                {
                    TraceUtil.ServerTrace("Response follows. ");
                    TraceUtil.ServerTrace(response.ToString());
                }                
            }
            #endregion

            return response;
        }

        #endregion

        public override string ToString()
        {
            string returnString = "AssociateRequest._assoc_type = {0}";
            return base.ToString() + Environment.NewLine  + String.Format(returnString, _assoc_type);
        }

    }
}