GSS import name working
[gssweb.git] / json_gssapi / src / datamodel / GSSName.cpp
1 /*
2  * Copyright (c) 2014 <copyright holder> <email>
3  * 
4  * For license details, see the LICENSE file in the root of this project.
5  * 
6  */
7
8 #include "GSSName.h"
9 #include "../GSSException.h" 
10
11 void GSSName::init(const GSSBuffer namestr, GSSOID name_type, gss_imp_name_type fn)
12 {
13   /* Variables */
14   /* Error checking */
15   /* Setup */
16   /* Main */ 
17   this->major_status = fn(&(this->minor_status), namestr.toGss(), name_type.toGss(), &name);
18   if ( GSS_ERROR(this->major_status) )
19   {
20     std::string errMsg;
21     errMsg += "Cannot import name: ";
22     errMsg += namestr.toString();
23     throw GSSException(errMsg.c_str(), this->major_status, this->minor_status, name_type.toGss());
24   }
25   
26   /* Cleanup */
27   /* Return */
28 }
29
30
31
32 GSSName::GSSName(std::string namestr, GSSOID name_type, gss_imp_name_type fn)
33 {
34   init(namestr, name_type, fn);
35 }
36
37 GSSName::GSSName(char *namestr,       GSSOID name_type, gss_imp_name_type fn)
38 {
39   init(GSSBuffer(namestr, true), name_type, fn); 
40 }
41
42 GSSName::GSSName(GSSBuffer namestr,   GSSOID name_type, gss_imp_name_type fn)
43 {
44   init(GSSBuffer(namestr), name_type, fn); 
45 }
46
47 GSSName::GSSName(std::string namestr, gss_OID name_type, gss_imp_name_type fn)
48 {
49   init(GSSBuffer(namestr, true), GSSOID(name_type), fn); 
50 }
51
52 GSSName::GSSName(char *namestr,       gss_OID name_type, gss_imp_name_type fn)
53 {
54   init(GSSBuffer(namestr, true), GSSOID(name_type), fn); 
55 }
56
57 GSSName::GSSName(GSSBuffer namestr,   gss_OID name_type, gss_imp_name_type fn)
58 {
59   init(namestr, GSSOID(name_type), fn); 
60 }
61
62 GSSName::GSSName(std::string namestr, std::string name_type, gss_imp_name_type fn)
63 {
64   init(GSSBuffer(namestr, true), GSSOID(name_type), fn); 
65 }
66
67 GSSName::GSSName(char *namestr,       std::string name_type, gss_imp_name_type fn)
68 {
69   init(GSSBuffer(namestr, true), GSSOID(name_type), fn); 
70 }
71
72 GSSName::GSSName(GSSBuffer namestr,   std::string name_type, gss_imp_name_type fn)
73 {
74   init(namestr, GSSOID(name_type), fn); 
75 }
76
77 void GSSName::release()
78 {
79   /* Variables */
80   OM_uint32 major, minor;
81   
82   /* Error checking */
83   if (name == GSS_C_NO_NAME)
84     return;
85   
86   /* Setup */
87   /* Main */ 
88   major = gss_release_name(&minor, &name);
89   if ( GSS_ERROR(major) && !( major & GSS_S_BAD_NAME ) )
90   {
91     throw GSSException("Cannot free memory for a GSS name.", major, minor);
92   }
93
94   /* Cleanup */
95   /* Return */
96 }
97
98 GSSName::~GSSName()
99 {
100   this->release();
101 }  
102
103
104 std::string GSSName::toString()
105 {
106   /* Variables */
107   OM_uint32 major, minor;
108   gss_OID oid;
109   GSSBuffer buf;
110   
111   /* Error checking */
112   /* Setup */
113   /* Main */ 
114   major = gss_display_name(&minor, (this->name), buf.toGss(), &oid);
115   if ( GSS_ERROR(major) )
116   {
117     throw GSSException("Cannot convert a GSS name to a string.", major, minor);
118   }
119   
120   /* Cleanup */
121   /* Return */
122   return buf.toString();
123 }
124
125 bool GSSName::setValue ( gss_name_t newName )
126 {
127   this->release();
128   this->name = newName;
129   return(true);
130 }