Basic name importing working
authorMark Donnelly <mark@painless-security.com>
Tue, 29 Apr 2014 15:23:40 +0000 (11:23 -0400)
committerMark Donnelly <mark@painless-security.com>
Tue, 29 Apr 2014 15:23:40 +0000 (11:23 -0400)
json_gssapi/src/GSSImportName.cpp
json_gssapi/src/GSSImportName.h
json_gssapi/src/datamodel/GSSBuffer.h
json_gssapi/src/datamodel/GSSName.cpp
json_gssapi/src/datamodel/GSSName.h
json_gssapi/src/datamodel/GSSOID.cpp
json_gssapi/src/datamodel/GSSOID.h
json_gssapi/test/CMakeLists.txt
json_gssapi/test/GSSImportNameTest.cpp
json_gssapi/test/MockImportName.cpp
json_gssapi/test/MockImportName.h

index 84e512d..feb9127 100644 (file)
@@ -6,10 +6,11 @@
  */
 
 #include "GSSImportName.h"
+#include "GSSException.h"
 
 void GSSImportName::execute()
 {
-
+  this->outputName = GSSName(inputName, inputNameType, function);
 }
 
 JSONObject *GSSImportName::toJSON()
@@ -42,8 +43,8 @@ bool GSSImportName::loadParameters(JSONObject *params)
   std::string input_name = (*params)["arguments"]["input_name"].string();
   std::string input_name_type = (*params)["arguments"]["input_name_type"].string();
   
-  this->inputName.setValue( (*params)["arguments"]["input_name"].string() );
-  this->inputNameType.setValue( (*params)["arguments"]["input_name_type"].string() );
+  this->inputName.setValue( input_name );
+  this->inputNameType.setValue( input_name_type );
   
   /* Cleanup */
   /* Return */
index 26d671f..9adea4d 100644 (file)
@@ -23,17 +23,22 @@ public:
   void execute();
   JSONObject* toJSON();
   
-  GSSBuffer getInputName() { return GSSBuffer(inputName); }
-  GSSBuffer getInputNameType() { return GSSBuffer(inputNameType); }
+  GSSBuffer getInputName() { return GSSBuffer(inputName); };
+  GSSOID getInputNameType() { return GSSOID(inputNameType); };
   
-  gss_imp_name_type getGSSFunction() { return function; }
+  gss_imp_name_type getGSSFunction() { return function; };
+  void setInputName ( std::string name ) { inputName.setValue(name); };
+  void setInputNameType ( std::string type ) { inputNameType.setValue(type); };
   
 private:
   gss_imp_name_type function;
   bool loadParameters(JSONObject *params);
+  
+  OM_uint32 retVal;
+  OM_uint32 minor_status;
   GSSBuffer inputName;
-  GSSBuffer inputNameType;
-
+  GSSOID    inputNameType;
+  GSSName   outputName;
 };
 
 #endif // GSSIMPORTNAME_H
index 2174431..ad95de3 100644 (file)
@@ -21,16 +21,16 @@ public:
   GSSBuffer(const GSSBuffer &other);
   ~GSSBuffer(void);
   
-  std::string toString() { return(std::string((char *)buf->value, buf->length)); }
-  gss_buffer_t toGss() { return( buf ); }
-  int length() { return(buf->length); }
+  std::string toString() const { return(std::string((char *)buf->value, buf->length)); }
+  gss_buffer_t toGss() const { return( buf ); }
+  int length() const { return(buf->length); }
   
   void setValue(std::string str);
   void setValue(char *str);
   void setValue(char *str, int len);
   void setValue(gss_buffer_t gssbuf);
   
-  bool operator==(GSSBuffer B) { return(this->toString() == B.toString()); }
+  bool operator==(GSSBuffer B) const { return(this->toString() == B.toString()); }
 
 private:
   gss_buffer_t buf;
index eb55aff..9260bf4 100644 (file)
@@ -8,14 +8,14 @@
 #include "GSSName.h"
 #include "../GSSException.h" 
 
-void GSSName::init(GSSBuffer namestr, GSSOID name_type, gss_imp_name_type fn)
+void GSSName::init(const GSSBuffer namestr, GSSOID name_type, gss_imp_name_type fn)
 {
   /* Variables */
   OM_uint32 major, minor;
   /* Error checking */
   /* Setup */
   /* Main */ 
-  major = gss_import_name(&minor, namestr.toGss(), name_type.toGss(), &name);
+  major = fn(&minor, namestr.toGss(), name_type.toGss(), &name);
   if ( GSS_ERROR(major) )
   {
     std::string errMsg;
@@ -23,7 +23,6 @@ void GSSName::init(GSSBuffer namestr, GSSOID name_type, gss_imp_name_type fn)
     errMsg += namestr.toString();
     throw GSSException(errMsg.c_str(), major, minor, name_type.toGss());
   }
-  this->function = fn;
   
   /* Cleanup */
   /* Return */
@@ -38,7 +37,7 @@ GSSName::GSSName(std::string namestr, GSSOID name_type, gss_imp_name_type fn)
 
 GSSName::GSSName(char *namestr,       GSSOID name_type, gss_imp_name_type fn)
 {
-  init(GSSBuffer(namestr), name_type, fn); 
+  init(GSSBuffer(namestr, true), name_type, fn); 
 }
 
 GSSName::GSSName(GSSBuffer namestr,   GSSOID name_type, gss_imp_name_type fn)
@@ -48,12 +47,12 @@ GSSName::GSSName(GSSBuffer namestr,   GSSOID name_type, gss_imp_name_type fn)
 
 GSSName::GSSName(std::string namestr, gss_OID name_type, gss_imp_name_type fn)
 {
-  init(GSSBuffer(namestr), GSSOID(name_type), fn); 
+  init(GSSBuffer(namestr, true), GSSOID(name_type), fn); 
 }
 
 GSSName::GSSName(char *namestr,       gss_OID name_type, gss_imp_name_type fn)
 {
-  init(GSSBuffer(namestr), GSSOID(name_type), fn); 
+  init(GSSBuffer(namestr, true), GSSOID(name_type), fn); 
 }
 
 GSSName::GSSName(GSSBuffer namestr,   gss_OID name_type, gss_imp_name_type fn)
@@ -63,12 +62,12 @@ GSSName::GSSName(GSSBuffer namestr,   gss_OID name_type, gss_imp_name_type fn)
 
 GSSName::GSSName(std::string namestr, std::string name_type, gss_imp_name_type fn)
 {
-  init(GSSBuffer(namestr), GSSOID(name_type), fn); 
+  init(GSSBuffer(namestr, true), GSSOID(name_type), fn); 
 }
 
 GSSName::GSSName(char *namestr,       std::string name_type, gss_imp_name_type fn)
 {
-  init(GSSBuffer(namestr), GSSOID(name_type), fn); 
+  init(GSSBuffer(namestr, true), GSSOID(name_type), fn); 
 }
 
 GSSName::GSSName(GSSBuffer namestr,   std::string name_type, gss_imp_name_type fn)
@@ -76,13 +75,15 @@ GSSName::GSSName(GSSBuffer namestr,   std::string name_type, gss_imp_name_type f
   init(namestr, GSSOID(name_type), fn); 
 }
 
-
-GSSName::~GSSName()
+void GSSName::release()
 {
   /* Variables */
   OM_uint32 major, minor;
   
   /* Error checking */
+  if (name == GSS_C_NO_NAME)
+    return;
+  
   /* Setup */
   /* Main */ 
   major = gss_release_name(&minor, &name);
@@ -93,6 +94,11 @@ GSSName::~GSSName()
 
   /* Cleanup */
   /* Return */
+}
+
+GSSName::~GSSName()
+{
+  this->release();
 }  
 
 
@@ -116,3 +122,10 @@ std::string GSSName::toString()
   /* Return */
   return buf.toString();
 }
+
+bool GSSName::setValue ( gss_name_t newName )
+{
+  this->release();
+  this->name = newName;
+  return(true);
+}
index 839c24e..32f1908 100644 (file)
@@ -22,46 +22,53 @@ typedef OM_uint32 (*gss_imp_name_type)(
 
 class GSSName {
 public:
+  GSSName() {name = GSS_C_NO_NAME; };
   GSSName(std::string nameStr, 
           GSSOID name_type = GSSOID( (gss_OID)GSS_C_NO_OID ), 
           gss_imp_name_type fn = (gss_imp_name_type)&gss_import_name);
-  GSSName(char *namestr,       
-          GSSOID name_type = GSSOID( (gss_OID)GSS_C_NO_OID )
+  GSSName(std::string nameStr, 
+          gss_OID name_type
           gss_imp_name_type fn = (gss_imp_name_type)&gss_import_name);
-  GSSName(GSSBuffer namestr,   
-          GSSOID name_type = GSSOID( (gss_OID)GSS_C_NO_OID )
+  GSSName(std::string nameStr, 
+          std::string name_type
           gss_imp_name_type fn = (gss_imp_name_type)&gss_import_name);
 
-  GSSName(std::string nameStr, 
-          gss_OID name_type
+  GSSName(char *namestr,       
+          GSSOID name_type = GSSOID( (gss_OID)GSS_C_NO_OID )
           gss_imp_name_type fn = (gss_imp_name_type)&gss_import_name);
   GSSName(char *namestr,       
           gss_OID name_type, 
           gss_imp_name_type fn = (gss_imp_name_type)&gss_import_name);
-  GSSName(GSSBuffer namestr,   
-          gss_OID name_type, 
+  GSSName(char *namestr,       
+          std::string name_type, 
           gss_imp_name_type fn = (gss_imp_name_type)&gss_import_name);
 
-  GSSName(std::string nameStr, 
-          std::string name_type
+  GSSName(GSSBuffer namestr,   
+          GSSOID name_type = GSSOID( (gss_OID)GSS_C_NO_OID )
           gss_imp_name_type fn = (gss_imp_name_type)&gss_import_name);
-  GSSName(char *namestr,       
-          std::string name_type, 
+  GSSName(GSSBuffer namestr,   
+          gss_OID name_type, 
           gss_imp_name_type fn = (gss_imp_name_type)&gss_import_name);
   GSSName(GSSBuffer namestr,   
           std::string name_type, 
           gss_imp_name_type fn = (gss_imp_name_type)&gss_import_name);
 
+  GSSName(gss_name_t gss_name) { name = gss_name; }
+
   ~GSSName();
   
   
   gss_name_t toGSS() { return(name); }
   std::string toString();
   
+  bool setValue(gss_name_t newName);
+  
 private:
   gss_name_t name;
-  void init(GSSBuffer namestr, GSSOID name_type, gss_imp_name_type fn);
   gss_imp_name_type function;
+  
+  void init(const GSSBuffer namestr, GSSOID name_type, gss_imp_name_type fn);
+  void release();
 };
 
 
index c8b545c..e21ca6d 100644 (file)
@@ -29,10 +29,16 @@ GSSOID::GSSOID(gss_OID gssoid)
   this->gssInternal = true;
 }
 
-GSSOID::~GSSOID()
+GSSOID::GSSOID ( const GSSOID &gssoid )
+{
+  this->oid = gssoid.oid;
+  this->gssInternal = true;
+}
+
+void GSSOID::release()
 {
   OM_uint32 major, minor;
-  if (! this->gssInternal)
+  if ( (!this->gssInternal) && (oid != GSS_C_NO_OID) )
   {
     major = gss_release_oid(&minor, &(this->oid));
     if (GSS_ERROR(major))
@@ -41,6 +47,11 @@ GSSOID::~GSSOID()
     }
   }
 }
+
+GSSOID::~GSSOID()
+{
+  this->release();
+}
   
 void GSSOID::init(GSSBuffer oid_str)
 {
@@ -70,6 +81,8 @@ std::string GSSOID::toString()
   std::string ret;
   
   /* Error checking */
+  if (oid->length == 0)
+    return std::string("");
   /* Setup */
   /* Main */ 
   major = gss_oid_to_str(&minor, this->oid, &buf);
@@ -91,3 +104,16 @@ std::string GSSOID::toString()
   /* Return */ 
   return(ret);
 }
+
+bool GSSOID::setValue ( GSSBuffer buf )
+{
+  init(buf);
+  return true;
+}
+
+bool GSSOID::setValue ( gss_OID gssOID )
+{
+  oid = gssOID;
+  this->gssInternal = true;
+  return true;
+}
index 636c1a8..1786e23 100644 (file)
 
 class GSSOID { 
 public:
+  GSSOID() { oid = GSS_C_NO_OID; gssInternal = true; };
   GSSOID(char *oid_str);
   GSSOID(std::string oid_str);
   GSSOID(GSSBuffer oid_str);
   GSSOID(gss_OID gssoid);
+  GSSOID(const GSSOID &gssoid);
   ~GSSOID();
   
   gss_OID toGss() { return(oid); };
   std::string toString();
+  
+  bool setValue(GSSBuffer buf);
+  bool setValue(gss_OID   gssOID);
 
 private:
   gss_OID oid;
   bool gssInternal;
   
   void init(GSSBuffer oid_str);
+  void release();
 };
 
 
index a9d673e..65380ef 100644 (file)
@@ -11,6 +11,8 @@ add_executable(test GSSExceptionTest.cpp
                     ../src/GSSImportName.cpp
                     ../src/GSSException.cpp
                     ../src/datamodel/GSSBuffer.cpp
+                    ../src/datamodel/GSSName.cpp
+                    ../src/datamodel/GSSOID.cpp
                     datamodel/GSSBufferTest.cpp
   )
 
index 5c915fa..49a3ec0 100644 (file)
@@ -40,15 +40,16 @@ mock_import_name(
 {
   /* Error checking */
   /* Variables */
+  
   /* Setup */
   /* Main */
   // Copy our input from the appropriate parameters to MockImportName
-  MockImportName::input_name_buffer = input_name_buffer;
-  MockImportName::input_name_type = input_name_type;
+  MockImportName::input_name_buffer.setValue((char *)input_name_buffer->value, input_name_buffer->length);
+  MockImportName::input_name_type.setValue(input_name_type);
   
   // copy our output to the appropriate parameters
   *minor_status = MockImportName::minor_status;
-  *output_name = MockImportName::output_name;
+  *output_name = MockImportName::output_name.toGSS();
   
   
   /* Cleanup */
@@ -87,11 +88,44 @@ void GSSImportNameTest::testConstructor()
 void GSSImportNameTest::testEmptyCall()
 {
   /* Variables */
-  GSSImportName cmd = GSSImportName();
+  GSSImportName cmd = GSSImportName(&mock_import_name);
+  std::string name = std::string("ssh@server");
+  std::string type = std::string("{ 1 2 840 113554 1 2 1 4 }");
   
   /* Error checking */
   /* Setup */
+  cmd.setInputName(name);
+  cmd.setInputNameType(type);
+  MockImportName::minor_status = rand() % 1024;
+  MockImportName::retVal = rand() % 1024;
+  MockImportName::output_name.setValue(GSS_C_NO_NAME);
+  
+  CPPUNIT_ASSERT_EQUAL_MESSAGE(
+    "Input name was not set correctly.",
+    name,
+    cmd.getInputName().toString()
+  );
+  CPPUNIT_ASSERT_EQUAL_MESSAGE(
+    "Input name was not set correctly.",
+    type,
+    cmd.getInputNameType().toString()
+  );
+  
+  cmd.execute();
+  
   /* Main */
+  CPPUNIT_ASSERT_EQUAL_MESSAGE(
+    "The requested GSS name is not correct",
+    name,
+    MockImportName::input_name_buffer.toString()
+  );
+  
+  GSSOID retOID = GSSOID(MockImportName::input_name_type);
+  CPPUNIT_ASSERT_EQUAL_MESSAGE(
+    "The requested GSS name type is not correct",
+    type,
+    retOID.toString()
+  );
   
   /* Cleanup */
   /* Return */
index f8a9aeb..0eea198 100644 (file)
@@ -30,9 +30,9 @@ public:
 
 OM_uint32 MockImportName::retVal = 0;
 OM_uint32 MockImportName::minor_status = 0;
-GSSBuffer MockImportName::input_name_buffer = GSSBuffer(std::string(""));
-gss_OID MockImportName::input_name_type = NULL;
-gss_name_t MockImportName::output_name = NULL;
+GSSBuffer MockImportName::input_name_buffer((char *)"");
+GSSOID    MockImportName::input_name_type;
+GSSName   MockImportName::output_name;
 
 
 
index 98437ac..c97ce63 100644 (file)
@@ -11,6 +11,8 @@
 #include <gssapi.h>
 
 #include "datamodel/GSSBuffer.h"
+#include "datamodel/GSSOID.h"
+#include "datamodel/GSSName.h"
 
 class MockImportName
 {
@@ -18,8 +20,8 @@ public:
   static OM_uint32      retVal;
   static OM_uint32      minor_status;
   static GSSBuffer      input_name_buffer;
-  static gss_OID        input_name_type;
-  static gss_name_t     output_name;
+  static GSSOID         input_name_type;
+  static GSSName        output_name;
   
   static bool           visited;