1 /* libmoonshot - Moonshot client library
2 * Copyright (c) 2011, JANET(UK)
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
9 * 1. Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
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.
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.
20 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
21 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
24 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
25 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
26 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
27 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
28 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
29 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
32 * Author: Sam Thursfield <samthursfield@codethink.co.uk>
35 #include <dbus/dbus-glib.h>
36 #include <dbus/dbus.h>
38 #include "libmoonshot.h"
39 #include "libmoonshot-common.h"
41 #define MOONSHOT_DBUS_NAME "org.janet.Moonshot"
42 #define MOONSHOT_DBUS_PATH "/org/janet/moonshot"
44 /* This library is overly complicated currently due to the requirement
45 * that it work on Debian Squeeze - this has GLib 2.24 which requires us
46 * to use dbus-glib instead of GDBus. If/when this requirement is
47 * dropped the DBus version of the library can be greatly simplified.
50 /* Note that ideally this library would not depend on GLib. This would be
51 * possible using libdbus directly and running our own message loop while
55 static DBusGProxy *moonshot_dbus_proxy = NULL;
57 static DBusGProxy *dbus_connect (MoonshotError **error)
59 DBusConnection *connection;
61 DBusGConnection *g_connection;
64 dbus_bool_t name_has_owner;
66 g_return_val_if_fail (*error == NULL, NULL);
68 dbus_error_init (&dbus_error);
70 /* Check for moonshot server and start the service if possible. We use
71 * libdbus here because dbus-glib doesn't handle autostarting the service.
72 * If/when we move to GDBus this code can become a one-liner.
75 connection = dbus_bus_get (DBUS_BUS_SESSION, &dbus_error);
77 if (dbus_error_is_set (&dbus_error)) {
78 *error = moonshot_error_new (MOONSHOT_ERROR_IPC_ERROR,
81 dbus_error_free (&dbus_error);
85 name_has_owner = dbus_bus_name_has_owner (connection,
89 if (dbus_error_is_set (&dbus_error)) {
90 *error = moonshot_error_new (MOONSHOT_ERROR_IPC_ERROR,
93 dbus_error_free (&dbus_error);
97 if (! name_has_owner) {
98 dbus_bus_start_service_by_name (connection,
104 if (dbus_error_is_set (&dbus_error)) {
105 if (strcmp (dbus_error.name + 27, "ServiceUnknown") == 0) {
106 /* Missing .service file; the moonshot-ui install is broken */
107 *error = moonshot_error_new (MOONSHOT_ERROR_UNABLE_TO_START_SERVICE,
108 "The Moonshot service was not found. "
109 "Please make sure that moonshot-ui is "
110 "correctly installed.");
112 *error = moonshot_error_new (MOONSHOT_ERROR_IPC_ERROR,
116 dbus_error_free (&dbus_error);
121 /* Now the service should be running */
124 g_connection = dbus_g_bus_get (DBUS_BUS_SESSION, &g_error);
126 if (g_error != NULL) {
127 *error = moonshot_error_new (MOONSHOT_ERROR_IPC_ERROR,
130 g_error_free (g_error);
134 g_proxy = dbus_g_proxy_new_for_name_owner (g_connection,
140 if (g_error != NULL) {
141 *error = moonshot_error_new (MOONSHOT_ERROR_IPC_ERROR,
144 g_error_free (g_error);
151 int moonshot_get_identity (const char *nai,
152 const char *password,
156 char **server_certificate_hash_out,
157 char **ca_certificate_out,
158 char **subject_name_constraint_out,
159 char **subject_alt_name_constraint_out,
160 MoonshotError **error)
162 GError *g_error = NULL;
165 if (moonshot_dbus_proxy == NULL)
166 moonshot_dbus_proxy = dbus_connect (error);
171 g_return_if_fail (DBUS_IS_G_PROXY (moonshot_dbus_proxy));
173 dbus_g_proxy_call (moonshot_dbus_proxy,
177 G_TYPE_STRING, password,
178 G_TYPE_STRING, service,
180 G_TYPE_STRING, nai_out,
181 G_TYPE_STRING, password_out,
182 G_TYPE_STRING, server_certificate_hash_out,
183 G_TYPE_STRING, ca_certificate_out,
184 G_TYPE_STRING, subject_name_constraint_out,
185 G_TYPE_STRING, subject_alt_name_constraint_out,
186 G_TYPE_BOOLEAN, &success,
189 if (g_error != NULL) {
190 *error = moonshot_error_new (MOONSHOT_ERROR_IPC_ERROR,
195 if (success == FALSE) {
196 *error = moonshot_error_new (MOONSHOT_ERROR_NO_IDENTITY_SELECTED,
197 "No identity was returned by the Moonshot "
208 * Returns the default identity - most recently used.
210 * @param nai_out NAI stored in the ID card
211 * @param password_out Password stored in the ID card
213 * @return true on success, false if no identities are stored