summaryrefslogtreecommitdiffstats
path: root/ldap/servers/slapd/test-plugins/testgetip.c
blob: b5bd1162f306d56e0edd584caf4caddbe9215a94 (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
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
/** BEGIN COPYRIGHT BLOCK
 * Copyright (C) 2001 Sun Microsystems, Inc. Used by permission.
 * Copyright (C) 2005 Red Hat, Inc.
 * All rights reserved.
 * END COPYRIGHT BLOCK **/
/************************************************************

 testgetip.c

 This source file provides an example of a pre-operation plug-in
 function that gets the IP address of the client and the IP 
 address of the server.

 testgetip logs this information to the server error log.

 To test this plug-in function, stop the server, edit the dse.ldif file
 (in the <server_root>/slapd-<server_id>/config directory)
 and add the following lines before restarting the server :

 dn: cn=Test GetIP,cn=plugins,cn=config
 objectClass: top
 objectClass: nsSlapdPlugin
 objectClass: extensibleObject
 cn: Test GetIP
 nsslapd-pluginPath: <server_root>/plugins/slapd/slapi/examples/libtest-plugin.so
 nsslapd-pluginInitfunc: testgetip_init
 nsslapd-pluginType: preoperation
 nsslapd-pluginEnabled: on
 nsslapd-plugin-depends-on-type: database
 nsslapd-pluginId: test-getip

 ************************************************************/

#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#ifndef _WIN32
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#endif
#include "slapi-plugin.h"
#include "nspr.h"

Slapi_PluginDesc getippdesc = { "test-getip", "Netscape", "0.5",
	"sample pre-operation plugin" };

static char *netaddr2str( PRNetAddr *addrp, char *buf, size_t buflen );

int
testgetip( Slapi_PBlock *pb )
{
	void		*conn;
	PRNetAddr	client_addr, server_addr;
	char		addrbuf[ 512 ], *addrstr;

	/*
	 * Don't do anything for internal operations (NULL connection).
	 */
	if ( slapi_pblock_get( pb, SLAPI_CONNECTION, &conn ) != 0 ||
		( conn == NULL )) {
			return( 0 );
	}

	/*
	 * Get the client's IP address and log it
	 */
	if ( slapi_pblock_get( pb, SLAPI_CONN_CLIENTNETADDR, &client_addr )
	    != 0 || ( client_addr.raw.family == 0 )) {
		slapi_log_error( SLAPI_LOG_PLUGIN, "testgetip",
		    "Could not get client IP.\n" );
	} else if (( addrstr = netaddr2str( &client_addr, addrbuf,
	    sizeof(addrbuf))) != NULL ) {
		slapi_log_error( SLAPI_LOG_PLUGIN, "testgetip",
		    "Client's IP address is %s\n", addrstr );
	}

	/*
	 * Get the destination (server) IP address and log it
	 */
	if ( slapi_pblock_get( pb, SLAPI_CONN_SERVERNETADDR, &server_addr )
	    != 0 || ( server_addr.raw.family == 0 )) {
		slapi_log_error( SLAPI_LOG_PLUGIN, "testgetip",
		    "Could not get server IP.\n" );
	} else if (( addrstr = netaddr2str( &server_addr, addrbuf,
	    sizeof(addrbuf))) != NULL ) {
		slapi_log_error( SLAPI_LOG_PLUGIN, "testgetip",
		    "Client sent request to server IP %s\n", addrstr );
	}

	return( 0 );
}

#ifdef _WIN32
__declspec(dllexport)
#endif
int
testgetip_init( Slapi_PBlock *pb )
{
	/* Register the pre-operation plug-in function. */
	if ( slapi_pblock_set( pb, SLAPI_PLUGIN_VERSION,
	    SLAPI_PLUGIN_VERSION_01 ) != 0 ||
	    slapi_pblock_set( pb, SLAPI_PLUGIN_DESCRIPTION,
	    (void *)&getippdesc ) != 0 ||
	    slapi_pblock_set( pb, SLAPI_PLUGIN_PRE_SEARCH_FN,
	    (void *) testgetip ) != 0 ) { 
		slapi_log_error( SLAPI_LOG_FATAL, "testgetip_init",
			"Failed to set version and functions.\n" );
		return( -1 );
	}

	slapi_log_error( SLAPI_LOG_PLUGIN, "testgetip_init",
		"Registered preop plugins.\n" );
	return( 0 );
}


/*
 * Utility function to convert a PRNetAddr to a human readable string.
 */
static char *
netaddr2str( PRNetAddr *addrp, char *buf, size_t buflen )
{
	char	*addrstr;

	*buf = '\0';
	if ( PR_NetAddrToString( addrp, buf, buflen ) != PR_SUCCESS ) {
		slapi_log_error( SLAPI_LOG_PLUGIN, "testgetip",
		    "PR_NetAddrToString failed.\n" );
		return( NULL );
	}

	/* skip past leading ::ffff: if IPv4 address */
	if ( strlen( buf ) > 7 && strncmp( buf, "::ffff:", 7 ) == 0 ) {
		addrstr = buf + 7;
	} else {
		addrstr = buf;
	}

	return( addrstr );
}