diff options
author | Simo Sorce <ssorce@redhat.com> | 2009-04-06 15:54:00 -0400 |
---|---|---|
committer | Simo Sorce <ssorce@redhat.com> | 2009-04-07 14:27:18 -0400 |
commit | 65f90758d4df5581bc94746d47a1548ed8ff738b (patch) | |
tree | 754b1c1ae79db7d74190b69f69d10405f445d111 /server/responder/common | |
parent | 1e13ce7e631f8e5ab0de0b5d1abaa6496259a552 (diff) | |
download | sssd-65f90758d4df5581bc94746d47a1548ed8ff738b.tar.gz sssd-65f90758d4df5581bc94746d47a1548ed8ff738b.tar.bz2 sssd-65f90758d4df5581bc94746d47a1548ed8ff738b.zip |
Unify name parsing and reposnder headers
Use common sss_parse_name function in all responders
Simplify responder headers by combining common,cmd,dp in one header and
add name parse structure as part of the common responder context.
Diffstat (limited to 'server/responder/common')
-rw-r--r-- | server/responder/common/responder.h (renamed from server/responder/common/responder_cmd.h) | 38 | ||||
-rw-r--r-- | server/responder/common/responder_cmd.c | 2 | ||||
-rw-r--r-- | server/responder/common/responder_common.c | 136 | ||||
-rw-r--r-- | server/responder/common/responder_common.h | 26 | ||||
-rw-r--r-- | server/responder/common/responder_dp.c | 2 | ||||
-rw-r--r-- | server/responder/common/responder_dp.h | 3 |
6 files changed, 147 insertions, 60 deletions
diff --git a/server/responder/common/responder_cmd.h b/server/responder/common/responder.h index eb3bd082..4b6bfeee 100644 --- a/server/responder/common/responder_cmd.h +++ b/server/responder/common/responder.h @@ -19,14 +19,17 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. */ -#ifndef __SSSSRV_CMD_H__ -#define __SSSSRV_CMD_H__ +#ifndef __SSS_RESPONDER_H__ +#define __SSS_RESPONDER_H__ #include <stdint.h> #include <sys/un.h> +#include <pcre.h> +#include "config.h" #include "talloc.h" #include "tevent.h" #include "ldb.h" +#include "sbus/sssd_dbus.h" #include "../sss_client/sss_cli.h" #include "util/btreemap.h" @@ -40,6 +43,13 @@ struct cli_request { struct sss_packet *out; }; +struct sss_names_ctx { + char *re_pattern; + char *fq_fmt; + + pcre *re; +}; + struct resp_ctx { struct tevent_context *ev; struct tevent_fd *lfde; @@ -62,6 +72,8 @@ struct resp_ctx { const char *confdb_service_path; struct sbus_method *dp_methods; + struct sss_names_ctx *names; + void *pvt_ctx; }; @@ -80,8 +92,28 @@ struct sss_cmd_table { int (*fn)(struct cli_ctx *cctx); }; +/* responder_common.c */ +int sss_process_init(TALLOC_CTX *mem_ctx, + struct tevent_context *ev, + struct confdb_ctx *cdb, + struct sbus_method sss_sbus_methods[], + struct sss_cmd_table sss_cmds[], + const char *sss_pipe_name, + const char *sss_priv_pipe_name, + const char *confdb_service_path, + struct sbus_method dp_methods[], + struct resp_ctx **responder_ctx); + +int sss_parse_name(TALLOC_CTX *memctx, + struct sss_names_ctx *snctx, + const char *orig, char **domain, char **name); + +/* responder_cmd.c */ int sss_cmd_execute(struct cli_ctx *cctx, struct sss_cmd_table *sss_cmds); void sss_cmd_done(struct cli_ctx *cctx, void *freectx); int sss_cmd_get_version(struct cli_ctx *cctx); -#endif /* __SSSSRV_CMD_H__ */ +/* responder_dp.c */ +int sss_dp_init(struct resp_ctx *rctx, struct sbus_method dp_methods[]); + +#endif /* __SSS_RESPONDER_H__ */ diff --git a/server/responder/common/responder_cmd.c b/server/responder/common/responder_cmd.c index a434b3e1..33caa032 100644 --- a/server/responder/common/responder_cmd.c +++ b/server/responder/common/responder_cmd.c @@ -20,7 +20,7 @@ */ #include <errno.h> #include "util/util.h" -#include "responder/common/responder_cmd.h" +#include "responder/common/responder.h" #include "responder/common/responder_packet.h" diff --git a/server/responder/common/responder_common.c b/server/responder/common/responder_common.c index fa024d53..855c78a7 100644 --- a/server/responder/common/responder_common.c +++ b/server/responder/common/responder_common.c @@ -36,15 +36,15 @@ #include "dbus/dbus.h" #include "sbus/sssd_dbus.h" #include "util/btreemap.h" -#include "responder/common/responder_common.h" +#include "responder/common/responder.h" #include "responder/common/responder_packet.h" -#include "responder/common/responder_cmd.h" -#include "responder/common/responder_dp.h" #include "providers/data_provider.h" #include "monitor/monitor_sbus.h" #include "monitor/monitor_interfaces.h" #include "sbus/sbus_client.h" +#define NAMES_CONFIG "config/names" + static void set_nonblocking(int fd) { unsigned v; @@ -487,6 +487,62 @@ done: return retval; } +int sss_names_init(struct resp_ctx *rctx) +{ + struct sss_names_ctx *ctx; + const char *errstr; + int errval; + int errpos; + int ret; + + ctx = talloc_zero(rctx, struct sss_names_ctx); + if (!ctx) return ENOMEM; + + ret = confdb_get_string(rctx->cdb, ctx, NAMES_CONFIG, + "re-expression", NULL, &ctx->re_pattern); + if (ret != EOK) goto done; + + if (!ctx->re_pattern) { + ctx->re_pattern = talloc_strdup(ctx, + "(?<name>[^@]+)@?(?<domain>[^@]*$)"); + if (!ctx->re_pattern) { + ret = ENOMEM; + goto done; + } + } + + ret = confdb_get_string(rctx->cdb, ctx, NAMES_CONFIG, + "full-name-format", NULL, &ctx->fq_fmt); + if (ret != EOK) goto done; + + if (!ctx->fq_fmt) { + ctx->fq_fmt = talloc_strdup(ctx, "%1$s@%2$s"); + if (!ctx->fq_fmt) { + ret = ENOMEM; + goto done; + } + } + + ctx->re = pcre_compile2(ctx->re_pattern, + PCRE_DUPNAMES | PCRE_EXTENDED, + &errval, &errstr, &errpos, NULL); + if (!ctx->re) { + DEBUG(1, ("Invalid Regular Expression pattern at position %d." + " (Error: %d [%s])\n", errpos, errval, errstr)); + ret = EFAULT; + goto done; + } + + rctx->names = ctx; + ret = EOK; + +done: + if (ret != EOK) { + talloc_free(ctx); + } + return ret; +} + int sss_process_init(TALLOC_CTX *mem_ctx, struct tevent_context *ev, struct confdb_ctx *cdb, @@ -539,6 +595,12 @@ int sss_process_init(TALLOC_CTX *mem_ctx, return ret; } + ret = sss_names_init(rctx); + if (ret != EOK) { + DEBUG(0, ("fatal error initializing regex data\n")); + return ret; + } + /* after all initializations we are ready to listen on our socket */ ret = set_unix_socket(rctx); if (ret != EOK) { @@ -553,33 +615,55 @@ int sss_process_init(TALLOC_CTX *mem_ctx, } int sss_parse_name(TALLOC_CTX *memctx, - const char *fullname, - struct btreemap *domain_map, - const char **domain, const char **name) { - char *delim; - struct btreemap *node; - int ret; + struct sss_names_ctx *snctx, + const char *orig, char **domain, char **name) +{ + pcre *re = snctx->re; + const char *result; + int ovec[30]; + int origlen; + int ret, strnum; - if ((delim = strchr(fullname, SSS_DOMAIN_DELIM)) != NULL) { - - /* Check for registered domain */ - ret = btreemap_search_key(domain_map, (void *)(delim+1), &node); - if (ret != BTREEMAP_FOUND) { - /* No such domain was registered. Return EINVAL. - * TODO: alternative approach? - * Alternatively, we could simply fail down to - * below, treating the entire construct as the - * full name if the domain is unspecified. - */ - return EINVAL; - } + origlen = strlen(orig); + + ret = pcre_exec(re, NULL, orig, origlen, 0, PCRE_NOTEMPTY, ovec, 30); + if (ret < 0) { + DEBUG(2, ("PCRE Matching error, %d\n", ret)); + return EINVAL; + } - *name = talloc_strndup(memctx, fullname, delim-fullname); - *domain = talloc_strdup(memctx, delim+1); + if (ret == 0) { + DEBUG(1, ("Too many matches, the pattern is invalid.\n")); } - else { - *name = talloc_strdup(memctx, fullname); + + strnum = ret; + + result = NULL; + ret = pcre_get_named_substring(re, orig, ovec, strnum, "name", &result); + if (ret < 0 || !result) { + DEBUG(2, ("Name not found!\n")); + return EINVAL; + } + *name = talloc_strdup(memctx, result); + pcre_free_substring(result); + if (!*name) return ENOMEM; + + + result = NULL; + ret = pcre_get_named_substring(re, orig, ovec, strnum, "domain", &result); + if (ret < 0 || !result) { + DEBUG(4, ("Domain not provided!\n")); *domain = NULL; + } else { + /* ignore "" string */ + if (*result) { + *domain = talloc_strdup(memctx, result); + pcre_free_substring(result); + if (!*domain) return ENOMEM; + } else { + pcre_free_substring(result); + *domain = NULL; + } } return EOK; diff --git a/server/responder/common/responder_common.h b/server/responder/common/responder_common.h deleted file mode 100644 index 8a7af08a..00000000 --- a/server/responder/common/responder_common.h +++ /dev/null @@ -1,26 +0,0 @@ -#include "config.h" -#include "sbus/sssd_dbus.h" -#include "responder/common/responder_cmd.h" -#include "util/btreemap.h" - -/* SSS_DOMAIN_DELIM can be specified in config.h */ -#ifndef SSS_DOMAIN_DELIM -#define SSS_DOMAIN_DELIM '@' -#endif - - -int sss_process_init(TALLOC_CTX *mem_ctx, - struct tevent_context *ev, - struct confdb_ctx *cdb, - struct sbus_method sss_sbus_methods[], - struct sss_cmd_table sss_cmds[], - const char *sss_pipe_name, - const char *sss_priv_pipe_name, - const char *confdb_service_path, - struct sbus_method dp_methods[], - struct resp_ctx **responder_ctx); - -int sss_parse_name(TALLOC_CTX *memctx, - const char *fullname, - struct btreemap *domain_map, - const char **domain, const char **name); diff --git a/server/responder/common/responder_dp.c b/server/responder/common/responder_dp.c index 937b48dc..7fc7e0b3 100644 --- a/server/responder/common/responder_dp.c +++ b/server/responder/common/responder_dp.c @@ -3,7 +3,7 @@ #include <time.h> #include "util/util.h" #include "responder/common/responder_packet.h" -#include "responder/common/responder_common.h" +#include "responder/common/responder.h" #include "providers/data_provider.h" #include "sbus/sbus_client.h" #include "providers/dp_sbus.h" diff --git a/server/responder/common/responder_dp.h b/server/responder/common/responder_dp.h deleted file mode 100644 index 528490fc..00000000 --- a/server/responder/common/responder_dp.h +++ /dev/null @@ -1,3 +0,0 @@ -#include "sbus/sssd_dbus.h" - -int sss_dp_init(struct resp_ctx *rctx, struct sbus_method dp_methods[]); |