JSON Marshalling, updates from code review
[gssweb.git] / json_gssapi / src / GSSCreateSecContextCommand.cpp
index 94719d1..7e35b45 100644 (file)
@@ -6,6 +6,7 @@
  */
 
 #include "GSSCreateSecContextCommand.h"
+#include "GSSException.h"
 #include <gssapi.h>
 #include <stdlib.h>
 #include <string.h>
@@ -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
+}
+