X-Git-Url: http://www.project-moonshot.org/gitweb/?a=blobdiff_plain;f=json_gssapi%2Fsrc%2FGSSCreateSecContextCommand.cpp;h=7e35b4599ba5889739ffd144d504456a82d9d142;hb=422cdc24e7417925af7572253ae78020146e6f29;hp=94719d12b2384015086b5c23ec182d4a62ca5f14;hpb=9313e0be56ac9b97709acf61388bcd4c94197162;p=gssweb.git diff --git a/json_gssapi/src/GSSCreateSecContextCommand.cpp b/json_gssapi/src/GSSCreateSecContextCommand.cpp index 94719d1..7e35b45 100644 --- a/json_gssapi/src/GSSCreateSecContextCommand.cpp +++ b/json_gssapi/src/GSSCreateSecContextCommand.cpp @@ -6,6 +6,7 @@ */ #include "GSSCreateSecContextCommand.h" +#include "GSSException.h" #include #include #include @@ -27,10 +28,10 @@ typedef OM_uint32 (*init_sec_context)( ); /* Helper function - import the OID from a string */ -gss_OID str_to_oid(const char *mech_type_str = NULL) +static gss_OID str_to_oid(const char *mech_type_str = NULL) { /* Variables */ - gss_buffer_t gssbuffOID; + gss_buffer_desc gssbuffOID; gss_OID gssoidTargetOID; OM_uint32 major; OM_uint32 minor; @@ -41,19 +42,16 @@ gss_OID str_to_oid(const char *mech_type_str = NULL) return NULL; /* Setup */ - gssbuffOID = (gss_buffer_t)malloc(sizeof(gss_buffer_desc_struct)); - /* Main */ - gssbuffOID->value = (void *)(mech_type_str); - gssbuffOID->length = strlen(mech_type_str); + gssbuffOID.value = (void *)(mech_type_str); + gssbuffOID.length = strlen(mech_type_str); major = gss_str_to_oid(&minor, - gssbuffOID, + &gssbuffOID, &gssoidTargetOID); if (major != GSS_S_COMPLETE) - throw "Error converting string to OID: " + minor; + throw GSSException("Error converting string to OID", major, minor); /* Cleanup */ - free(gssbuffOID); /* Return */ return gssoidTargetOID; @@ -62,10 +60,16 @@ gss_OID str_to_oid(const char *mech_type_str = NULL) void GSSCreateSecContextCommand::execute() { + /* Variables */ init_sec_context fn = (init_sec_context)function; - input_token = GSS_C_NO_BUFFER; - output_token = (gss_buffer_t)malloc(sizeof(gss_buffer_desc)); + /* Error checking */ + + /* Setup */ + if (output_token.length > 0) + retVal = gss_release_buffer(&minor_status, &output_token); + + /* Main */ retVal = fn( &minor_status, @@ -76,17 +80,21 @@ GSSCreateSecContextCommand::execute() req_flags, time_req, GSS_C_NO_CHANNEL_BINDINGS, - input_token, + &input_token, &actual_mech_type, - output_token, + &output_token, &ret_flags, &time_rec); + + /* Cleanup */ + + /* Return */ } const char* GSSCreateSecContextCommand::getTargetDisplayName() { /* Variables */ - gss_buffer_t output_name; + gss_buffer_desc output_name; gss_OID output_type; OM_uint32 major, minor; const char *ret; @@ -94,46 +102,50 @@ const char* GSSCreateSecContextCommand::getTargetDisplayName() /* error checking */ /* Setup */ - output_name = (gss_buffer_t)malloc(sizeof(gss_buffer_desc_struct)); - output_type = (gss_OID)malloc(sizeof(gss_OID_desc_struct)); /* Main */ - major = gss_display_name(&minor, target_name, output_name, &output_type); + major = gss_display_name(&minor, target_name, &output_name, &output_type); if (major == GSS_S_COMPLETE) - ret = (const char *)output_name->value; + ret = (const char *)output_name.value; else ret = NULL; /* cleanup */ - free(output_name); - free(output_type); /* return */ - return( (char *)(output_name->value) ); + return( ret ); +} + +const char* GSSCreateSecContextCommand::getActualMechType() +{ + return(this->oidToStr(this->actual_mech_type)); } const char* GSSCreateSecContextCommand::getMechType() { - gss_buffer_t output; + return(this->oidToStr(this->mech_type)); +} + +const char* GSSCreateSecContextCommand::oidToStr(gss_OID oid) +{ + gss_buffer_desc output; OM_uint32 major, minor; const char *retVal; /* error checking */ - if (mech_type == NULL) + if (oid == NULL) return NULL; /* Setup */ - output = (gss_buffer_t)malloc(sizeof(gss_buffer_desc_struct)); /* main */ - major = gss_oid_to_str(&minor, mech_type, output); + major = gss_oid_to_str(&minor, oid, &output); if (major == GSS_S_COMPLETE) - retVal = (const char *)output->value; + retVal = (const char *)output.value; else retVal = NULL; /* cleanup */ - free(output); /* return */ return( retVal ); @@ -143,51 +155,47 @@ bool GSSCreateSecContextCommand::loadParameters(JSONObject *params) { /* Variables */ OM_uint32 major, minor; - gss_buffer_t gssbuffTargetName; + gss_buffer_desc gssbuffTargetName; const char *buffer; /* Error checking */ - // Should I zeroOut? /* Setup */ + // Should I zeroOut? /* Main processing */ - // Easy stuff - this->time_req = (OM_uint32)( (*params)["time_req"].integer() ); - this->req_flags = (OM_uint32)( (*params)["req_flags"].integer() ); + // Easy stuff(*params) + this->time_req = (OM_uint32)( (*params)["arguments"]["time_req"].integer() ); + this->req_flags = (OM_uint32)( (*params)["arguments"]["req_flags"].integer() ); // context_handle // -- just treat the value passed in as correct. - context_handle = (gss_ctx_id_t)( (*params)["context_handle"].integer() ); + context_handle = (gss_ctx_id_t)( (*params)["arguments"]["context_handle"].integer() ); // target_name - buffer = (*params)["target_name"].string(); + buffer = (*params)["arguments"]["target_name"].string(); if (buffer != NULL && *buffer != 0) { - gssbuffTargetName = (gss_buffer_t)malloc(sizeof(gss_buffer_desc_struct)); - gssbuffTargetName->value = (void *)buffer; - gssbuffTargetName->length = strlen( buffer ); + gssbuffTargetName.value = (void *)buffer; + gssbuffTargetName.length = strlen( buffer ); major = gss_import_name(&minor, - gssbuffTargetName, + &gssbuffTargetName, GSS_C_NO_OID, &target_name); if (major != GSS_S_COMPLETE) - throw "Error importing target_name: " + minor; - - free(gssbuffTargetName); + throw GSSException("Error importing target_name", major, minor); } // mech_type - mech_type = str_to_oid( (*params)["mech_type"].string() ); + mech_type = str_to_oid( (*params)["arguments"]["mech_type"].string() ); // input_token - buffer = (*params)["input_token"].string(); + buffer = (*params)["arguments"]["input_token"].string(); if (buffer != NULL && *buffer != 0) { - this->input_token = (gss_buffer_t)malloc(sizeof(gss_buffer_desc_struct)); - this->input_token->value = (void *)buffer; - this->input_token->length = strlen(buffer); + this->input_token.value = (void *)buffer; + this->input_token.length = strlen(buffer); } /* Cleanup */ @@ -202,18 +210,16 @@ bool GSSCreateSecContextCommand::zeroOut(bool initialized) /* Error checking */ /* Variables */ OM_uint32 minor; - gss_buffer_t output; + gss_buffer_desc output; /* Setup */ - output = (gss_buffer_t)malloc(sizeof(gss_buffer_desc_struct)); - /* Main */ // Free up existing memory if it's been set. if (initialized) { if (this->context_handle != NULL) - gss_delete_sec_context(&minor, &(this->context_handle), output); + gss_delete_sec_context(&minor, &(this->context_handle), &output); if (this->target_name != NULL) gss_release_name(&minor, &(this->target_name)); @@ -221,20 +227,14 @@ bool GSSCreateSecContextCommand::zeroOut(bool initialized) if (mech_type != NULL) gss_release_oid(&minor, &(this->mech_type)); - if (this->input_token != NULL) - { - gss_release_buffer(&minor, this->input_token); - free(this->input_token); - } - if (this->actual_mech_type != NULL) gss_release_oid(&minor, &(this->actual_mech_type)); - - if (this->output_token != NULL) - { - gss_release_buffer(&minor, this->output_token); - free( this->output_token ); - } + + if (this->output_token.length > 0) + gss_release_buffer(&minor, &output_token); + + if (this->input_token.length > 0) + gss_release_buffer(&minor, &input_token); } // Now set things to reasonable defaults @@ -248,18 +248,44 @@ bool GSSCreateSecContextCommand::zeroOut(bool initialized) this->context_handle = GSS_C_NO_CONTEXT; this->target_name = GSS_C_NO_NAME; mech_type = str_to_oid( "{ 1 2 840 113554 1 2 1 4 }" ); - this->input_token = GSS_C_NO_BUFFER; + this->input_token.length = 0; + this->input_token.value = NULL; this->actual_mech_type = GSS_C_NO_OID; - this->output_token = GSS_C_NO_BUFFER; - memset((void *)&(this->parameters), 0, sizeof(JSONObject)); + this->output_token.length = 0; + this->output_token.value = NULL; /* Cleanup */ - free(output); - /* Return */ return(true); } +JSONObject *GSSCreateSecContextCommand::toJSON() +{ + /* Variables */ + JSONObject *ret = new JSONObject(); + JSONObject *values = new JSONObject(); + + /* Error checking */ + + /* Setup */ + + /* Main */ + values->set("major_status", this->retVal); + values->set("minor_status", this->minor_status); + values->set("context_handle", (json_int_t)0); + values->set("actual_mech_type", this->getActualMechType()); + values->set("output_token", (const char *)this->output_token.value); + values->set("ret_flags", this->ret_flags); + values->set("time_rec", this->time_rec); + ret->set("command", "gss_init_sec_context"); + ret->set("return_values", *values); + + /* Cleanup */ + + /* Return */ + return(ret); +} + GSSCreateSecContextCommand::GSSCreateSecContextCommand( JSONObject *params, void *fn) : GSSCommand(params, fn) @@ -271,4 +297,5 @@ GSSCreateSecContextCommand::GSSCreateSecContextCommand( GSSCreateSecContextCommand::GSSCreateSecContextCommand(void *fn) : GSSCommand(fn) { zeroOut(false); -} \ No newline at end of file +} +