From b07a1ceff70b4097ed6844f38732c367154aa188 Mon Sep 17 00:00:00 2001 From: Jeff Darcy Date: Wed, 18 Aug 2010 17:00:14 -0400 Subject: [PATCH] Added config fetch and credential update. --- notes.txt | 3 ++- proxy.c | 26 ++++++++++++++++++++++++++ proxy.h | 2 ++ rest.c | 64 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 94 insertions(+), 1 deletion(-) diff --git a/notes.txt b/notes.txt index 036b0eb..ed20a33 100644 --- a/notes.txt +++ b/notes.txt @@ -158,11 +158,11 @@ To Do - priority (1 highest) work (5 largest) desc: 2 2 manual re-replication trigger 2 1 re-replicate on *any* tag change 2 3 replication-complete API + 2 5 basic cred-management API --- done 2 1 start own MongoDB 2 2 reverse-replication API 2 3 content types - 2 5 dynamic config (includes cred mgmt) 2 5 reconcile dispatch with commands/format above 3 5 fully modular FS/S3/CF driver structure 3 5 VMWare back end @@ -170,6 +170,7 @@ To Do - priority (1 highest) work (5 largest) desc: 3 5 RHEV back end (dependency on Ayal) * Mark McLoughlin / Eoghan Glynn / rhevm-api 3 5 start own Hail + 3 5 fully dynamic config 3 3 fix string handling (eliminate strtok) 3 4 re-replicate on policy change (default) 3 4 writes proxied upstream diff --git a/proxy.c b/proxy.c index e5f9be6..d8e9501 100644 --- a/proxy.c +++ b/proxy.c @@ -689,3 +689,29 @@ get_provider (int i, provider_t *out) return 1; } +void +update_provider (char *provider, char *username, char *password) +{ + int i; + json_t *server; + const char *s_name; + + DPRINTF("updating %s username=%s password=%s\n", + provider, username, password); + + for (i = 0; ; ++i) { + server = json_array_get(config,i); + if (!server) { + DPRINTF(" could not find provider %s\n",provider); + break; + } + s_name = json_string_value(json_object_get(server,"name")); + DPRINTF(" checking %s\n",s_name); + if (s_name && !strcmp(s_name,provider)) { + json_object_set(server,"key",json_string(username)); + json_object_set(server,"secret",json_string(password)); + break; + } + } +} + diff --git a/proxy.h b/proxy.h index ac66a8f..e769651 100644 --- a/proxy.h +++ b/proxy.h @@ -12,4 +12,6 @@ void repl_init (void); void replicate (char *url, size_t size, char *policy); void replicate_delete (char *url); int get_provider (int i, provider_t *out); +void update_provider (char *provider, + char *username, char *password); diff --git a/rest.c b/rest.c index d8dc073..a88ce77 100644 --- a/rest.c +++ b/rest.c @@ -1536,6 +1536,68 @@ proxy_list_provs (void *cctx, struct MHD_Connection *conn, const char *url, return MHD_YES; } +int +prov_iterator (void *ctx, enum MHD_ValueKind kind, const char *key, + const char *filename, const char *content_type, + const char *transfer_encoding, const char *data, + uint64_t off, size_t size) +{ + g_hash_table_insert(ctx,strdup(key),strndup(data,size)); + /* TBD: check return value for strdups (none avail for insert) */ + return MHD_YES; +} + + +int +proxy_update_prov (void *cctx, struct MHD_Connection *conn, const char *url, + const char *method, const char *version, const char *data, + size_t *data_size, void **rctx) +{ + struct MHD_Response *resp; + my_state *ms = *rctx; + int rc; + char *provider; + char *username; + char *password; + + if (ms->state == MS_NEW) { + ms->state = MS_NORMAL; + ms->url = (char *)url; + ms->dict = g_hash_table_new_full( + g_str_hash,g_str_equal,free,free); + ms->post = MHD_create_post_processor(conn,4096, + prov_iterator,ms->dict); + } + else if (*data_size) { + MHD_post_process(ms->post,data,*data_size); + *data_size = 0; + } + else { + rc = MHD_HTTP_BAD_REQUEST; + provider = g_hash_table_lookup(ms->dict,"provider"); + username = g_hash_table_lookup(ms->dict,"username"); + password = g_hash_table_lookup(ms->dict,"password"); + if (provider && username && password) { + update_provider(provider,username,password); + rc = MHD_HTTP_OK; + } + else { + DPRINTF("provider/username/password MISSING\n"); + } + g_hash_table_destroy(ms->dict); + resp = MHD_create_response_from_data(0,NULL,MHD_NO,MHD_NO); + if (!resp) { + fprintf(stderr,"MHD_crfd failed\n"); + return MHD_NO; + } + MHD_queue_response(conn,rc,resp); + MHD_destroy_response(resp); + } + + return MHD_YES; +} + + rule proxy_rules[] = { { /* get bucket list */ "GET", URL_ROOT, proxy_api_root }, @@ -1561,6 +1623,8 @@ rule proxy_rules[] = { "DELETE", URL_ATTR, NULL }, { /* get provider list */ "GET", URL_PROVLIST, proxy_list_provs }, + { /* update a provider */ + "POST", URL_PROVLIST, proxy_update_prov }, {} }; -- 2.11.4.GIT