*/
#include "GSSCreateSecContextCommand.h"
+#include "GSSException.h"
#include <gssapi.h>
#include <stdlib.h>
#include <string.h>
);
/* 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;
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;
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,
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;
/* 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 );
{
/* 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 */
/* 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));
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
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)
GSSCreateSecContextCommand::GSSCreateSecContextCommand(void *fn) : GSSCommand(fn)
{
zeroOut(false);
-}
\ No newline at end of file
+}
+