d995ee60dfd34fbe231c5b2a4a670e9036a9e47c
[gssweb.git] / json_gssapi / src / datamodel / GSSOID.cpp
1 /*
2  * Copyright (c) 2014, 2015 JANET(UK)
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  *
9  * 1. Redistributions of source code must retain the above copyright
10  *    notice, this list of conditions and the following disclaimer.
11  *
12  * 2. Redistributions in binary form must reproduce the above copyright
13  *    notice, this list of conditions and the following disclaimer in the
14  *    documentation and/or other materials provided with the distribution.
15  *
16  * 3. Neither the name of JANET(UK) nor the names of its contributors
17  *    may be used to endorse or promote products derived from this software
18  *    without specific prior written permission.
19  *
20  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
21  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
22  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
23  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
24  * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
25  * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
26  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
27  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
29  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
30  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
31  * OF THE POSSIBILITY OF SUCH DAMAGE.
32  *
33  */
34
35 #include "GSSOID.h"
36 #include "../GSSException.h"
37
38 GSSOID::GSSOID(std::string oid_str)
39 {
40   init( GSSBuffer(oid_str) );
41 }
42
43 GSSOID::GSSOID(char *oid_str)
44 {
45   init( GSSBuffer(oid_str) );
46 }
47   
48 GSSOID::GSSOID(GSSBuffer oid_str)
49 {
50   init(oid_str);
51 }
52
53 GSSOID::GSSOID(gss_OID gssoid)
54 {
55   oid = gssoid;
56   this->gssInternal = true;
57 }
58
59 GSSOID::GSSOID ( const GSSOID &gssoid )
60 {
61   this->oid = gssoid.oid;
62   this->gssInternal = true;
63 }
64
65 void GSSOID::release()
66 {
67   OM_uint32 major, minor;
68   if ( (!this->gssInternal) && (oid != GSS_C_NO_OID) )
69   {
70     major = gss_release_oid(&minor, &(this->oid));
71     if (GSS_ERROR(major))
72     {
73       throw GSSException("Error in releasing a GSS OID", major, minor);
74     }
75   }
76 }
77
78 GSSOID::~GSSOID()
79 {
80   this->release();
81 }
82   
83 void GSSOID::init(GSSBuffer oid_str)
84 {
85   /* Variables */
86   OM_uint32 major, minor;
87   
88   /* Error checking */
89   /* Setup */
90   
91   /* Main */
92   major = gss_str_to_oid(&minor, oid_str.toGss(), &(this->oid));
93   if (GSS_ERROR(major))
94   {
95     throw GSSException("Error creating GSS OID", major, minor);
96   }
97   this->gssInternal = false;
98   
99   /* Cleanup */
100   /* Return */
101 }
102
103 std::string GSSOID::toString() const
104 {
105   /* Variables */
106   OM_uint32 major, minor;
107   gss_buffer_desc buf;
108   std::string ret;
109   
110   /* Error checking */
111   if (oid->length == 0)
112     return std::string("");
113   /* Setup */
114   /* Main */ 
115   major = gss_oid_to_str(&minor, this->oid, &buf);
116   if (GSS_ERROR(major))
117   {
118     throw GSSException("Error in creating a string representation of a GSS OID", 
119                        major, minor);
120   }
121   ret = std::string((char *)buf.value);
122   
123   /* Cleanup */
124   major = gss_release_buffer(&minor, &buf);
125   if (GSS_ERROR(major))
126   {
127     throw GSSException("Error releasing a gss_buffer", 
128                        major, minor);
129   }
130   
131   /* Return */ 
132   return(ret);
133 }
134
135 JSONObject *GSSOID::toJSONValue() const
136
137   std::string val = this->toString();
138   JSONObject *ret = new JSONObject( val.c_str() );
139   return(ret); 
140 }
141
142 bool GSSOID::setValue ( GSSBuffer buf )
143 {
144   init(buf);
145   return true;
146 }
147
148 bool GSSOID::setValue ( gss_OID gssOID )
149 {
150   oid = gssOID;
151   this->gssInternal = true;
152   return true;
153 }