/[resiprocate]/main/resip/dum/test/certServer.cxx
ViewVC logotype

Diff of /main/resip/dum/test/certServer.cxx

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 3530 by jason, Mon Nov 22 06:24:14 2004 UTC revision 4599 by derek, Wed May 11 23:10:19 2005 UTC
# Line 8  Line 8 
8    
9  #include <signal.h>  #include <signal.h>
10    
11    #include "resiprocate/NameAddr.hxx"
12    #include "resiprocate/Pkcs8Contents.hxx"
13  #include "resiprocate/SipMessage.hxx"  #include "resiprocate/SipMessage.hxx"
14  #include "resiprocate/Symbols.hxx"  #include "resiprocate/Symbols.hxx"
15  #include "resiprocate/Uri.hxx"  #include "resiprocate/Uri.hxx"
 #include "resiprocate/NameAddr.hxx"  
 #include "resiprocate/Pkcs8Contents.hxx"  
16  #include "resiprocate/X509Contents.hxx"  #include "resiprocate/X509Contents.hxx"
17  #include "resiprocate/dum/AppDialogSet.hxx"  #include "resiprocate/dum/AppDialogSet.hxx"
 #include "resiprocate/dum/ServerSubscription.hxx"  
 #include "resiprocate/dum/ServerPublication.hxx"  
18  #include "resiprocate/dum/ClientAuthManager.hxx"  #include "resiprocate/dum/ClientAuthManager.hxx"
19  #include "resiprocate/dum/DialogUsageManager.hxx"  #include "resiprocate/dum/DialogUsageManager.hxx"
20    #include "resiprocate/dum/DumShutdownHandler.hxx"
21  #include "resiprocate/dum/OutOfDialogHandler.hxx"  #include "resiprocate/dum/OutOfDialogHandler.hxx"
22  #include "resiprocate/dum/Profile.hxx"  #include "resiprocate/dum/MasterProfile.hxx"
23    #include "resiprocate/dum/PublicationHandler.hxx"
24  #include "resiprocate/dum/RegistrationHandler.hxx"  #include "resiprocate/dum/RegistrationHandler.hxx"
25    #include "resiprocate/dum/ServerPublication.hxx"
26    #include "resiprocate/dum/ServerSubscription.hxx"
27  #include "resiprocate/dum/SubscriptionHandler.hxx"  #include "resiprocate/dum/SubscriptionHandler.hxx"
 #include "resiprocate/dum/PublicationHandler.hxx"  
 #include "resiprocate/dum/DumShutdownHandler.hxx"  
28  #include "resiprocate/os/Log.hxx"  #include "resiprocate/os/Log.hxx"
29  #include "resiprocate/os/Logger.hxx"  #include "resiprocate/os/Logger.hxx"
30  #include "resiprocate/os/Random.hxx"  #include "resiprocate/os/Random.hxx"
# Line 44  Line 44 
44     finished = true;     finished = true;
45  }  }
46    
47  class PublicationHandler : public ServerPublicationHandler  // When a publish comes in, we should let any outstanding subscriptions know
48    // about it.
49    
50    class CertSubscriptionHandler;
51    class PrivateKeySubscriptionHandler;
52    
53    class CertPublicationHandler : public ServerPublicationHandler
54  {  {
55     public:     public:
56        PublicationHandler(Security& security) : mSecurity(security)        CertPublicationHandler(Security& security) : mSecurity(security)
57        {        {
58        }        }
59    
60        virtual void onInitial(ServerPublicationHandle h, const Data& etag, const SipMessage& pub, int expires)        virtual void onInitial(ServerPublicationHandle h,
61                                 const Data& etag,
62                                 const SipMessage& pub,
63                                 const Contents* contents,
64                                 const SecurityAttributes* attrs,
65                                 int expires)
66        {        {
          Contents* contents=0;  
67           add(h, contents);           add(h, contents);
68        }        }
69    
70        virtual void onExpired(ServerPublicationHandle h, const Data& etag)        virtual void onExpired(ServerPublicationHandle h, const Data& etag)
71        {        {
72           removeUserCertDER(h->getPublisher());           mSecurity.removeUserCert(h->getPublisher());
73        }        }
74    
75        virtual void onRefresh(ServerPublicationHandle, const Data& etag, const SipMessage& pub, int expires)        virtual void onRefresh(ServerPublicationHandle,
76                                 const Data& etag,
77                                 const SipMessage& pub,
78                                 const Contents* contents,
79                                 const SecurityAttributes* attrs,
80                                 int expires)
81        {        {
82        }        }
83    
84        virtual void onUpdate(ServerPublicationHandle h, const Data& etag, const SipMessage& pub, int expires)        virtual void onUpdate(ServerPublicationHandle h,
85                                const Data& etag,
86                                const SipMessage& pub,
87                                const Contents* contents,
88                                const SecurityAttributes* attrs,
89                                int expires)
90        {        {
          Contents* contents=0;  
91           add(h, contents);           add(h, contents);
92        }        }
93    
94        virtual void onRemoved(ServerPublicationHandle, const Data& etag, const SipMessage& pub, int expires)        virtual void onRemoved(ServerPublicationHandle h, const Data& etag, const SipMessage& pub, int expires)
95        {        {
96           removeUserCertDER(h->getPublisher());           mSecurity.removeUserCert(h->getPublisher());
97        }        }
98     private:     private:
99        void add(ServerPublicationHandle h, Contents* contents)        void add(ServerPublicationHandle h, const Contents* contents)
100        {        {
101           X509Contents* x509 = dynamic_cast<X509Contents*>(contents);           if (h->getDocumentKey() == h->getPublisher())
102             {
103                const X509Contents* x509 = dynamic_cast<const X509Contents*>(contents);
104           assert(x509);           assert(x509);
105           addUserCertDER(h->getPublisher(), x509->getBodyData());              mSecurity.addUserCertDER(h->getPublisher(), x509->getBodyData());
106                h->send(h->accept(200));
107             }
108             else
109             {
110                h->send(h->accept(403)); // !jf! is this the correct code?
111             }
112        }        }
113    
114        Security& mSecurity;        Security& mSecurity;
# Line 94  Line 121 
121        {        {
122        }        }
123    
124        virtual void onInitial(ServerPublicationHandle h, const Data& etag, const SipMessage& pub, int expires)        virtual void onInitial(ServerPublicationHandle h,
125                                 const Data& etag,
126                                 const SipMessage& pub,
127                                 const Contents* contents,
128                                 const SecurityAttributes* attrs,
129                                 int expires)
130        {        {
          Contents* contents=0;  
131           add(h, contents);           add(h, contents);
132        }        }
133    
134        virtual void onExpired(ServerPublicationHandle h, const Data& etag)        virtual void onExpired(ServerPublicationHandle h, const Data& etag)
135        {        {
136           removeUserPrivateKeyDER(h->getPublisher());           mSecurity.removeUserPrivateKey(h->getPublisher());
137        }        }
138    
139        virtual void onRefresh(ServerPublicationHandle, const Data& etag, const SipMessage& pub, int expires)        virtual void onRefresh(ServerPublicationHandle,
140                                 const Data& etag,
141                                 const SipMessage& pub,
142                                 const Contents* contents,
143                                 const SecurityAttributes* attrs,
144                                 int expires)
145        {        {
146        }        }
147    
148        virtual void onUpdate(ServerPublicationHandle, const Data& etag, const SipMessage& pub, int expires)        virtual void onUpdate(ServerPublicationHandle h,
149                                const Data& etag,
150                                const SipMessage& pub,
151                                const Contents* contents,
152                                const SecurityAttributes* attrs,
153                                int expires)
154        {        {
          Contents* contents=0;  
155           add(h, contents);           add(h, contents);
156        }        }
157    
158        virtual void onRemoved(ServerPublicationHandle, const Data& etag, const SipMessage& pub, int expires)        virtual void onRemoved(ServerPublicationHandle h, const Data& etag, const SipMessage& pub, int expires)
159        {        {
160           removeUserPrivateKeyDER(h->getPublisher());           mSecurity.removeUserPrivateKey(h->getPublisher());
161        }        }
162    
163     private:     private:
164        void add(ServerPublicationHandle h, Contents* contents)        void add(ServerPublicationHandle h, const Contents* contents)
165        {        {
166           Pkcs8Contents* pkcs8 = dynamic_cast<Pkcs8Contents*>(contents);           if (h->getDocumentKey() == h->getPublisher())
167             {
168                const Pkcs8Contents* pkcs8 = dynamic_cast<const Pkcs8Contents*>(contents);
169           assert(pkcs8);           assert(pkcs8);
170           addUserPrivateKeyDER(h->getPublisher(), pkcs8->getBodyData())              mSecurity.addUserPrivateKeyDER(h->getPublisher(), pkcs8->getBodyData());
171             }
172             else
173             {
174                h->send(h->accept(403)); // !jf! is this the correct code?
175             }
176        }        }
177                
178        Security& mSecurity;        Security& mSecurity;
# Line 140  Line 187 
187    
188        virtual void onNewSubscription(ServerSubscriptionHandle h, const SipMessage& sub)        virtual void onNewSubscription(ServerSubscriptionHandle h, const SipMessage& sub)
189        {        {
190           if (mSecurity.hasUserCert(h->getPublisher()))           if (!mSecurity.hasUserCert(h->getDocumentKey()))
191             {
192                // !jf! really need to do this async. send neutral state in the meantime,
193                // blah blah blah
194                mSecurity.generateUserCert(h->getDocumentKey());
195             }
196    
197             if (mSecurity.hasUserCert(h->getDocumentKey()))
198           {           {
199              X509Contents x509(mSecurity.getUserCertDER(h->getPublisher()));              X509Contents x509(mSecurity.getUserCertDER(h->getDocumentKey()));
200              h->send(h->update(&x509));              h->send(h->update(&x509));
201           }           }
202           else           else
# Line 151  Line 205 
205           }           }
206        }        }
207    
208          virtual void onPublished(ServerSubscriptionHandle associated,
209                                   ServerPublicationHandle publication,
210                                   const Contents* contents,
211                                   const SecurityAttributes* attrs)
212          {
213             associated->send(associated->update(contents));
214          }
215          
216    
217        virtual void onTerminated(ServerSubscriptionHandle)        virtual void onTerminated(ServerSubscriptionHandle)
218        {        {
219        }        }
# Line 170  Line 233 
233        {        {
234        }        }
235    
236        virtual void onNewSubscription(ServerSubscriptionHandle, const SipMessage& sub)        virtual void onNewSubscription(ServerSubscriptionHandle h, const SipMessage& sub)
237        {        {
238           if (mSecurity.hasUserCert(h->getPublisher()))           if (h->getDocumentKey() != h->getSubscriber())
239           {           {
240              Pkcs8Contents pkcs(mSecurity.getUserPrivateKeyDER(h->getPublisher()));              h->send(h->accept(403)); // !jf! is this the correct code?
241             }
242             else if (mSecurity.hasUserCert(h->getDocumentKey()))
243             {
244                Pkcs8Contents pkcs(mSecurity.getUserPrivateKeyDER(h->getDocumentKey()));
245              h->send(h->update(&pkcs));              h->send(h->update(&pkcs));
246           }           }
247           else           else
# Line 183  Line 250 
250           }           }
251        }        }
252    
253          virtual void onPublished(ServerSubscriptionHandle associated,
254                                   ServerPublicationHandle publication,
255                                   const Contents* contents,
256                                   const SecurityAttributes* attrs)
257          {
258             associated->send(associated->update(contents));
259          }
260    
261        virtual void onTerminated(ServerSubscriptionHandle)        virtual void onTerminated(ServerSubscriptionHandle)
262        {        {
263        }        }
# Line 190  Line 265 
265        virtual void onError(ServerSubscriptionHandle, const SipMessage& msg)        virtual void onError(ServerSubscriptionHandle, const SipMessage& msg)
266        {        {
267        }        }
268    
269     private:     private:
270        Security& mSecurity;        Security& mSecurity;
271  };  };
# Line 199  Line 275 
275  class CertServer : public OutOfDialogHandler,  public DialogUsageManager  class CertServer : public OutOfDialogHandler,  public DialogUsageManager
276  {  {
277     public:     public:
278        CertServer(const resip::NameAddr& me) :        CertServer(const resip::NameAddr& me, SipStack& stack) :
279           DialogUsageManager(),           DialogUsageManager(stack),
280           mCertUpdater(getSecurity()),           mCertServer(*getSecurity()),
281           mPrivateKeyUpdater(getSecurity()),           mPrivateKeyServer(*getSecurity()),
282           mCertServer(getSecurity()),           mCertUpdater(*getSecurity()),
283           mPrivateKeyServer(getSecurity())           mPrivateKeyUpdater(*getSecurity()),
284             mDone(false)
285        {        {
286           addTransport(UDP, 5100);           addTransport(UDP, 5100);
287           addTransport(TCP, 5100);           addTransport(TCP, 5100);
288           // addTlsTransport           addTransport(TLS, 5101, V4, Data::Empty, me.uri().host(), Data::Empty);
289                    
290           mProfile.clearSupportedMethods();           mProfile.clearSupportedMethods();
291           mProfile.addSupportedMethod(PUBLISH);           mProfile.addSupportedMethod(PUBLISH);
292           mProfile.addSupportedMethod(SUBSCRIBE);           mProfile.addSupportedMethod(SUBSCRIBE);
293           mProfile.validateAcceptEnabled() = true;           mProfile.validateAcceptEnabled() = true;
294           mProfile.validateContentEnabled() = true;           mProfile.validateContentEnabled() = true;
295           mProfile.addSupportedMimeType(Pkcs8Contents::getStaticType());           mProfile.addSupportedMimeType(PUBLISH, Pkcs8Contents::getStaticType());
296           mProfile.addSupportedMimeType(X509Contents::getStaticType());           mProfile.addSupportedMimeType(SUBSCRIBE, Pkcs8Contents::getStaticType());
297             mProfile.addSupportedMimeType(PUBLISH, X509Contents::getStaticType());
298             mProfile.addSupportedMimeType(SUBSCRIBE, X509Contents::getStaticType());
299                    
300           mProfile.setDefaultFrom(me);           mProfile.setDefaultFrom(me);
301           setProfile(&mProfile);           setMasterProfile(&mProfile);
302    
303           addServerSubscriptionHandler(Symbols::Credential, &mPrivateKeyServer);           addServerSubscriptionHandler(Symbols::Credential, &mPrivateKeyServer);
304           addServerSubscriptionHandler(Symbols::Certificate, &mCertServer);           addServerSubscriptionHandler(Symbols::Certificate, &mCertServer);
# Line 264  Line 343 
343        }        }
344    
345     private:     private:
346        Profile mProfile;        MasterProfile mProfile;
       CertPublicationHandler mCertUpdater;  
       PrivateKeyPublicationHandler mPrivateKeyUpdater;  
347        CertSubscriptionHandler mCertServer;        CertSubscriptionHandler mCertServer;
348        PrivateKeySubscriptionHandler mPrivateKeyServer;        PrivateKeySubscriptionHandler mPrivateKeyServer;
349          CertPublicationHandler mCertUpdater;
350          PrivateKeyPublicationHandler mPrivateKeyUpdater;
351        bool mDone;        bool mDone;
352  };  };
353    
# Line 317  Line 396 
396  #endif  #endif
397    
398     NameAddr domain(myUrl);     NameAddr domain(myUrl);
399     CertServer server(domain);     SipStack stack;
400       CertServer server(domain, stack);
401     server.run();     server.run();
402     return 0;     return 0;
403  }  }

Legend:
Removed from v.3530  
changed lines
  Added in v.4599

webmaster AT resiprocate DOT org
ViewVC Help
Powered by ViewVC 1.1.27