static const struct gensec_security_ops *gensec_security_by_name(struct gensec_security *gensec_security, const char *name) { int i; struct gensec_security_ops **backends; const struct gensec_security_ops *backend; TALLOC_CTX *mem_ctx = talloc_new(gensec_security); if (!mem_ctx) { return NULL; } backends = gensec_security_mechs(gensec_security, mem_ctx); for (i=0; backends && backends[i]; i++) { if (gensec_security != NULL && !gensec_security_ops_enabled(backends[i], gensec_security)) continue; if (backends[i]->name && (strcmp(backends[i]->name, name) == 0)) { backend = backends[i]; talloc_free(mem_ctx); return backend; } } talloc_free(mem_ctx); return NULL; }
const struct gensec_security_ops *gensec_security_by_oid(struct gensec_security *gensec_security, const char *oid_string) { int i, j; struct gensec_security_ops **backends; const struct gensec_security_ops *backend; TALLOC_CTX *mem_ctx = talloc_new(gensec_security); if (!mem_ctx) { return NULL; } backends = gensec_security_mechs(gensec_security, mem_ctx); for (i=0; backends && backends[i]; i++) { if (gensec_security != NULL && !gensec_security_ops_enabled(backends[i], gensec_security)) continue; if (backends[i]->oid) { for (j=0; backends[i]->oid[j]; j++) { if (backends[i]->oid[j] && (strcmp(backends[i]->oid[j], oid_string) == 0)) { backend = backends[i]; talloc_free(mem_ctx); return backend; } } } } talloc_free(mem_ctx); return NULL; }
static const struct gensec_security_ops *gensec_security_by_authtype(struct gensec_security *gensec_security, uint8_t auth_type) { int i; struct gensec_security_ops **backends; const struct gensec_security_ops *backend; TALLOC_CTX *mem_ctx = talloc_new(gensec_security); if (!mem_ctx) { return NULL; } backends = gensec_security_mechs(gensec_security, mem_ctx); for (i=0; backends && backends[i]; i++) { if (backends[i]->auth_type == auth_type) { backend = backends[i]; talloc_free(mem_ctx); return backend; } } talloc_free(mem_ctx); return NULL; }
const struct gensec_security_ops *gensec_security_by_sasl_name(struct gensec_security *gensec_security, const char *sasl_name) { int i; struct gensec_security_ops **backends; const struct gensec_security_ops *backend; TALLOC_CTX *mem_ctx = talloc_new(gensec_security); if (!mem_ctx) { return NULL; } backends = gensec_security_mechs(gensec_security, mem_ctx); for (i=0; backends && backends[i]; i++) { if (backends[i]->sasl_name && (strcmp(backends[i]->sasl_name, sasl_name) == 0)) { backend = backends[i]; talloc_free(mem_ctx); return backend; } } talloc_free(mem_ctx); return NULL; }
const struct gensec_security_ops_wrapper *gensec_security_by_oid_list(struct gensec_security *gensec_security, TALLOC_CTX *mem_ctx, const char **oid_strings, const char *skip) { struct gensec_security_ops_wrapper *backends_out; struct gensec_security_ops **backends; int i, j, k, oid_idx; int num_backends_out = 0; if (!oid_strings) { return NULL; } backends = gensec_security_mechs(gensec_security, gensec_security); backends_out = talloc_array(mem_ctx, struct gensec_security_ops_wrapper, 1); if (!backends_out) { return NULL; } backends_out[0].op = NULL; backends_out[0].oid = NULL; /* Find backends in our preferred order, by walking our list, * then looking in the supplied list */ for (i=0; backends && backends[i]; i++) { if (gensec_security != NULL && !gensec_security_ops_enabled(backends[i], gensec_security)) continue; if (!backends[i]->oid) { continue; } for (oid_idx = 0; oid_strings[oid_idx]; oid_idx++) { if (strcmp(oid_strings[oid_idx], skip) == 0) { continue; } for (j=0; backends[i]->oid[j]; j++) { if (!backends[i]->oid[j] || !(strcmp(backends[i]->oid[j], oid_strings[oid_idx]) == 0)) { continue; } for (k=0; backends_out[k].op; k++) { if (backends_out[k].op == backends[i]) { break; } } if (k < num_backends_out) { /* already in there */ continue; } backends_out = talloc_realloc(mem_ctx, backends_out, struct gensec_security_ops_wrapper, num_backends_out + 2); if (!backends_out) { return NULL; } backends_out[num_backends_out].op = backends[i]; backends_out[num_backends_out].oid = backends[i]->oid[j]; num_backends_out++; backends_out[num_backends_out].op = NULL; backends_out[num_backends_out].oid = NULL; } } } return backends_out; }