Basic name importing 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   OM_uint32 major, minor;
15   /* Error checking */
16   /* Setup */
17   /* Main */ 
18   major = fn(&minor, namestr.toGss(), name_type.toGss(), &name);
19   if ( GSS_ERROR(major) )
20   {
21     std::string errMsg;
22     errMsg += "Cannot import name: ";
23     errMsg += namestr.toString();
24     throw GSSException(errMsg.c_str(), major, minor, name_type.toGss());
25   }
26   
27   /* Cleanup */
28   /* Return */
29 }
30
31
32
33 GSSName::GSSName(std::string namestr, GSSOID name_type, gss_imp_name_type fn)
34 {
35   init(namestr, name_type, fn);
36 }
37
38 GSSName::GSSName(char *namestr,       GSSOID name_type, gss_imp_name_type fn)
39 {
40   init(GSSBuffer(namestr, true), name_type, fn); 
41 }
42
43 GSSName::GSSName(GSSBuffer namestr,   GSSOID name_type, gss_imp_name_type fn)
44 {
45   init(GSSBuffer(namestr), name_type, fn); 
46 }
47
48 GSSName::GSSName(std::string namestr, gss_OID name_type, gss_imp_name_type fn)
49 {
50   init(GSSBuffer(namestr, true), GSSOID(name_type), fn); 
51 }
52
53 GSSName::GSSName(char *namestr,       gss_OID name_type, gss_imp_name_type fn)
54 {
55   init(GSSBuffer(namestr, true), GSSOID(name_type), fn); 
56 }
57
58 GSSName::GSSName(GSSBuffer namestr,   gss_OID name_type, gss_imp_name_type fn)
59 {
60   init(namestr, GSSOID(name_type), fn); 
61 }
62
63 GSSName::GSSName(std::string namestr, std::string name_type, gss_imp_name_type fn)
64 {
65   init(GSSBuffer(namestr, true), GSSOID(name_type), fn); 
66 }
67
68 GSSName::GSSName(char *namestr,       std::string name_type, gss_imp_name_type fn)
69 {
70   init(GSSBuffer(namestr, true), GSSOID(name_type), fn); 
71 }
72
73 GSSName::GSSName(GSSBuffer namestr,   std::string name_type, gss_imp_name_type fn)
74 {
75   init(namestr, GSSOID(name_type), fn); 
76 }
77
78 void GSSName::release()
79 {
80   /* Variables */
81   OM_uint32 major, minor;
82   
83   /* Error checking */
84   if (name == GSS_C_NO_NAME)
85     return;
86   
87   /* Setup */
88   /* Main */ 
89   major = gss_release_name(&minor, &name);
90   if ( GSS_ERROR(major) && !( major & GSS_S_BAD_NAME ) )
91   {
92     throw GSSException("Cannot free memory for a GSS name.", major, minor);
93   }
94
95   /* Cleanup */
96   /* Return */
97 }
98
99 GSSName::~GSSName()
100 {
101   this->release();
102 }  
103
104
105 std::string GSSName::toString()
106 {
107   /* Variables */
108   OM_uint32 major, minor;
109   gss_OID oid;
110   GSSBuffer buf;
111   
112   /* Error checking */
113   /* Setup */
114   /* Main */ 
115   major = gss_display_name(&minor, (this->name), buf.toGss(), &oid);
116   if ( GSS_ERROR(major) )
117   {
118     throw GSSException("Cannot convert a GSS name to a string.", major, minor);
119   }
120   
121   /* Cleanup */
122   /* Return */
123   return buf.toString();
124 }
125
126 bool GSSName::setValue ( gss_name_t newName )
127 {
128   this->release();
129   this->name = newName;
130   return(true);
131 }