This file is indexed.

/usr/include/resip/dum/ServerRegistration.hxx is in libresiprocate-1.9-dev 1.9.6-1.

This file is owned by root:root, with mode 0o644.

The actual contents of the file can be viewed below.

  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
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
#if !defined(RESIP_SERVERREGISTRATION_HXX)
#define RESIP_SERVERREGISTRATION_HXX

#include "resip/dum/NonDialogUsage.hxx"
#include "resip/dum/RegistrationPersistenceManager.hxx"
#include "resip/stack/SipMessage.hxx"

namespace resip
{

class ServerRegistration: public NonDialogUsage 
{
   public:
      ServerRegistrationHandle getHandle();

      /** Accept a SIP registration with a specific response.  Any contacts in this message will be deleted and replaced with the list created during REGISTER processing.

         !Warning! After calling this function from a ServerRegistrationHandle, do not access the handle as this function
         may delete this object. Use ServerRegistrationHandle::isValidHandle() to test if it's deleted.
      */
      void accept(SipMessage& ok);

      /** Accept a SIP registration.

        !Warning! After calling this function from a ServerRegistrationHandle, do not access the handle as this function
        may delete this object. Use ServerRegistrationHandle::isValidHandle() to test if it's deleted.
     */
      void accept(int statusCode = 200);

      /** Reject a SIP registration.  
  
        !Warning! After calling this function from a ServerRegistrationHandle, do not access the handle as this function
        may delete this object. Use ServerRegistrationHandle::isValidHandle() to test if it's deleted.
      */
      void reject(int statusCode);

      virtual void end();
      virtual void dispatch(const SipMessage& msg);
      virtual void dispatch(const DumTimeout& timer);

      virtual EncodeStream& dump(EncodeStream& strm) const;

      /** Used when useAsyncProcessing() is true.  Provide the current set of contacts for this registration for
        * processing.  This is required during initial registration processing to provide a local copy of the registered contacts, which
          are then updated by the registration processing.  At the end of the registration processing this function must provide a
          final list of contacts after any user-defined manipulation.

          !CAUTION! This function must be called from the DUM thread.
        */
      bool asyncProvideContacts(std::auto_ptr<resip::ContactPtrList> contacts);

      resip::SharedPtr<ContactList> getOriginalContacts() { return mOriginalContacts; }  // WARNING - use this only if async mode is not used
      const ContactList& getRequestContacts() { return mRequestContacts; }

   protected:
      virtual ~ServerRegistration();
   private:
      friend class DialogSet;
      ServerRegistration(DialogUsageManager& dum, DialogSet& dialogSet, const SipMessage& request);

      bool tryFlow(ContactInstanceRecord& rec,
                   const resip::SipMessage& msg);
      bool flowTokenNeededForTls(const ContactInstanceRecord &rec) const;
      bool flowTokenNeededForSigcomp(const ContactInstanceRecord &rec) const;
      bool testFlowRequirements(ContactInstanceRecord &rec,
                                const resip::SipMessage& msg,
                                bool hasFlow) const;

      SipMessage mRequest;
      Uri mAor;
      resip::SharedPtr<ContactList> mOriginalContacts;  // Used only for non-async processing
      ContactList mRequestContacts;  // Contains the Contacts from the REGISTER request
      bool mDidOutbound;

      // disabled
      ServerRegistration(const ServerRegistration&);
      ServerRegistration& operator=(const ServerRegistration&);

      /** States are used to keep track of asynchronous requests made to the database.
         Typical activity & state progression for a successful registration (onQuery & reject() are slightly different):

         DUM                  ServerRegistration                RegistrationHandler
         _____________________________________________________________________________________________________
         
      1) dispatch()/asyncStateNone--->
      2)                              asyncGetContacts()/asyncStateWaitingForInitialContactList--->
         ======================================================================================================
      3)                              <---asyncProvideContacts()/asyncStateProcessingRegistration
      4)                      processRegistration()
      5)                              (onRefresh()|onRemove()|onAdd()|onRemoveAll()|onQuery)/asyncStateWaitingForAcceptReject--->
         ======================================================================================================
      6)                              <---accept()
      7)                              asyncUpdateContacts/asyncStateAcceptedWaitingForFinalContactList--->
         ======================================================================================================
      8)                              <---asyncProvideContacts()/asyncStateProvidedFinalContacts
      9)                      asyncProcessFinalContacts()/asyncStateNone
      10) <---send(200Ok)
         ______________________________________________________________________________________________________

         * onQuery processing is similar, except it immediately sends the 200Ok after handling the accept().

         * ServerRegistration::reject() does not require roll-back and the error is immediately sent back to DUM.

       * It is possible to call ServerRegistration::reject() after calling accept() (DB failure, app failure, etc)

      */
      typedef enum AsyncState
      {
         asyncStateNone,
         asyncStateWaitingForInitialContactList, //!< Sent an asynchronous request to get the current contact list from the DB.
         asyncStateProcessingRegistration, //!< received the initial contact list, processing the current REGISTER request and updating the contact list.
         asyncStateWaitingForAcceptReject, //!< RegistrationHandler called, waiting for accept() or reject() from user.
         asyncStateAcceptedWaitingForFinalContactList, //!< asyncUpdateContacts() has been called, waiting for final list.
         asyncStateProvidedFinalContacts, //!< After receiving the final contact list; process the accepted register and send response.
         asyncStateQueryOnly //!< The REGISTER is a query, so just send back the current list in accept().
      } AsyncState;

      AsyncState mAsyncState;

      /** Look at the contacts provided by the incoming REGISTER.
      */
      void processRegistration(const SipMessage& msg);

      void asyncProcessFinalOkMsg(SipMessage &msg, ContactPtrList &contacts);

      /** Add contacs to msg, adding expires param.  Also removes expired entries from contacts and calls the
        * appropriate DB functions to remove them.
      */
      void processFinalOkMsg(SipMessage &msg, ContactList &contacts);

      /** After the user calls accept(), ServerRegistration will apply the local contact list and wait for a final
        * contact list.  Once the final list is received via asyncProvideContacts(), this function finishes the REGISTER
        * processing.
        */
      void asyncProcessFinalContacts(std::auto_ptr<resip::ContactPtrList> contacts);

      /** Local datastore used to aggregate all changes to the current contact list when using the asynchronous logic.
      */
      class AsyncLocalStore
      {
         public:

            AsyncLocalStore(std::auto_ptr<ContactPtrList> originalContacts)
            {
               create(originalContacts);
            }

            ~AsyncLocalStore(void)
            {
               destroy();
            }

            /** Setup this object in preparation for updating the records.  Updates occur when processing a REGISTER
                message.
                */
            void create(std::auto_ptr<ContactPtrList> originalContacts);

            void destroy(void);

            void removeContact(const ContactInstanceRecord &rec);
            /** All original contacts are to be removed, move them all to the removed list
            */
            void removeAllContacts(void);

            /** Could be an addition or refresh.
            */
            RegistrationPersistenceManager::update_status_t
            updateContact(const ContactInstanceRecord &rec);

            /** Remove the transacation log and updated contact list.  This object should be considered destroyed and
                not used after releasing.
               */
            void releaseLog(std::auto_ptr<ContactRecordTransactionLog> &log, std::auto_ptr<ContactPtrList> &modifiedContacts)
            {
               log = mLog;
               modifiedContacts = mModifiedContacts;
            }

            unsigned int numContacts() { if(mModifiedContacts.get()) return (unsigned int)mModifiedContacts->size(); return 0; }
         private:
            std::auto_ptr<ContactRecordTransactionLog> mLog;
            std::auto_ptr<ContactPtrList> mModifiedContacts;
      };

      resip::SharedPtr<AsyncLocalStore> mAsyncLocalStore;

      /** Message stored during accept() call when waiting for final contact list from database.
        * Is eventually used as the 200Ok sent back to DUM when all is finished.
        */
      resip::SharedPtr<SipMessage> mAsyncOkMsg;
};

}

#endif

/* ====================================================================
 * The Vovida Software License, Version 1.0 
 * 
 * Copyright (c) 2000 Vovida Networks, Inc.  All rights reserved.
 * 
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in
 *    the documentation and/or other materials provided with the

 *    distribution.
 * 
 * 3. The names "VOCAL", "Vovida Open Communication Application Library",
 *    and "Vovida Open Communication Application Library (VOCAL)" must
 *    not be used to endorse or promote products derived from this
 *    software without prior written permission. For written
 *    permission, please contact vocal@vovida.org.
 *
 * 4. Products derived from this software may not be called "VOCAL", nor
 *    may "VOCAL" appear in their name, without prior written
 *    permission of Vovida Networks, Inc.
 * 
 * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED
 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
 * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, TITLE AND
 * NON-INFRINGEMENT ARE DISCLAIMED.  IN NO EVENT SHALL VOVIDA
 * NETWORKS, INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT DAMAGES
 * IN EXCESS OF $1,000, NOR FOR ANY INDIRECT, INCIDENTAL, SPECIAL,
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
 * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
 * DAMAGE.
 * 
 * ====================================================================
 * 
 * This software consists of voluntary contributions made by Vovida
 * Networks, Inc. and many individuals on behalf of Vovida Networks,
 * Inc.  For more information on Vovida Networks, Inc., please see
 * <http://www.vovida.org/>.
 *
 */