mirror of https://github.com/redis/redis.git
				
				
				
			
						commit
						d044e33c20
					
				| 
						 | 
				
			
			@ -0,0 +1,16 @@
 | 
			
		|||
#!/bin/sh
 | 
			
		||||
TCL_VERSIONS="8.5 8.6"
 | 
			
		||||
TCLSH=""
 | 
			
		||||
 | 
			
		||||
for VERSION in $TCL_VERSIONS; do
 | 
			
		||||
	TCL=`which tclsh$VERSION 2>/dev/null` && TCLSH=$TCL
 | 
			
		||||
done
 | 
			
		||||
 | 
			
		||||
if [ -z $TCLSH ]
 | 
			
		||||
then
 | 
			
		||||
    echo "You need tcl 8.5 or newer in order to run the Redis test"
 | 
			
		||||
    exit 1
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
make -C tests/modules && \
 | 
			
		||||
$TCLSH tests/test_helper.tcl --single unit/moduleapi/commandfilter "${@}"
 | 
			
		||||
| 
						 | 
				
			
			@ -753,6 +753,7 @@ void RM_SetModuleAttribs(RedisModuleCtx *ctx, const char *name, int ver, int api
 | 
			
		|||
    module->usedby = listCreate();
 | 
			
		||||
    module->using = listCreate();
 | 
			
		||||
    module->filters = listCreate();
 | 
			
		||||
    module->in_call = 0;
 | 
			
		||||
    ctx->module = module;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -13,7 +13,7 @@ endif
 | 
			
		|||
 | 
			
		||||
.SUFFIXES: .c .so .xo .o
 | 
			
		||||
 | 
			
		||||
all: helloworld.so hellotype.so helloblock.so testmodule.so hellocluster.so hellotimer.so hellodict.so hellofilter.so
 | 
			
		||||
all: helloworld.so hellotype.so helloblock.so testmodule.so hellocluster.so hellotimer.so hellodict.so
 | 
			
		||||
 | 
			
		||||
.c.xo:
 | 
			
		||||
	$(CC) -I. $(CFLAGS) $(SHOBJ_CFLAGS) -fPIC -c $< -o $@
 | 
			
		||||
| 
						 | 
				
			
			@ -47,11 +47,6 @@ hellodict.xo: ../redismodule.h
 | 
			
		|||
 | 
			
		||||
hellodict.so: hellodict.xo
 | 
			
		||||
 | 
			
		||||
hellofilter.xo: ../redismodule.h
 | 
			
		||||
 | 
			
		||||
hellofilter.so: hellofilter.xo
 | 
			
		||||
	$(LD) -o $@ $< $(SHOBJ_LDFLAGS) $(LIBS) -lc
 | 
			
		||||
 | 
			
		||||
testmodule.xo: ../redismodule.h
 | 
			
		||||
 | 
			
		||||
testmodule.so: testmodule.xo
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -0,0 +1,24 @@
 | 
			
		|||
 | 
			
		||||
# find the OS
 | 
			
		||||
uname_S := $(shell sh -c 'uname -s 2>/dev/null || echo not')
 | 
			
		||||
 | 
			
		||||
# Compile flags for linux / osx
 | 
			
		||||
ifeq ($(uname_S),Linux)
 | 
			
		||||
	SHOBJ_CFLAGS ?= -W -Wall -fno-common -g -ggdb -std=c99 -O2
 | 
			
		||||
	SHOBJ_LDFLAGS ?= -shared
 | 
			
		||||
else
 | 
			
		||||
	SHOBJ_CFLAGS ?= -W -Wall -dynamic -fno-common -g -ggdb -std=c99 -O2
 | 
			
		||||
	SHOBJ_LDFLAGS ?= -bundle -undefined dynamic_lookup
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
.SUFFIXES: .c .so .xo .o
 | 
			
		||||
 | 
			
		||||
all: commandfilter.so
 | 
			
		||||
 | 
			
		||||
.c.xo:
 | 
			
		||||
	$(CC) -I../../src $(CFLAGS) $(SHOBJ_CFLAGS) -fPIC -c $< -o $@
 | 
			
		||||
 | 
			
		||||
commandfilter.xo: ../../src/redismodule.h
 | 
			
		||||
 | 
			
		||||
commandfilter.so: commandfilter.xo
 | 
			
		||||
	$(LD) -o $@ $< $(SHOBJ_LDFLAGS) $(LIBS) -lc
 | 
			
		||||
| 
						 | 
				
			
			@ -1,18 +1,18 @@
 | 
			
		|||
#define REDISMODULE_EXPERIMENTAL_API
 | 
			
		||||
#include "../redismodule.h"
 | 
			
		||||
#include "redismodule.h"
 | 
			
		||||
 | 
			
		||||
#include <string.h>
 | 
			
		||||
 | 
			
		||||
static RedisModuleString *log_key_name;
 | 
			
		||||
 | 
			
		||||
static const char log_command_name[] = "hellofilter.log";
 | 
			
		||||
static const char ping_command_name[] = "hellofilter.ping";
 | 
			
		||||
static const char unregister_command_name[] = "hellofilter.unregister";
 | 
			
		||||
static const char log_command_name[] = "commandfilter.log";
 | 
			
		||||
static const char ping_command_name[] = "commandfilter.ping";
 | 
			
		||||
static const char unregister_command_name[] = "commandfilter.unregister";
 | 
			
		||||
static int in_log_command = 0;
 | 
			
		||||
 | 
			
		||||
static RedisModuleCommandFilter *filter = NULL;
 | 
			
		||||
 | 
			
		||||
int HelloFilter_UnregisterCommand(RedisModuleCtx *ctx, RedisModuleString **argv, int argc)
 | 
			
		||||
int CommandFilter_UnregisterCommand(RedisModuleCtx *ctx, RedisModuleString **argv, int argc)
 | 
			
		||||
{
 | 
			
		||||
    (void) argc;
 | 
			
		||||
    (void) argv;
 | 
			
		||||
| 
						 | 
				
			
			@ -23,7 +23,7 @@ int HelloFilter_UnregisterCommand(RedisModuleCtx *ctx, RedisModuleString **argv,
 | 
			
		|||
    return REDISMODULE_OK;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int HelloFilter_PingCommand(RedisModuleCtx *ctx, RedisModuleString **argv, int argc)
 | 
			
		||||
int CommandFilter_PingCommand(RedisModuleCtx *ctx, RedisModuleString **argv, int argc)
 | 
			
		||||
{
 | 
			
		||||
    (void) argc;
 | 
			
		||||
    (void) argv;
 | 
			
		||||
| 
						 | 
				
			
			@ -39,7 +39,7 @@ int HelloFilter_PingCommand(RedisModuleCtx *ctx, RedisModuleString **argv, int a
 | 
			
		|||
    return REDISMODULE_OK;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int HelloFilter_LogCommand(RedisModuleCtx *ctx, RedisModuleString **argv, int argc)
 | 
			
		||||
int CommandFilter_LogCommand(RedisModuleCtx *ctx, RedisModuleString **argv, int argc)
 | 
			
		||||
{
 | 
			
		||||
    RedisModuleString *s = RedisModule_CreateString(ctx, "", 0);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -74,9 +74,9 @@ int HelloFilter_LogCommand(RedisModuleCtx *ctx, RedisModuleString **argv, int ar
 | 
			
		|||
    return REDISMODULE_OK;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void HelloFilter_CommandFilter(RedisModuleCommandFilterCtx *filter)
 | 
			
		||||
void CommandFilter_CommandFilter(RedisModuleCommandFilterCtx *filter)
 | 
			
		||||
{
 | 
			
		||||
    if (in_log_command) return;  /* don't process our own RM_Call() from HelloFilter_LogCommand() */
 | 
			
		||||
    if (in_log_command) return;  /* don't process our own RM_Call() from CommandFilter_LogCommand() */
 | 
			
		||||
 | 
			
		||||
    /* Fun manipulations:
 | 
			
		||||
     * - Remove @delme
 | 
			
		||||
| 
						 | 
				
			
			@ -117,7 +117,7 @@ void HelloFilter_CommandFilter(RedisModuleCommandFilterCtx *filter)
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
int RedisModule_OnLoad(RedisModuleCtx *ctx, RedisModuleString **argv, int argc) {
 | 
			
		||||
    if (RedisModule_Init(ctx,"hellofilter",1,REDISMODULE_APIVER_1)
 | 
			
		||||
    if (RedisModule_Init(ctx,"commandfilter",1,REDISMODULE_APIVER_1)
 | 
			
		||||
            == REDISMODULE_ERR) return REDISMODULE_ERR;
 | 
			
		||||
 | 
			
		||||
    if (argc != 2) {
 | 
			
		||||
| 
						 | 
				
			
			@ -130,18 +130,18 @@ int RedisModule_OnLoad(RedisModuleCtx *ctx, RedisModuleString **argv, int argc)
 | 
			
		|||
    RedisModule_StringToLongLong(argv[1], &noself);
 | 
			
		||||
 | 
			
		||||
    if (RedisModule_CreateCommand(ctx,log_command_name,
 | 
			
		||||
                HelloFilter_LogCommand,"write deny-oom",1,1,1) == REDISMODULE_ERR)
 | 
			
		||||
                CommandFilter_LogCommand,"write deny-oom",1,1,1) == REDISMODULE_ERR)
 | 
			
		||||
            return REDISMODULE_ERR;
 | 
			
		||||
 | 
			
		||||
    if (RedisModule_CreateCommand(ctx,ping_command_name,
 | 
			
		||||
                HelloFilter_PingCommand,"deny-oom",1,1,1) == REDISMODULE_ERR)
 | 
			
		||||
                CommandFilter_PingCommand,"deny-oom",1,1,1) == REDISMODULE_ERR)
 | 
			
		||||
            return REDISMODULE_ERR;
 | 
			
		||||
 | 
			
		||||
    if (RedisModule_CreateCommand(ctx,unregister_command_name,
 | 
			
		||||
                HelloFilter_UnregisterCommand,"write deny-oom",1,1,1) == REDISMODULE_ERR)
 | 
			
		||||
                CommandFilter_UnregisterCommand,"write deny-oom",1,1,1) == REDISMODULE_ERR)
 | 
			
		||||
            return REDISMODULE_ERR;
 | 
			
		||||
 | 
			
		||||
    if ((filter = RedisModule_RegisterCommandFilter(ctx, HelloFilter_CommandFilter, 
 | 
			
		||||
    if ((filter = RedisModule_RegisterCommandFilter(ctx, CommandFilter_CommandFilter, 
 | 
			
		||||
                    noself ? REDISMODULE_CMDFILTER_NOSELF : 0))
 | 
			
		||||
            == NULL) return REDISMODULE_ERR;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -63,7 +63,6 @@ set ::all_tests {
 | 
			
		|||
    unit/lazyfree
 | 
			
		||||
    unit/wait
 | 
			
		||||
    unit/pendingquerybuf
 | 
			
		||||
    modules/commandfilter
 | 
			
		||||
}
 | 
			
		||||
# Index to the next test to run in the ::all_tests list.
 | 
			
		||||
set ::next_test 0
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,4 +1,4 @@
 | 
			
		|||
set testmodule [file normalize src/modules/hellofilter.so]
 | 
			
		||||
set testmodule [file normalize tests/modules/commandfilter.so]
 | 
			
		||||
 | 
			
		||||
start_server {tags {"modules"}} {
 | 
			
		||||
    r module load $testmodule log-key 0
 | 
			
		||||
| 
						 | 
				
			
			@ -27,7 +27,7 @@ start_server {tags {"modules"}} {
 | 
			
		|||
 | 
			
		||||
    test {Command Filter applies on RM_Call() commands} {
 | 
			
		||||
        r del log-key
 | 
			
		||||
        r hellofilter.ping
 | 
			
		||||
        r commandfilter.ping
 | 
			
		||||
        r lrange log-key 0 -1
 | 
			
		||||
    } "{ping @log}"
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -39,13 +39,13 @@ start_server {tags {"modules"}} {
 | 
			
		|||
 | 
			
		||||
    test {Command Filter applies on Lua redis.call() that calls a module} {
 | 
			
		||||
        r del log-key
 | 
			
		||||
        r eval "redis.call('hellofilter.ping')" 0
 | 
			
		||||
        r eval "redis.call('commandfilter.ping')" 0
 | 
			
		||||
        r lrange log-key 0 -1
 | 
			
		||||
    } "{ping @log}"
 | 
			
		||||
 | 
			
		||||
    test {Command Filter is unregistered implicitly on module unload} {
 | 
			
		||||
        r del log-key
 | 
			
		||||
        r module unload hellofilter
 | 
			
		||||
        r module unload commandfilter
 | 
			
		||||
        r set mykey @log
 | 
			
		||||
        r lrange log-key 0 -1
 | 
			
		||||
    } {}
 | 
			
		||||
| 
						 | 
				
			
			@ -59,14 +59,14 @@ start_server {tags {"modules"}} {
 | 
			
		|||
        assert_equal "{set mykey @log}" [r lrange log-key 0 -1]
 | 
			
		||||
 | 
			
		||||
        # Unregister
 | 
			
		||||
        r hellofilter.unregister
 | 
			
		||||
        r commandfilter.unregister
 | 
			
		||||
        r del log-key
 | 
			
		||||
 | 
			
		||||
        r set mykey @log
 | 
			
		||||
        r lrange log-key 0 -1
 | 
			
		||||
    } {}
 | 
			
		||||
 | 
			
		||||
    r module unload hellofilter
 | 
			
		||||
    r module unload commandfilter
 | 
			
		||||
    r module load $testmodule log-key 1
 | 
			
		||||
 | 
			
		||||
    test {Command Filter REDISMODULE_CMDFILTER_NOSELF works as expected} {
 | 
			
		||||
| 
						 | 
				
			
			@ -74,10 +74,10 @@ start_server {tags {"modules"}} {
 | 
			
		|||
        assert_equal "{set mykey @log}" [r lrange log-key 0 -1]
 | 
			
		||||
 | 
			
		||||
        r del log-key
 | 
			
		||||
        r hellofilter.ping
 | 
			
		||||
        r commandfilter.ping
 | 
			
		||||
        assert_equal {} [r lrange log-key 0 -1]
 | 
			
		||||
 | 
			
		||||
        r eval "redis.call('hellofilter.ping')" 0
 | 
			
		||||
        r eval "redis.call('commandfilter.ping')" 0
 | 
			
		||||
        assert_equal {} [r lrange log-key 0 -1]
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue