auditlog.c 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240
  1. /** BEGIN COPYRIGHT BLOCK
  2. * Copyright (C) 2001 Sun Microsystems, Inc. Used by permission.
  3. * Copyright (C) 2005 Red Hat, Inc.
  4. * All rights reserved.
  5. *
  6. * License: GPL (version 3 or any later version).
  7. * See LICENSE for details.
  8. * END COPYRIGHT BLOCK **/
  9. #ifdef HAVE_CONFIG_H
  10. # include <config.h>
  11. #endif
  12. #include "slap.h"
  13. /*
  14. * JCM - The audit log might be better implemented as a post-op plugin.
  15. */
  16. #define ATTR_CHANGETYPE "changetype"
  17. #define ATTR_NEWRDN "newrdn"
  18. #define ATTR_DELETEOLDRDN "deleteoldrdn"
  19. #define ATTR_MODIFIERSNAME "modifiersname"
  20. char *attr_changetype = ATTR_CHANGETYPE;
  21. char *attr_newrdn = ATTR_NEWRDN;
  22. char *attr_deleteoldrdn = ATTR_DELETEOLDRDN;
  23. char *attr_modifiersname = ATTR_MODIFIERSNAME;
  24. static int hide_unhashed_pw = 1;
  25. /* Forward Declarations */
  26. static void write_audit_file( int optype, const char *dn, void *change, int flag, time_t curtime );
  27. void
  28. write_audit_log_entry( Slapi_PBlock *pb )
  29. {
  30. time_t curtime;
  31. Slapi_DN *sdn;
  32. const char *dn;
  33. void *change;
  34. int flag = 0;
  35. Operation *op;
  36. /* if the audit log is not enabled, just skip all of
  37. this stuff */
  38. if (!config_get_auditlog_logging_enabled()) {
  39. return;
  40. }
  41. slapi_pblock_get( pb, SLAPI_OPERATION, &op );
  42. slapi_pblock_get( pb, SLAPI_TARGET_SDN, &sdn );
  43. switch ( operation_get_type(op) )
  44. {
  45. case SLAPI_OPERATION_MODIFY:
  46. slapi_pblock_get( pb, SLAPI_MODIFY_MODS, &change );
  47. break;
  48. case SLAPI_OPERATION_ADD:
  49. slapi_pblock_get( pb, SLAPI_ADD_ENTRY, &change );
  50. break;
  51. case SLAPI_OPERATION_DELETE:
  52. {
  53. char * deleterDN = NULL;
  54. slapi_pblock_get(pb, SLAPI_REQUESTOR_DN, &deleterDN);
  55. change = deleterDN;
  56. }
  57. break;
  58. case SLAPI_OPERATION_MODDN:
  59. /* newrdn: change is just for logging -- case does not matter. */
  60. slapi_pblock_get( pb, SLAPI_MODRDN_NEWRDN, &change );
  61. slapi_pblock_get( pb, SLAPI_MODRDN_DELOLDRDN, &flag );
  62. break;
  63. default:
  64. return; /* Unsupported operation type. */
  65. }
  66. curtime = current_time();
  67. /* log the raw, unnormalized DN */
  68. dn = slapi_sdn_get_udn(sdn);
  69. write_audit_file( operation_get_type(op), dn, change, flag, curtime );
  70. }
  71. /*
  72. * Function: write_audit_file
  73. * Arguments:
  74. * optype - type of LDAP operation being logged
  75. * dn - distinguished name of entry being changed
  76. * change - pointer to the actual change operation
  77. * For a delete operation, may contain the modifier's DN.
  78. * flag - only used by modrdn operations - value of deleteoldrdn flag
  79. * curtime - the current time
  80. * Returns: nothing
  81. */
  82. static void
  83. write_audit_file(
  84. int optype,
  85. const char *dn,
  86. void *change,
  87. int flag,
  88. time_t curtime
  89. )
  90. {
  91. LDAPMod **mods;
  92. Slapi_Entry *e;
  93. char *newrdn, *tmp, *tmpsave;
  94. int len, i, j;
  95. char *timestr;
  96. lenstr *l;
  97. l = lenstr_new();
  98. addlenstr( l, "time: " );
  99. timestr = format_localTime( curtime );
  100. addlenstr( l, timestr );
  101. slapi_ch_free((void **) &timestr );
  102. addlenstr( l, "\n" );
  103. addlenstr( l, "dn: " );
  104. addlenstr( l, dn );
  105. addlenstr( l, "\n" );
  106. switch ( optype )
  107. {
  108. case SLAPI_OPERATION_MODIFY:
  109. addlenstr( l, attr_changetype );
  110. addlenstr( l, ": modify\n" );
  111. mods = change;
  112. for ( j = 0; (mods != NULL) && (mods[j] != NULL); j++ )
  113. {
  114. int operationtype= mods[j]->mod_op & ~LDAP_MOD_BVALUES;
  115. if((strcmp(mods[j]->mod_type, PSEUDO_ATTR_UNHASHEDUSERPASSWORD) == 0) && hide_unhashed_pw){
  116. continue;
  117. }
  118. switch ( operationtype )
  119. {
  120. case LDAP_MOD_ADD:
  121. addlenstr( l, "add: " );
  122. addlenstr( l, mods[j]->mod_type );
  123. addlenstr( l, "\n" );
  124. break;
  125. case LDAP_MOD_DELETE:
  126. addlenstr( l, "delete: " );
  127. addlenstr( l, mods[j]->mod_type );
  128. addlenstr( l, "\n" );
  129. break;
  130. case LDAP_MOD_REPLACE:
  131. addlenstr( l, "replace: " );
  132. addlenstr( l, mods[j]->mod_type );
  133. addlenstr( l, "\n" );
  134. break;
  135. default:
  136. operationtype= LDAP_MOD_IGNORE;
  137. break;
  138. }
  139. if(operationtype!=LDAP_MOD_IGNORE)
  140. {
  141. for ( i = 0; mods[j]->mod_bvalues != NULL && mods[j]->mod_bvalues[i] != NULL; i++ )
  142. {
  143. char *buf, *bufp;
  144. len = strlen( mods[j]->mod_type );
  145. len = LDIF_SIZE_NEEDED( len, mods[j]->mod_bvalues[i]->bv_len ) + 1;
  146. buf = slapi_ch_malloc( len );
  147. bufp = buf;
  148. slapi_ldif_put_type_and_value_with_options( &bufp, mods[j]->mod_type,
  149. mods[j]->mod_bvalues[i]->bv_val,
  150. mods[j]->mod_bvalues[i]->bv_len, 0 );
  151. *bufp = '\0';
  152. addlenstr( l, buf );
  153. slapi_ch_free( (void**)&buf );
  154. }
  155. }
  156. addlenstr( l, "-\n" );
  157. }
  158. break;
  159. case SLAPI_OPERATION_ADD:
  160. e = change;
  161. addlenstr( l, attr_changetype );
  162. addlenstr( l, ": add\n" );
  163. tmp = slapi_entry2str( e, &len );
  164. tmpsave = tmp;
  165. while (( tmp = strchr( tmp, '\n' )) != NULL )
  166. {
  167. tmp++;
  168. if ( !ldap_utf8isspace( tmp ))
  169. {
  170. break;
  171. }
  172. }
  173. addlenstr( l, tmp );
  174. slapi_ch_free((void**)&tmpsave );
  175. break;
  176. case SLAPI_OPERATION_DELETE:
  177. tmp = change;
  178. addlenstr( l, attr_changetype );
  179. addlenstr( l, ": delete\n" );
  180. if (tmp && tmp[0]) {
  181. addlenstr( l, attr_modifiersname );
  182. addlenstr( l, ": ");
  183. addlenstr( l, tmp);
  184. addlenstr( l, "\n");
  185. }
  186. break;
  187. case SLAPI_OPERATION_MODDN:
  188. newrdn = change;
  189. addlenstr( l, attr_changetype );
  190. addlenstr( l, ": modrdn\n" );
  191. addlenstr( l, attr_newrdn );
  192. addlenstr( l, ": " );
  193. addlenstr( l, newrdn );
  194. addlenstr( l, "\n" );
  195. addlenstr( l, attr_deleteoldrdn );
  196. addlenstr( l, ": " );
  197. addlenstr( l, flag ? "1" : "0" );
  198. addlenstr( l, "\n" );
  199. }
  200. addlenstr( l, "\n" );
  201. slapd_log_audit_proc (l->ls_buf, l->ls_len);
  202. lenstr_free( &l );
  203. }
  204. void
  205. auditlog_hide_unhashed_pw()
  206. {
  207. hide_unhashed_pw = 1;
  208. }
  209. void
  210. auditlog_expose_unhashed_pw()
  211. {
  212. hide_unhashed_pw = 0;
  213. }