(file) Return to AuditLoggerToLog.cpp CVS log (file) (dir) Up to [Pegasus] / pegasus / src / Pegasus / Common

  1 thilo.boehm 1.1 //%2006////////////////////////////////////////////////////////////////////////
  2                 //
  3                 // Copyright (c) 2000, 2001, 2002 BMC Software; Hewlett-Packard Development
  4                 // Company, L.P.; IBM Corp.; The Open Group; Tivoli Systems.
  5                 // Copyright (c) 2003 BMC Software; Hewlett-Packard Development Company, L.P.;
  6                 // IBM Corp.; EMC Corporation, The Open Group.
  7                 // Copyright (c) 2004 BMC Software; Hewlett-Packard Development Company, L.P.;
  8                 // IBM Corp.; EMC Corporation; VERITAS Software Corporation; The Open Group.
  9                 // Copyright (c) 2005 Hewlett-Packard Development Company, L.P.; IBM Corp.;
 10                 // EMC Corporation; VERITAS Software Corporation; The Open Group.
 11                 // Copyright (c) 2006 Hewlett-Packard Development Company, L.P.; IBM Corp.;
 12                 // EMC Corporation; Symantec Corporation; The Open Group.
 13                 //
 14                 // Permission is hereby granted, free of charge, to any person obtaining a copy
 15                 // of this software and associated documentation files (the "Software"), to
 16                 // deal in the Software without restriction, including without limitation the
 17                 // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
 18                 // sell copies of the Software, and to permit persons to whom the Software is
 19                 // furnished to do so, subject to the following conditions:
 20                 // 
 21                 // THE ABOVE COPYRIGHT NOTICE AND THIS PERMISSION NOTICE SHALL BE INCLUDED IN
 22 thilo.boehm 1.1 // ALL COPIES OR SUBSTANTIAL PORTIONS OF THE SOFTWARE. THE SOFTWARE IS PROVIDED
 23                 // "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT
 24                 // LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
 25                 // PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
 26                 // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
 27                 // ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
 28                 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 29                 //
 30                 //==============================================================================
 31                 //
 32                 //%/////////////////////////////////////////////////////////////////////////////
 33                 
 34                 #include <Pegasus/Common/Config.h>
 35                 #include <Pegasus/Common/Constants.h>
 36                 #include <Pegasus/Common/Logger.h>
 37                 #include <Pegasus/Common/AuditLogger.h>
 38                 
 39                 #ifdef PEGASUS_OS_DARWIN
 40                 # include <crt_externs.h>
 41                 #endif
 42                 
 43 thilo.boehm 1.1 #ifndef PEGASUS_OS_TYPE_WINDOWS
 44                 # include <unistd.h>
 45                 #endif
 46                 
 47                 #ifdef PEGASUS_OS_VMS
 48                 # include <unixlib.h>
 49                 #endif
 50                 
 51 marek       1.3 #ifdef PEGASUS_OS_SOLARIS
 52                 extern char** environ;
 53                 #endif
 54                 
 55 thilo.boehm 1.1 #include <stdlib.h>
 56                 
 57                 #ifdef PEGASUS_ENABLE_AUDIT_LOGGER
 58                 
 59 karl        1.5 #if defined(PEGASUS_OS_SOLARIS)
 60                 extern char** environ;
 61                 #endif
 62                 
 63 thilo.boehm 1.1 PEGASUS_USING_STD;
 64                 
 65                 PEGASUS_NAMESPACE_BEGIN
 66                 
 67                 static const String providerModuleStatus [] = {
 68                     "Unknown", "Other", "OK", "Degraded",
 69                     "Stressed", "Predictive Failure", "Error", "Non-Recoverable Error",
 70                     "Starting", "Stopping", "Stopped", "In Service", "No Contact",
 71                     "Lost Communication"};
 72                 
 73                 Boolean AuditLogger::_auditLogFlag = false;
 74                 
 75                 AuditLogger::PEGASUS_AUDITLOGINITIALIZE_CALLBACK_T
 76                     AuditLogger::_auditLogInitializeCallback = 0;
 77                 
 78                 AuditLogger::PEGASUS_AUDITLOG_CALLBACK_T AuditLogger::_writeAuditMessage =
 79                     AuditLogger::_writeAuditMessageToLog;
 80                 
 81                 void AuditLogger::logCurrentConfig(
 82                     const Array<String> & propertyNames,
 83                     const Array<String> & propertyValues)
 84 thilo.boehm 1.1 {
 85                     for (Uint32 i = 0; i < propertyNames.size(); i++)
 86                     {
 87                         String propertyStr = propertyNames[i] + "=" + propertyValues[i];
 88                 
 89                         MessageLoaderParms msgParms("Common.AuditLogger.CURRENT_CONFIG",
 90                             "cimserver configuration $0", propertyStr);
 91                 
 92                         _writeAuditMessage(TYPE_CONFIGURATION,
 93                             SUBTYPE_CURRENT_CONFIGURATION,
 94                             EVENT_START_UP, Logger::INFORMATION, msgParms);
 95                     }
 96                 }
 97                 
 98                 void AuditLogger::logCurrentRegProvider(
 99                     const Array < CIMInstance > & instances)
100                 {
101                     String moduleName;
102                     Array<Uint16> moduleStatus;
103                     String statusValue;
104                     Uint32 pos;
105 thilo.boehm 1.1 
106                     // get all the registered provider module names and status
107                     for (Uint32 i = 0; i <instances.size(); i++)
108                     {
109                         instances[i].getProperty(instances[i].findProperty(
110                             _PROPERTY_PROVIDERMODULE_NAME)).getValue().get(moduleName);
111                 
112                         pos = instances[i].findProperty(_PROPERTY_OPERATIONALSTATUS);
113                 
114                         if (pos == PEG_NOT_FOUND)
115                         {
116                             moduleStatus.append(0);
117                         }
118                         else
119                         {
120                             CIMValue theValue = instances[i].getProperty(pos).getValue();
121                 
122                             if (theValue.isNull())
123                             {
124                                 moduleStatus.append(0);
125                             }
126 thilo.boehm 1.1             else
127                             {
128                                 theValue.get(moduleStatus);
129                             }
130                         }
131                 
132                         statusValue = _getModuleStatusValue(moduleStatus);
133                 
134                         MessageLoaderParms msgParms(
135                             "Common.AuditLogger.CURRENT_PROVIDER_REGISTRATION",
136                             "Provider module \"$0\" has status \"$1\".",
137                             moduleName, statusValue);
138                 
139                         _writeAuditMessage(TYPE_CONFIGURATION,
140                             SUBTYPE_CURRENT_PROVIDER_REGISTRATION,
141                             EVENT_START_UP, Logger::INFORMATION, msgParms);
142                     }
143                 }
144                 
145                 void AuditLogger::logCurrentEnvironmentVar()
146                 {
147 thilo.boehm 1.1 #ifdef PEGASUS_OS_DARWIN
148                     char** envp = *_NSGetEnviron();
149                 #else
150                     char** envp = environ;
151                 #endif
152                 
153                     Uint32 i = 0;
154                 
155                     while (envp[i])
156                     {
157                         MessageLoaderParms msgParms("Common.AuditLogger.CURRENT_ENV",
158                            "cimserver environment variable: $0", envp[i]);
159                 
160                         _writeAuditMessage(TYPE_CONFIGURATION,
161                             SUBTYPE_CURRENT_ENVIRONMENT_VARIABLES,
162                             EVENT_START_UP, Logger::INFORMATION, msgParms);
163                 
164                         i++;
165                     }
166                 }
167                 
168 thilo.boehm 1.1 void AuditLogger::logSetConfigProperty(
169                     const String & userName,
170                     const String & propertyName,
171                     const String & prePropertyValue,
172                     const String & newPropertyValue,
173                     Boolean isPlanned)
174                 {
175                     if (isPlanned)
176                     {
177                         MessageLoaderParms msgParms(
178                             "Common.AuditLogger.SET_PLANNED_CONFIG_PROPERTY",
179                             "The planned value of property \"$0\" is modified from "
180                                 "value \"$1\" to value \"$2\" by user \"$3\".",
181                             propertyName, prePropertyValue, newPropertyValue, userName);
182                 
183                         _writeAuditMessage(TYPE_CONFIGURATION,
184                             SUBTYPE_CONFIGURATION_CHANGE,
185                             EVENT_UPDATE, Logger::INFORMATION, msgParms);
186                     }
187                     else
188                     {
189 thilo.boehm 1.1         MessageLoaderParms msgParms(
190                             "Common.AuditLogger.SET_CURRENT_CONFIG_PROPERTY",
191                             "The current value of property \"$0\" is modified from "
192                                 "value \"$1\" to value \"$2\" by user \"$3\".",
193                             propertyName, prePropertyValue, newPropertyValue, userName);
194                 
195                         _writeAuditMessage(TYPE_CONFIGURATION,
196                             SUBTYPE_CONFIGURATION_CHANGE,
197                             EVENT_UPDATE, Logger::INFORMATION, msgParms);
198                     }
199                 }
200                 
201                 void AuditLogger::logUpdateClassOperation(
202                     const char* cimMethodName,
203                     AuditEvent eventType,
204                     const String& userName,
205                     const String& ipAddr,
206                     const CIMNamespaceName& nameSpace,
207                     const CIMName& className,
208                     CIMStatusCode statusCode)
209                 {
210 thilo.boehm 1.1     MessageLoaderParms msgParms(
211                         "Common.AuditLogger.OPERATION_UPDATE_CLASS",
212                         "A CIM $0 operation on class \"$1\" in namespace \"$2\" by user "
213                             "\"$3\" connected from system \"$4\" resulted in status \"$5\".",
214                         cimMethodName,
215                         className.getString(),
216                         nameSpace.getString(),
217                         userName,
218                         ipAddr,
219                         cimStatusCodeToString(statusCode));
220                 
221                     _writeAuditMessage(TYPE_CIMOPERATION, SUBTYPE_SCHEMA_OPERATION,
222                         eventType, Logger::INFORMATION, msgParms);
223                 }
224                 
225                 void AuditLogger::logUpdateQualifierOperation(
226                     const char* cimMethodName,
227                     AuditEvent eventType,
228                     const String& userName,
229                     const String& ipAddr,
230                     const CIMNamespaceName& nameSpace,
231 thilo.boehm 1.1     const CIMName& className,
232                     CIMStatusCode statusCode)
233                 {
234                     MessageLoaderParms msgParms(
235                         "Common.AuditLogger.OPERATION_UPDATE_QUALIFIER",
236                         "A CIM $0 operation on qualifier \"$1\" in namespace \"$2\" by user "
237                             "\"$3\" connected from system \"$4\" resulted in status \"$5\".",
238                         cimMethodName,
239                         className.getString(),
240                         nameSpace.getString(),
241                         userName,
242                         ipAddr,
243                         cimStatusCodeToString(statusCode));
244                 
245                     _writeAuditMessage(TYPE_CIMOPERATION, SUBTYPE_SCHEMA_OPERATION,
246                         eventType, Logger::INFORMATION, msgParms);
247                 }
248                 
249                 void AuditLogger::logUpdateInstanceOperation(
250                     const char* cimMethodName,
251                     AuditEvent eventType,
252 thilo.boehm 1.1     const String& userName,
253                     const String& ipAddr,
254                     const CIMNamespaceName& nameSpace,
255                     const CIMObjectPath& instanceName,
256                     const String& moduleName,
257                     const String& providerName,
258                     CIMStatusCode statusCode)
259                 {
260                     if (providerName != String::EMPTY)
261                     {
262                         MessageLoaderParms msgParms(
263                             "Common.AuditLogger.OPERATION_UPDATE_INSTANCE_WITH_PROVIDER",
264                             "A CIM $0 operation on instance \"$1\" in namespace \"$2\" by "
265                                 "user \"$3\" connected from system \"$4\" resulted in "
266                                 "status \"$5\".  "
267                                 "The provider for this operation is \"$6\" in module \"$7\".",
268                             cimMethodName,
269                             CIMObjectPath("", CIMNamespaceName(), instanceName.getClassName(),
270                                 instanceName.getKeyBindings()).toString(),
271                             nameSpace.getString(),
272                             userName,
273 thilo.boehm 1.1             ipAddr,
274                             cimStatusCodeToString(statusCode),
275                             providerName,
276                             moduleName);
277                 
278                         _writeAuditMessage(TYPE_CIMOPERATION, SUBTYPE_INSTANCE_OPERATION,
279                             eventType, Logger::INFORMATION, msgParms);
280                     }
281                     else
282                     {
283                         MessageLoaderParms msgParms(
284                             "Common.AuditLogger.OPERATION_UPDATE_INSTANCE",
285                             "A CIM $0 operation on instance \"$1\" in namespace \"$2\" by "
286                                 "user \"$3\" connected from system \"$4\" resulted in "
287                                 "status \"$5\".  ",
288                             cimMethodName,
289                             CIMObjectPath("", CIMNamespaceName(), instanceName.getClassName(),
290                                 instanceName.getKeyBindings()).toString(),
291                             nameSpace.getString(),
292                             userName,
293                             ipAddr,
294 thilo.boehm 1.1             cimStatusCodeToString(statusCode));
295                 
296                         _writeAuditMessage(TYPE_CIMOPERATION, SUBTYPE_INSTANCE_OPERATION,
297                             eventType, Logger::INFORMATION, msgParms);
298                     }
299                 }
300                 
301                 void AuditLogger::logInvokeMethodOperation(
302                     const String& userName,
303                     const String& ipAddr,
304                     const CIMNamespaceName& nameSpace,
305                     const CIMObjectPath& objectName,
306                     const CIMName& methodName,
307                     const String& moduleName,
308                     const String& providerName,
309                     CIMStatusCode statusCode)
310                 {
311                     if (providerName != String::EMPTY)
312                     {
313                         MessageLoaderParms msgParms(
314                             "Common.AuditLogger.OPERATION_INVOKE_METHOD_WITH_PROVIDER",
315 thilo.boehm 1.1             "A CIM InvokeMethod operation on method \"$0\" of object \"$1\" "
316                                 "in namespace \"$2\" by user \"$3\" connected from system "
317                                 "\"$4\" resulted in status \"$5\".  The provider for this "
318                                 "operation is \"$6\" in module \"$7\".",
319                             methodName.getString(),
320                             CIMObjectPath("", CIMNamespaceName(), objectName.getClassName(),
321                                 objectName.getKeyBindings()).toString(),
322                             nameSpace.getString(),
323                             userName,
324                             ipAddr,
325                             cimStatusCodeToString(statusCode),
326                             providerName,
327                             moduleName);
328                 
329                         _writeAuditMessage(TYPE_CIMOPERATION, SUBTYPE_INSTANCE_OPERATION,
330                             EVENT_INVOKE, Logger::INFORMATION, msgParms);
331                     }
332                     else
333                     {
334                         MessageLoaderParms msgParms(
335                             "Common.AuditLogger.OPERATION_INVOKE_METHOD",
336 thilo.boehm 1.1             "A CIM InvokeMethod operation on method \"$0\" of object \"$1\" "
337                                 "in namespace \"$2\" by user \"$3\" connected from system "
338                                 "\"$4\" resulted in status \"$5\".",
339                             methodName.getString(),
340                             CIMObjectPath("", CIMNamespaceName(), objectName.getClassName(),
341                                 objectName.getKeyBindings()).toString(),
342                             nameSpace.getString(),
343                             userName,
344                             ipAddr,
345                             cimStatusCodeToString(statusCode));
346                 
347                         _writeAuditMessage(TYPE_CIMOPERATION, SUBTYPE_INSTANCE_OPERATION,
348                             EVENT_INVOKE, Logger::INFORMATION, msgParms);
349                     }
350                 }
351                 
352                 void AuditLogger::logUpdateProvModuleStatus(
353                     const String & moduleName,
354                     const Array<Uint16> currentModuleStatus,
355                     const Array<Uint16> newModuleStatus)
356                 {
357 thilo.boehm 1.1     String currentModuleStatusValue =
358                         _getModuleStatusValue(currentModuleStatus);
359                 
360                     String newModuleStatusValue = _getModuleStatusValue(newModuleStatus);
361                 
362                     MessageLoaderParms msgParms(
363                         "Common.AuditLogger.UPDATE_PROVIDER_MODULE_STATUS",
364                         "The operational status of module \"$0\" has changed from \"$1\""
365                         " to \"$2\".",
366                         moduleName, currentModuleStatusValue, newModuleStatusValue);
367                 
368                     _writeAuditMessage(TYPE_CONFIGURATION,
369                         SUBTYPE_PROVIDER_MODULE_STATUS_CHANGE,
370                         EVENT_UPDATE, Logger::INFORMATION, msgParms);
371                 }
372                 
373                 void AuditLogger::logLocalAuthentication(
374                     const String& userName,
375                     Boolean successful)
376                 {
377                     MessageLoaderParms msgParms(
378 thilo.boehm 1.1         "Common.AuditLogger.LOCAL_AUTHENTICATION",
379                         "Local authentication attempt: "
380                         "successful = $0, user = $1. ",
381                         CIMValue(successful).toString(),
382                         userName);
383                 
384                     _writeAuditMessage(
385                         TYPE_AUTHENTICATION,
386                         SUBTYPE_LOCAL_AUTHENTICATION,
387                         successful ? EVENT_AUTH_SUCCESS : EVENT_AUTH_FAILURE,
388                         successful ? Logger::INFORMATION : Logger::WARNING,
389                         msgParms);
390                 }
391                 
392                 void AuditLogger::logBasicAuthentication(
393                     const String& userName,
394                     const String& ipAddr,
395                     Boolean successful)
396                 {
397                     MessageLoaderParms msgParms(
398                         "Common.AuditLogger.BASIC_AUTHENTICATION",
399 thilo.boehm 1.1         "Basic authentication attempt: "
400 sushma.fernandes 1.2         "successful = $0, from IP address = $2, user = $1.",
401 thilo.boehm      1.1         CIMValue(successful).toString(),
402                              userName,
403                              ipAddr);
404                      
405                          _writeAuditMessage( TYPE_AUTHENTICATION,
406                              SUBTYPE_BASIC_AUTHENTICATION,
407                              successful ? EVENT_AUTH_SUCCESS : EVENT_AUTH_FAILURE,
408                              successful ? Logger::INFORMATION: Logger::WARNING,
409                              msgParms);
410                      }
411                      
412                      void AuditLogger::logCertificateBasedAuthentication(
413                          const String& issuerName,
414                          const String& subjectName,
415                          const String& serialNumber,
416                          const String& ipAddr,
417                          Boolean successful)
418                      {
419                          MessageLoaderParms msgParms(
420                              "Common.AuditLogger.CERTIFICATE_BASED_AUTHENTICATION",
421                              "Certificate based authentication attempt: "
422 sushma.fernandes 1.2             "successful = $0, from IP address = $4, issuer = $1, "
423                                  "subject = $2, serialNumber = $3.",
424 thilo.boehm      1.1         CIMValue(successful).toString(),
425                              issuerName,
426                              subjectName,
427                              serialNumber,
428                              ipAddr);
429                      
430                          _writeAuditMessage(TYPE_AUTHENTICATION,
431                              SUBTYPE_CERTIFICATE_BASED_AUTHENTICATION,
432                              successful ? EVENT_AUTH_SUCCESS : EVENT_AUTH_FAILURE,
433                              successful ? Logger::INFORMATION: Logger::WARNING,
434                              msgParms);
435                      }
436                      
437                      void AuditLogger::logCertificateBasedUserValidation(
438                          const String& userName,
439                          const String& issuerName,
440                          const String& subjectName,
441                          const String& serialNumber,
442                          const String& ipAddr,
443                          Boolean successful)
444                      {
445 thilo.boehm      1.1     MessageLoaderParms msgParms(
446                              "Common.AuditLogger.CERTIFICATE_BASED_USER_VALIDATION",
447                              "Certificate based user validation attempt: "
448 sushma.fernandes 1.2             "successful = $0, from IP address = $5, userName = $1, "
449                                  "issuer = $2,  subject = $3, serialNumber = $4.",
450 thilo.boehm      1.1         CIMValue(successful).toString(),
451                              userName,
452                              issuerName,
453                              subjectName,
454                              serialNumber,
455                              ipAddr);
456                      
457                          _writeAuditMessage( TYPE_AUTHORIZATION,
458                              SUBTYPE_CERTIFICATE_BASED_USER_VALIDATION,
459                              successful ? EVENT_AUTH_SUCCESS : EVENT_AUTH_FAILURE,
460                              successful ? Logger::INFORMATION: Logger::WARNING,
461                              msgParms);
462                      }
463                      
464                      void AuditLogger::setInitializeCallback(
465                          PEGASUS_AUDITLOGINITIALIZE_CALLBACK_T auditLogInitializeCallback)
466                      {
467                          _auditLogInitializeCallback = auditLogInitializeCallback;
468                      }
469                      
470                      void AuditLogger::setEnabled(Boolean enabled)
471 thilo.boehm      1.1 {
472                          // Only write the enable/disable messages if we are set up to handle them
473                          if (_auditLogInitializeCallback != 0)
474                          {
475                              if (enabled)
476                              {
477                                  if (!_auditLogFlag)
478                                  {
479                                      _auditLogInitializeCallback();
480                      
481                                      MessageLoaderParms msgParms(
482                                          "Common.AuditLogger.ENABLE_AUDIT_LOG",
483                                          "Audit logging is enabled.");
484                      
485                                      _writeAuditMessage(TYPE_CONFIGURATION,
486                                          SUBTYPE_CONFIGURATION_CHANGE,
487                                          EVENT_UPDATE, Logger::INFORMATION, msgParms);
488                                  }
489                              }
490                              else
491                              {
492 thilo.boehm      1.1             if (_auditLogFlag)
493                                  {
494                                      MessageLoaderParms msgParms(
495                                          "Common.AuditLogger.DISABLE_AUDIT_LOG",
496                                          "Audit logging is disabled.");
497                      
498                                      _writeAuditMessage(TYPE_CONFIGURATION,
499                                          SUBTYPE_CONFIGURATION_CHANGE,
500                                          EVENT_UPDATE, Logger::INFORMATION, msgParms);
501                                  }
502                              }
503                          }
504                      
505                          _auditLogFlag = enabled;
506                      }
507                      
508                      void AuditLogger::setAuditLogWriterCallback(
509                          PEGASUS_AUDITLOG_CALLBACK_T writeAuditLogCallback)
510                      {
511                          _writeAuditMessage = writeAuditLogCallback;
512                      }
513 thilo.boehm      1.1 
514                      void AuditLogger::_writeAuditMessageToLog(
515                          AuditType auditType,
516                          AuditSubType auditSubType,
517                          AuditEvent auditEvent,
518                          Uint32 logLevel,
519                          MessageLoaderParms & msgParms)
520                      {
521                          String identifier = "cimserver audit";
522                      
523 kumpf            1.4     Logger::put_l(Logger::AUDIT_LOG, identifier, logLevel, msgParms);
524 thilo.boehm      1.1 }
525                      
526                      String AuditLogger::_getModuleStatusValue(
527                          const Array<Uint16>  moduleStatus)
528                      {
529                          String moduleStatusValue, statusValue;
530                          Uint32 moduleStatusSize = moduleStatus.size();
531                      
532                          for (Uint32 j=0; j < moduleStatusSize; j++)
533                          {
534                              statusValue = providerModuleStatus[moduleStatus[j]];
535                              moduleStatusValue.append(statusValue);
536                      
537                              if (j < moduleStatusSize - 1)
538                              {
539                                  moduleStatusValue.append(",");
540                              }
541                          }
542                      
543                          return moduleStatusValue;
544                      }
545 thilo.boehm      1.1 
546                      PEGASUS_NAMESPACE_END
547                      
548                      #endif

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2