00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #include <config.h>
00024 #include <string.h>
00025 #include "dbus-credentials.h"
00026 #include "dbus-internals.h"
00027
00048 struct DBusCredentials {
00049 int refcount;
00050 dbus_uid_t unix_uid;
00051 dbus_pid_t unix_pid;
00052 dbus_sid_t unix_sid;
00053 char *windows_sid;
00054 };
00055
00068 DBusCredentials*
00069 _dbus_credentials_new (void)
00070 {
00071 DBusCredentials *creds;
00072
00073 creds = dbus_new (DBusCredentials, 1);
00074 if (creds == NULL)
00075 return NULL;
00076
00077 creds->refcount = 1;
00078 creds->unix_uid = DBUS_UID_UNSET;
00079 creds->unix_pid = DBUS_PID_UNSET;
00080 creds->unix_sid = 0;
00081 creds->windows_sid = NULL;
00082
00083 return creds;
00084 }
00085
00090 DBusCredentials*
00091 _dbus_credentials_new_from_current_process (void)
00092 {
00093 DBusCredentials *creds;
00094
00095 creds = _dbus_credentials_new ();
00096 if (creds == NULL)
00097 return NULL;
00098
00099 if (!_dbus_credentials_add_from_current_process (creds))
00100 {
00101 _dbus_credentials_unref (creds);
00102 return NULL;
00103 }
00104
00105 return creds;
00106 }
00107
00113 void
00114 _dbus_credentials_ref (DBusCredentials *credentials)
00115 {
00116 _dbus_assert (credentials->refcount > 0);
00117 credentials->refcount += 1;
00118 }
00119
00125 void
00126 _dbus_credentials_unref (DBusCredentials *credentials)
00127 {
00128 _dbus_assert (credentials->refcount > 0);
00129
00130 credentials->refcount -= 1;
00131 if (credentials->refcount == 0)
00132 {
00133 dbus_free (credentials->windows_sid);
00134 dbus_free (credentials);
00135 }
00136 }
00137
00145 dbus_bool_t
00146 _dbus_credentials_add_unix_pid (DBusCredentials *credentials,
00147 dbus_pid_t pid)
00148 {
00149 credentials->unix_pid = pid;
00150 return TRUE;
00151 }
00152
00160 dbus_bool_t
00161 _dbus_credentials_add_unix_uid(DBusCredentials *credentials,
00162 dbus_uid_t uid)
00163 {
00164 credentials->unix_uid = uid;
00165 return TRUE;
00166
00167 }
00168
00176 dbus_bool_t
00177 _dbus_credentials_add_unix_sid(DBusCredentials *credentials,
00178 dbus_sid_t sid)
00179 {
00180 credentials->unix_sid = sid;
00181 return TRUE;
00182 }
00183
00191 dbus_bool_t
00192 _dbus_credentials_add_windows_sid (DBusCredentials *credentials,
00193 const char *windows_sid)
00194 {
00195 char *copy;
00196
00197 copy = _dbus_strdup (windows_sid);
00198 if (copy == NULL)
00199 return FALSE;
00200
00201 dbus_free (credentials->windows_sid);
00202 credentials->windows_sid = copy;
00203
00204 return TRUE;
00205 }
00206
00214 dbus_bool_t
00215 _dbus_credentials_include (DBusCredentials *credentials,
00216 DBusCredentialType type)
00217 {
00218 switch (type)
00219 {
00220 case DBUS_CREDENTIAL_UNIX_PROCESS_ID:
00221 return credentials->unix_pid != DBUS_PID_UNSET;
00222 case DBUS_CREDENTIAL_UNIX_USER_ID:
00223 return credentials->unix_uid != DBUS_UID_UNSET;
00224 case DBUS_CREDENTIAL_WINDOWS_SID:
00225 return credentials->windows_sid != NULL;
00226 case DBUS_CREDENTIAL_UNIX_SID:
00227 return credentials->unix_sid != 0;
00228 }
00229
00230 _dbus_assert_not_reached ("Unknown credential enum value");
00231 return FALSE;
00232 }
00233
00241 dbus_pid_t
00242 _dbus_credentials_get_unix_pid (DBusCredentials *credentials)
00243 {
00244 return credentials->unix_pid;
00245 }
00246
00254 dbus_uid_t
00255 _dbus_credentials_get_unix_uid (DBusCredentials *credentials)
00256 {
00257 return credentials->unix_uid;
00258 }
00259
00267 dbus_uid_t
00268 _dbus_credentials_get_unix_sid (DBusCredentials *credentials)
00269 {
00270 return credentials->unix_sid;
00271 }
00272
00280 const char*
00281 _dbus_credentials_get_windows_sid (DBusCredentials *credentials)
00282 {
00283 return credentials->windows_sid;
00284 }
00285
00294 dbus_bool_t
00295 _dbus_credentials_are_superset (DBusCredentials *credentials,
00296 DBusCredentials *possible_subset)
00297 {
00298 return
00299 (possible_subset->unix_pid == DBUS_PID_UNSET ||
00300 possible_subset->unix_pid == credentials->unix_pid) &&
00301 (possible_subset->unix_uid == DBUS_UID_UNSET ||
00302 possible_subset->unix_uid == credentials->unix_uid) &&
00303 (possible_subset->unix_sid == 0 ||
00304 possible_subset->unix_sid == credentials->unix_sid) &&
00305 (possible_subset->windows_sid == NULL ||
00306 (credentials->windows_sid && strcmp (possible_subset->windows_sid,
00307 credentials->windows_sid) == 0));
00308 }
00309
00316 dbus_bool_t
00317 _dbus_credentials_are_empty (DBusCredentials *credentials)
00318 {
00319 return
00320 credentials->unix_pid == DBUS_PID_UNSET &&
00321 credentials->unix_uid == DBUS_UID_UNSET &&
00322 credentials->unix_sid == 0 &&
00323 credentials->windows_sid == NULL;
00324 }
00325
00332 dbus_bool_t
00333 _dbus_credentials_are_anonymous (DBusCredentials *credentials)
00334 {
00335 return
00336 credentials->unix_uid == DBUS_UID_UNSET &&
00337 credentials->windows_sid == NULL;
00338 }
00339
00348 dbus_bool_t
00349 _dbus_credentials_add_credentials (DBusCredentials *credentials,
00350 DBusCredentials *other_credentials)
00351 {
00352 return
00353 _dbus_credentials_add_credential (credentials,
00354 DBUS_CREDENTIAL_UNIX_PROCESS_ID,
00355 other_credentials) &&
00356 _dbus_credentials_add_credential (credentials,
00357 DBUS_CREDENTIAL_UNIX_USER_ID,
00358 other_credentials) &&
00359 _dbus_credentials_add_credential (credentials,
00360 DBUS_CREDENTIAL_UNIX_SID,
00361 other_credentials) &&
00362 _dbus_credentials_add_credential (credentials,
00363 DBUS_CREDENTIAL_WINDOWS_SID,
00364 other_credentials);
00365 }
00366
00379 dbus_bool_t
00380 _dbus_credentials_add_credential (DBusCredentials *credentials,
00381 DBusCredentialType which,
00382 DBusCredentials *other_credentials)
00383 {
00384 if (which == DBUS_CREDENTIAL_UNIX_PROCESS_ID &&
00385 other_credentials->unix_pid != DBUS_PID_UNSET)
00386 {
00387 if (!_dbus_credentials_add_unix_pid (credentials, other_credentials->unix_pid))
00388 return FALSE;
00389 }
00390 else if (which == DBUS_CREDENTIAL_UNIX_USER_ID &&
00391 other_credentials->unix_uid != DBUS_UID_UNSET)
00392 {
00393 if (!_dbus_credentials_add_unix_uid (credentials, other_credentials->unix_uid))
00394 return FALSE;
00395 }
00396 else if (which == DBUS_CREDENTIAL_WINDOWS_SID &&
00397 other_credentials->windows_sid != NULL)
00398 {
00399 if (!_dbus_credentials_add_windows_sid (credentials, other_credentials->windows_sid))
00400 return FALSE;
00401 }
00402 else if (which == DBUS_CREDENTIAL_UNIX_SID &&
00403 other_credentials->unix_sid != NULL)
00404 {
00405 if (!_dbus_credentials_add_unix_sid (credentials, other_credentials->unix_sid))
00406 return FALSE;
00407 }
00408
00409 return TRUE;
00410 }
00411
00417 void
00418 _dbus_credentials_clear (DBusCredentials *credentials)
00419 {
00420 credentials->unix_pid = DBUS_PID_UNSET;
00421 credentials->unix_uid = DBUS_UID_UNSET;
00422 credentials->unix_sid = 0;
00423 dbus_free (credentials->windows_sid);
00424 credentials->windows_sid = NULL;
00425 }
00426
00433 DBusCredentials*
00434 _dbus_credentials_copy (DBusCredentials *credentials)
00435 {
00436 DBusCredentials *copy;
00437
00438 copy = _dbus_credentials_new ();
00439 if (copy == NULL)
00440 return NULL;
00441
00442 if (!_dbus_credentials_add_credentials (copy, credentials))
00443 {
00444 _dbus_credentials_unref (copy);
00445 return NULL;
00446 }
00447
00448 return copy;
00449 }
00450
00462 dbus_bool_t
00463 _dbus_credentials_same_user (DBusCredentials *credentials,
00464 DBusCredentials *other_credentials)
00465 {
00466
00467
00468
00469 return credentials->unix_uid == other_credentials->unix_uid &&
00470 ((!(credentials->windows_sid || other_credentials->windows_sid)) ||
00471 (credentials->windows_sid && other_credentials->windows_sid &&
00472 strcmp (credentials->windows_sid, other_credentials->windows_sid) == 0));
00473 }
00474
00477