a799b69f1b57258a136d5c87e346557b45a30253
[gssweb.git] / json_gssapi / src / GSSException.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 "GSSException.h"
36 #include <sstream>
37 #include <ios>
38 #include <iostream>
39
40 static void disp_status(OM_uint32 status, int status_type, gss_OID mech, std::ostream &output_stream)
41 {
42   OM_uint32 disp_major, disp_minor, disp_context;
43   gss_buffer_desc disp_buf;
44
45   disp_context = 0;
46   do
47   {
48     disp_major = gss_display_status(&disp_minor, 
49                                     status, 
50                                     status_type,
51                                     mech, 
52                                     &disp_context, 
53                                     &disp_buf);
54     if (GSS_ERROR(disp_major))
55     {
56       disp_context = 0; // Get out of this loop.
57       output_stream << "    An error occurred, and then another error" << std::endl <<
58          "    occurred in creating a message to describe the first one. " << std::endl <<
59          "    How embarrassing. It's time to quit before it gets any worse." <<  std::endl <<
60          "    For now, the error code itself was 0x" << std::hex << status << std::dec;
61       std::cout << "\n     -------------------------\n    Something wonky happened in displaying status:\n";
62       std::cout << "     gss_display_status(&disp_minor, " << status << ", " << (int)status_type << ", " << (long int)mech << ", " << disp_context << ", &buf);\n";
63       disp_status(disp_major, GSS_C_GSS_CODE, mech, std::cout);
64       disp_status(disp_minor, GSS_C_MECH_CODE, mech, std::cout);
65     } else
66       output_stream << "    " << (char *)disp_buf.value << std::endl;
67   } while (disp_context != 0);
68 }
69
70 GSSException::GSSException(std::string message, 
71                            OM_uint32 major, 
72                            OM_uint32 minor, 
73                            gss_OID mech)
74 {
75   /* Error checking */
76   
77   /* Variables */
78   std::stringstream output_stream;
79   /* Setup */
80   
81   /* Main */
82   this->major = major;
83   this->minor = minor;
84   
85   output_stream << message << std::endl;
86   output_stream << "GSS Error message:" << std::endl;
87   output_stream << "  Major status:" << std::endl;
88   disp_status(major, GSS_C_GSS_CODE, mech, output_stream);
89   output_stream << std::endl;
90   output_stream << "  Minor status details: " << std::endl;
91   disp_status(minor, GSS_C_MECH_CODE, mech, output_stream);
92   reason = output_stream.str();
93   
94   
95   /* Cleanup */
96   /* Return */
97 }