1
/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
2
/* gnome-keyring-proto.c - helper code for the keyring daemon protocol
4
Copyright (C) 2003 Red Hat, Inc
6
The Gnome Keyring Library is free software; you can redistribute it and/or
7
modify it under the terms of the GNU Library General Public License as
8
published by the Free Software Foundation; either version 2 of the
9
License, or (at your option) any later version.
11
The Gnome Keyring Library is distributed in the hope that it will be useful,
12
but WITHOUT ANY WARRANTY; without even the implied warranty of
13
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14
Library General Public License for more details.
16
You should have received a copy of the GNU Library General Public
17
License along with the Gnome Library; see the file COPYING.LIB. If not,
18
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
19
Boston, MA 02111-1307, USA.
21
Author: Alexander Larsson <alexl@redhat.com>
28
#include "gnome-keyring-proto.h"
29
#include "gnome-keyring-private.h"
31
#include "egg/egg-buffer.h"
32
#include "egg/egg-secure-memory.h"
35
gkr_proto_go_secure (EggBuffer *buffer)
37
egg_buffer_set_allocator (buffer, egg_secure_realloc);
41
gkr_proto_add_time (EggBuffer *buffer, time_t time)
46
egg_buffer_add_uint32 (buffer, ((val >> 32) & 0xffffffff));
47
egg_buffer_add_uint32 (buffer, (val & 0xffffffff));
51
gkr_proto_get_time (EggBuffer *buffer, gsize offset, gsize *next_offset,
57
if (!egg_buffer_get_uint32 (buffer, offset, &offset, &a)) {
60
if (!egg_buffer_get_uint32 (buffer, offset, &offset, &b)) {
64
val = ((guint64)a) << 32 | b;
66
*next_offset = offset;
73
gkr_proto_add_utf8_secret (EggBuffer *buffer, const char *str)
75
/* Make sure this buffer is using non-pageable memory */
76
gkr_proto_go_secure (buffer);
78
return gkr_proto_add_utf8_string (buffer, str);
82
gkr_proto_add_utf8_string (EggBuffer *buffer, const char *str)
89
if (!g_utf8_validate (str, len, NULL)) {
96
return egg_buffer_add_string (buffer, str);
100
gkr_proto_get_bytes (EggBuffer *buffer, gsize offset, gsize *next_offset,
101
guchar *out, gsize n_bytes)
103
if (buffer->len < n_bytes ||
104
offset > buffer->len - n_bytes) {
108
memcpy (out, buffer->buf + offset, n_bytes);
109
*next_offset = offset + n_bytes;
115
gkr_proto_get_raw_secret (EggBuffer *buffer, gsize offset, gsize *next_offset,
116
guchar **secret, gsize *n_secret)
119
if (!egg_buffer_get_byte_array (buffer, offset, next_offset, &ptr, n_secret))
122
if (ptr == NULL || *n_secret == 0) {
128
*secret = egg_secure_alloc (*n_secret + 1);
129
memcpy (*secret, ptr, *n_secret);
130
(*secret)[*n_secret] = 0;
135
gkr_proto_get_utf8_string (EggBuffer *buffer, gsize offset, gsize *next_offset,
138
return gkr_proto_get_utf8_full (buffer, offset, next_offset,
139
str_ret, (EggBufferAllocator)g_realloc);
143
gkr_proto_get_utf8_secret (EggBuffer *buffer, gsize offset, gsize *next_offset,
146
return gkr_proto_get_utf8_full (buffer, offset, next_offset,
147
str_ret, egg_secure_realloc);
151
gkr_proto_get_utf8_full (EggBuffer *buffer, gsize offset, gsize *next_offset,
152
char **str_ret, EggBufferAllocator allocator)
157
if (!egg_buffer_get_string (buffer, offset, &offset, &str, allocator))
159
len = str ? strlen (str) : 0;
162
if (!g_utf8_validate (str, len, NULL)) {
163
(allocator) (str, 0); /* frees memory */
168
if (next_offset != NULL) {
169
*next_offset = offset;
171
if (str_ret != NULL) {
174
(allocator) (str, 0); /* frees memory */
180
gkr_proto_start_operation (EggBuffer *buffer, GnomeKeyringOpCode op,
186
appname_pos = buffer->len;
187
egg_buffer_add_uint32 (buffer, 0);
189
name = g_get_application_name ();
190
if (name != NULL && !g_utf8_validate (name, -1, NULL)) {
191
g_warning ("g_application_name not utf8 encoded");
193
} else if (name == NULL) {
194
g_warning ("g_set_application_name not set.");
197
/* General name if none set */
198
name = "Application";
200
if (!gkr_proto_add_utf8_string (buffer, name)) {
204
/* backpatch application name size */
205
if (!egg_buffer_set_uint32 (buffer, appname_pos, buffer->len)) {
210
/* Make space for packet size */
211
*op_start = buffer->len;
212
egg_buffer_add_uint32 (buffer, 0);
213
egg_buffer_add_uint32 (buffer, op);
219
gkr_proto_end_operation (EggBuffer *buffer, gsize op_start)
221
if (!egg_buffer_set_uint32 (buffer, op_start, buffer->len - op_start)) {
228
gkr_proto_decode_packet_size (EggBuffer *buffer, guint32 *size)
230
return egg_buffer_get_uint32 (buffer, 0, NULL, size);
234
gkr_proto_decode_packet_operation (EggBuffer *buffer, GnomeKeyringOpCode *op)
239
res = egg_buffer_get_uint32 (buffer, 4, NULL, &op_nr);
245
gkr_proto_encode_op_only (EggBuffer *buffer, GnomeKeyringOpCode op)
249
if (!gkr_proto_start_operation (buffer, op, &op_start)) {
252
if (!gkr_proto_end_operation (buffer, op_start)) {
260
gkr_proto_encode_op_string (EggBuffer *buffer, GnomeKeyringOpCode op,
265
if (!gkr_proto_start_operation (buffer, op, &op_start)) {
268
if (!gkr_proto_add_utf8_string (buffer, str)) {
271
if (!gkr_proto_end_operation (buffer, op_start)) {
279
gkr_proto_encode_op_string_int (EggBuffer *buffer, GnomeKeyringOpCode op,
280
const char *str, guint32 val)
284
if (!gkr_proto_start_operation (buffer, op, &op_start)) {
287
if (!gkr_proto_add_utf8_string (buffer, str)) {
290
egg_buffer_add_uint32 (buffer, val);
291
if (!gkr_proto_end_operation (buffer, op_start)) {
299
gkr_proto_encode_op_string_int_int (EggBuffer *buffer, GnomeKeyringOpCode op,
300
const char *str, guint32 integer1,
304
if (!gkr_proto_start_operation (buffer, op, &op_start))
306
if (!gkr_proto_add_utf8_string (buffer, str))
308
egg_buffer_add_uint32 (buffer, integer1);
309
egg_buffer_add_uint32 (buffer, integer2);
310
if (!gkr_proto_end_operation (buffer, op_start))
316
gkr_proto_encode_op_string_secret (EggBuffer *buffer, GnomeKeyringOpCode op,
317
const char *str1, const char *str2)
321
/* Make sure we're using non-pageable memory */
322
gkr_proto_go_secure (buffer);
324
if (!gkr_proto_start_operation (buffer, op, &op_start)) {
327
if (!gkr_proto_add_utf8_string (buffer, str1)) {
330
if (!gkr_proto_add_utf8_secret (buffer, str2)) {
333
if (!gkr_proto_end_operation (buffer, op_start)) {
341
gkr_proto_encode_op_string_secret_secret (EggBuffer *buffer, GnomeKeyringOpCode op,
342
const char *str1, const char *str2,
347
/* Make sure we're using non-pageable memory */
348
gkr_proto_go_secure (buffer);
350
if (!gkr_proto_start_operation (buffer, op, &op_start)) {
353
if (!gkr_proto_add_utf8_string (buffer, str1)) {
356
if (!gkr_proto_add_utf8_secret (buffer, str2)) {
359
if (!gkr_proto_add_utf8_secret (buffer, str3)) {
362
if (!gkr_proto_end_operation (buffer, op_start)) {
370
gkr_proto_encode_find (EggBuffer *buffer, GnomeKeyringItemType type,
371
GnomeKeyringAttributeList *attributes)
375
gkr_proto_start_operation (buffer, GNOME_KEYRING_OP_FIND, &op_start);
377
egg_buffer_add_uint32 (buffer, type);
379
if (!gkr_proto_add_attribute_list (buffer, attributes)) {
383
if (!gkr_proto_end_operation (buffer, op_start)) {
390
egg_buffer_resize (buffer, op_start);
395
gkr_proto_encode_create_item (EggBuffer *buffer, const char *keyring,
396
const char *display_name,
397
GnomeKeyringAttributeList *attributes,
398
const char *secret, GnomeKeyringItemType type,
399
gboolean update_if_exists)
403
/* Make sure this buffer is using non-pageable memory */
404
gkr_proto_go_secure (buffer);
406
if (!gkr_proto_start_operation (buffer, GNOME_KEYRING_OP_CREATE_ITEM,
410
if (!gkr_proto_add_utf8_string (buffer, keyring)) {
413
if (!gkr_proto_add_utf8_string (buffer, display_name)) {
416
if (!gkr_proto_add_utf8_secret (buffer, secret)) {
419
if (!gkr_proto_add_attribute_list (buffer, attributes)) {
422
egg_buffer_add_uint32 (buffer, type);
423
egg_buffer_add_uint32 (buffer, update_if_exists);
425
if (!gkr_proto_end_operation (buffer, op_start)) {
433
gkr_proto_decode_create_item (EggBuffer *buffer, char **keyring, char **display_name,
434
GnomeKeyringAttributeList **attributes, char **secret,
435
GnomeKeyringItemType *type, gboolean *update_if_exists)
438
GnomeKeyringOpCode op;
441
if (keyring != NULL) {
444
if (display_name != NULL) {
445
*display_name = NULL;
447
if (secret != NULL) {
450
if (attributes != NULL) {
454
if (!gkr_proto_decode_packet_operation (buffer, &op)) {
457
if (op != GNOME_KEYRING_OP_CREATE_ITEM) {
461
if (!gkr_proto_get_utf8_string (buffer, offset, &offset, keyring)) {
464
if (!gkr_proto_get_utf8_string (buffer, offset, &offset, display_name)) {
467
if (!gkr_proto_get_utf8_secret (buffer, offset, &offset, secret)) {
471
if (!gkr_proto_decode_attribute_list (buffer, offset, &offset, attributes)) {
474
if (!egg_buffer_get_uint32 (buffer, offset, &offset, &val)) {
481
if (!egg_buffer_get_uint32 (buffer, offset, &offset, &val)) {
484
if (update_if_exists != NULL) {
485
*update_if_exists = val;
491
if (attributes != NULL) {
492
gnome_keyring_attribute_list_free (*attributes);
494
if (keyring != NULL) {
497
if (display_name != NULL) {
498
g_free (*display_name);
500
if (secret != NULL) {
501
egg_secure_strfree (*secret);
509
gkr_proto_encode_set_attributes (EggBuffer *buffer, const char *keyring,
510
guint32 id, GnomeKeyringAttributeList *attributes)
514
if (!gkr_proto_start_operation (buffer, GNOME_KEYRING_OP_SET_ITEM_ATTRIBUTES,
518
if (!gkr_proto_add_utf8_string (buffer, keyring)) {
521
egg_buffer_add_uint32 (buffer, id);
523
if (!gkr_proto_add_attribute_list (buffer, attributes)) {
527
if (!gkr_proto_end_operation (buffer, op_start)) {
535
gkr_proto_encode_set_acl (EggBuffer *buffer, const char *keyring,
536
guint32 id, GList *acl)
540
if (!gkr_proto_start_operation (buffer, GNOME_KEYRING_OP_SET_ITEM_ACL,
544
if (!gkr_proto_add_utf8_string (buffer, keyring)) {
547
egg_buffer_add_uint32 (buffer, id);
549
if (!gkr_proto_add_acl (buffer, acl)) {
553
if (!gkr_proto_end_operation (buffer, op_start)) {
562
gkr_proto_encode_set_item_info (EggBuffer *buffer, const char *keyring,
563
guint32 id, GnomeKeyringItemInfo *info)
567
/* Make sure this buffer is using non-pageable memory */
568
gkr_proto_go_secure (buffer);
570
if (!gkr_proto_start_operation (buffer, GNOME_KEYRING_OP_SET_ITEM_INFO,
574
if (!gkr_proto_add_utf8_string (buffer, keyring)) {
577
egg_buffer_add_uint32 (buffer, id);
579
egg_buffer_add_uint32 (buffer, info->type);
580
if (!gkr_proto_add_utf8_string (buffer, info->display_name)) {
583
if (!gkr_proto_add_utf8_secret (buffer, info->secret)) {
587
if (!gkr_proto_end_operation (buffer, op_start)) {
595
gkr_proto_encode_set_keyring_info (EggBuffer *buffer, const char *keyring,
596
GnomeKeyringInfo *info)
600
if (!gkr_proto_start_operation (buffer, GNOME_KEYRING_OP_SET_KEYRING_INFO,
604
if (!gkr_proto_add_utf8_string (buffer, keyring)) {
608
egg_buffer_add_uint32 (buffer, info->lock_on_idle);
609
egg_buffer_add_uint32 (buffer, info->lock_timeout);
611
if (!gkr_proto_end_operation (buffer, op_start)) {
619
gkr_proto_encode_prepare_environment (EggBuffer *buffer, const gchar **environment)
623
if (!gkr_proto_start_operation (buffer, GNOME_KEYRING_OP_PREPARE_ENVIRONMENT,
627
if (!egg_buffer_add_stringv (buffer, environment))
630
if (!gkr_proto_end_operation (buffer, op_start))
637
gkr_proto_decode_attribute_list (EggBuffer *buffer, gsize offset, gsize *next_offset,
638
GnomeKeyringAttributeList **attributes_out)
641
GnomeKeyringAttributeList *attributes;
642
GnomeKeyringAttribute attribute;
651
if (!egg_buffer_get_uint32 (buffer, offset, &offset, &list_size)) {
655
attributes = gnome_keyring_attribute_list_new ();
656
for (i = 0; i < list_size; i++) {
657
if (!gkr_proto_get_utf8_string (buffer, offset, &offset, &name)) {
660
if (!egg_buffer_get_uint32 (buffer, offset, &offset, &type)) {
665
case GNOME_KEYRING_ATTRIBUTE_TYPE_STRING:
666
if (!gkr_proto_get_utf8_string (buffer, offset, &offset, &str)) {
670
attribute.name = name;
671
attribute.type = type;
672
attribute.value.string = str;
673
g_array_append_val (attributes, attribute);
675
case GNOME_KEYRING_ATTRIBUTE_TYPE_UINT32:
676
if (!egg_buffer_get_uint32 (buffer, offset,
681
attribute.name = name;
682
attribute.type = type;
683
attribute.value.integer = val;
684
g_array_append_val (attributes, attribute);
692
if (attributes_out != NULL) {
693
*attributes_out = attributes;
695
gnome_keyring_attribute_list_free (attributes);
697
*next_offset = offset;
701
gnome_keyring_attribute_list_free (attributes);
706
gkr_proto_decode_acl (EggBuffer *buffer, gsize offset, gsize *next_offset,
711
GnomeKeyringAccessControl *ac;
712
GnomeKeyringApplicationRef *ref;
715
guint32 types_allowed;
720
if (!egg_buffer_get_uint32 (buffer, offset, &offset, &list_size)) {
724
for (i = 0; i < list_size; i++) {
725
if (!gkr_proto_get_utf8_string (buffer,
730
if (!gkr_proto_get_utf8_string (buffer,
733
g_free (display_name);
737
if (!egg_buffer_get_uint32 (buffer, offset, &offset, &types_allowed)) {
738
g_free (display_name);
742
ref = g_new0 (GnomeKeyringApplicationRef, 1);
743
ref->display_name = display_name;
744
ref->pathname = pathname;
745
ac = g_new0 (GnomeKeyringAccessControl, 1);
746
ac->application = ref;
747
ac->types_allowed = types_allowed;
748
acl = g_list_append (acl, ac);
751
if (acl_out != NULL) {
756
*next_offset = offset;
760
gnome_keyring_acl_free (acl);
766
gkr_proto_add_attribute_list (EggBuffer *buffer, GnomeKeyringAttributeList *attributes)
769
GnomeKeyringAttribute *array;
771
/* Null attributes = empty attribute array */
773
egg_buffer_add_uint32 (buffer, 0);
777
array = (GnomeKeyringAttribute *)attributes->data;
780
egg_buffer_add_uint32 (buffer, attributes->len);
782
for (i = 0; i < attributes->len; i++) {
783
if (!gkr_proto_add_utf8_string (buffer, array[i].name)) {
786
egg_buffer_add_uint32 (buffer, array[i].type);
787
switch (array[i].type) {
788
case GNOME_KEYRING_ATTRIBUTE_TYPE_STRING:
789
if (!gkr_proto_add_utf8_string (buffer, array[i].value.string)) {
793
case GNOME_KEYRING_ATTRIBUTE_TYPE_UINT32:
794
egg_buffer_add_uint32 (buffer, array[i].value.integer);
797
g_assert_not_reached ();
805
gkr_proto_add_acl (EggBuffer *buffer, GList *acl)
808
GnomeKeyringAccessControl *ac;
811
length = g_list_length (acl);
813
egg_buffer_add_uint32 (buffer, length);
815
for (tmp = acl; tmp != NULL; tmp = tmp->next) {
816
ac = (GnomeKeyringAccessControl *)tmp->data;
817
if (!gkr_proto_add_utf8_string (buffer, ac->application->display_name)) {
820
if (!gkr_proto_add_utf8_string (buffer, ac->application->pathname)) {
823
egg_buffer_add_uint32 (buffer, ac->types_allowed);
832
gkr_proto_decode_result_reply (EggBuffer *buffer, GnomeKeyringResult *result)
839
if (!egg_buffer_get_uint32 (buffer, offset, &offset, &res)) {
848
gkr_proto_decode_result_string_reply (EggBuffer *buffer, GnomeKeyringResult *result,
856
if (!egg_buffer_get_uint32 (buffer, offset, &offset, &res)) {
860
if (!gkr_proto_get_utf8_string (buffer, offset, &offset, str)) {
868
gkr_proto_decode_result_string_list_reply (EggBuffer *buffer, GnomeKeyringResult *result,
873
guint32 list_size, i;
880
if (!egg_buffer_get_uint32 (buffer, offset, &offset, &res)) {
884
if (!egg_buffer_get_uint32 (buffer, offset, &offset, &list_size)) {
888
for (i = 0; i < list_size; i++) {
889
if (!gkr_proto_get_utf8_string (buffer, offset, &offset, &str)) {
892
names = g_list_prepend (names, str);
896
*list = g_list_reverse (names);
901
g_list_foreach (names, (GFunc) g_free, NULL);
907
gkr_proto_decode_find_reply (EggBuffer *buffer, GnomeKeyringResult *result,
913
GnomeKeyringFound *found;
918
if (!egg_buffer_get_uint32 (buffer, offset, &offset, &res)) {
923
if (res != GNOME_KEYRING_RESULT_OK) {
928
while (offset < buffer->len) {
929
found = g_new0 (GnomeKeyringFound, 1);
930
list = g_list_prepend (list, found);
931
if (!gkr_proto_get_utf8_string (buffer, offset, &offset,
935
if (!egg_buffer_get_uint32 (buffer, offset, &offset, &found->item_id)) {
938
if (!gkr_proto_get_utf8_secret (buffer, offset, &offset,
942
if (!gkr_proto_decode_attribute_list (buffer, offset, &offset,
943
&found->attributes)) {
948
*list_out = g_list_reverse (list);
952
g_list_foreach (list, (GFunc)gnome_keyring_found_free, NULL);
957
gkr_proto_decode_find (EggBuffer *buffer, GnomeKeyringItemType *type,
958
GnomeKeyringAttributeList **attributes)
961
GnomeKeyringOpCode op;
964
if (!gkr_proto_decode_packet_operation (buffer, &op)) {
967
if (op != GNOME_KEYRING_OP_FIND) {
972
if (!egg_buffer_get_uint32 (buffer, offset, &offset, &t)) {
976
return gkr_proto_decode_attribute_list (buffer, offset, &offset, attributes);
980
gkr_proto_decode_op_string (EggBuffer *buffer, GnomeKeyringOpCode *op_out,
988
if (!gkr_proto_decode_packet_operation (buffer, op_out)) {
992
if (!gkr_proto_get_utf8_string (buffer, offset, &offset, str1)) {
1006
gkr_proto_decode_op_string_int (EggBuffer *buffer, GnomeKeyringOpCode *op_out,
1007
char **str1, guint32 *val)
1014
if (!gkr_proto_decode_packet_operation (buffer, op_out)) {
1018
if (!gkr_proto_get_utf8_string (buffer, offset, &offset, str1)) {
1022
if (!egg_buffer_get_uint32 (buffer, offset, &offset, val)) {
1036
gkr_proto_decode_get_item_info (EggBuffer *buffer, GnomeKeyringOpCode *op_out,
1037
char **keyring, guint32 *item_id, guint32 *flags)
1041
if (!gkr_proto_decode_packet_operation (buffer, op_out))
1043
if (!gkr_proto_get_utf8_string (buffer, offset, &offset, keyring))
1045
if (!egg_buffer_get_uint32 (buffer, offset, &offset, item_id))
1047
if (*op_out == GNOME_KEYRING_OP_GET_ITEM_INFO_FULL) {
1048
/* Pull in lookup flags/parts, find out which ones */
1049
if (!egg_buffer_get_uint32 (buffer, offset, &offset, flags))
1052
/* All parts of the item by default */
1053
*flags = GNOME_KEYRING_ITEM_INFO_ALL;
1064
gkr_proto_decode_op_string_secret (EggBuffer *buffer, GnomeKeyringOpCode *op_out,
1065
char **str1, char **str2)
1075
if (!gkr_proto_decode_packet_operation (buffer, op_out)) {
1079
if (!gkr_proto_get_utf8_string (buffer, offset, &offset, str1)) {
1082
if (!gkr_proto_get_utf8_secret (buffer, offset, &offset, str2)) {
1100
gkr_proto_decode_op_string_secret_secret (EggBuffer *buffer, GnomeKeyringOpCode *op_out,
1101
char **str1, char **str2, char **str3)
1114
if (!gkr_proto_decode_packet_operation (buffer, op_out)) {
1118
if (!gkr_proto_get_utf8_string (buffer, offset, &offset, str1)) {
1121
if (!gkr_proto_get_utf8_secret (buffer, offset, &offset, str2)) {
1124
if (!gkr_proto_get_utf8_secret (buffer, offset, &offset, str3)) {
1147
gkr_proto_decode_get_attributes_reply (EggBuffer *buffer, GnomeKeyringResult *result,
1148
GnomeKeyringAttributeList **attributes)
1154
if (!egg_buffer_get_uint32 (buffer, offset, &offset, &res)) {
1159
if (res == GNOME_KEYRING_RESULT_OK) {
1160
if (!gkr_proto_decode_attribute_list (buffer, offset, &offset, attributes)) {
1170
gkr_proto_decode_get_acl_reply (EggBuffer *buffer, GnomeKeyringResult *result,
1177
if (!egg_buffer_get_uint32 (buffer, offset, &offset, &res)) {
1182
if (res == GNOME_KEYRING_RESULT_OK) {
1183
if (!gkr_proto_decode_acl (buffer, offset, &offset, acl)) {
1194
gkr_proto_decode_get_item_info_reply (EggBuffer *buffer, GnomeKeyringResult *result,
1195
GnomeKeyringItemInfo **info_out)
1199
GnomeKeyringItemInfo *info;
1200
time_t mtime, ctime;
1207
if (!egg_buffer_get_uint32 (buffer, offset, &offset, &res)) {
1210
if (res == GNOME_KEYRING_RESULT_OK) {
1211
if (!egg_buffer_get_uint32 (buffer, offset, &offset, &type)) {
1214
if (!gkr_proto_get_utf8_string (buffer, offset, &offset, &name)) {
1217
if (!gkr_proto_get_utf8_secret (buffer, offset, &offset, &secret)) {
1222
if (!gkr_proto_get_time (buffer, offset, &offset, &mtime)) {
1224
egg_secure_strfree (secret);
1227
if (!gkr_proto_get_time (buffer, offset, &offset, &ctime)) {
1229
egg_secure_strfree (secret);
1233
info = g_new (GnomeKeyringItemInfo, 1);
1235
info->display_name = name;
1236
info->secret = secret;
1237
info->mtime = mtime;
1238
info->ctime = ctime;
1248
gkr_proto_decode_get_keyring_info_reply (EggBuffer *buffer, GnomeKeyringResult *result,
1249
GnomeKeyringInfo **info_out)
1253
GnomeKeyringInfo *info;
1254
guint32 lock_on_idle, lock_timeout, is_locked;
1255
time_t mtime, ctime;
1260
if (!egg_buffer_get_uint32 (buffer, offset, &offset, &res)) {
1263
if (res == GNOME_KEYRING_RESULT_OK) {
1264
if (!egg_buffer_get_uint32 (buffer, offset, &offset,
1268
if (!egg_buffer_get_uint32 (buffer, offset, &offset,
1272
if (!gkr_proto_get_time (buffer, offset, &offset, &mtime)) {
1275
if (!gkr_proto_get_time (buffer, offset, &offset, &ctime)) {
1278
if (!egg_buffer_get_uint32 (buffer, offset, &offset,
1282
info = g_new (GnomeKeyringInfo, 1);
1283
info->lock_on_idle = lock_on_idle;
1284
info->lock_timeout = lock_timeout;
1285
info->mtime = mtime;
1286
info->ctime = ctime;
1287
info->is_locked = is_locked;
1297
gkr_proto_decode_set_item_info (EggBuffer *buffer, char **keyring, guint32 *item_id,
1298
GnomeKeyringItemType *type, char **display_name,
1302
GnomeKeyringOpCode op;
1306
*display_name = NULL;
1309
if (!gkr_proto_decode_packet_operation (buffer, &op)) {
1312
if (op != GNOME_KEYRING_OP_SET_ITEM_INFO) {
1316
if (!gkr_proto_get_utf8_string (buffer, offset, &offset, keyring)) {
1319
if (!egg_buffer_get_uint32 (buffer, offset, &offset, item_id)) {
1322
if (!egg_buffer_get_uint32 (buffer, offset, &offset, &typeint)) {
1327
if (!gkr_proto_get_utf8_string (buffer, offset, &offset, display_name)) {
1330
if (!gkr_proto_get_utf8_secret (buffer, offset, &offset, secret)) {
1338
g_free (*display_name);
1339
egg_secure_strfree (*secret);
1344
gkr_proto_decode_set_keyring_info (EggBuffer *buffer, char **keyring,
1345
gboolean *lock_on_idle, guint32 *lock_timeout)
1349
GnomeKeyringOpCode op;
1354
if (!gkr_proto_decode_packet_operation (buffer, &op)) {
1357
if (op != GNOME_KEYRING_OP_SET_KEYRING_INFO) {
1361
if (!gkr_proto_get_utf8_string (buffer, offset, &offset, keyring)) {
1364
if (!egg_buffer_get_uint32 (buffer, offset, &offset, &lock_int)) {
1367
*lock_on_idle = lock_int;
1369
if (!egg_buffer_get_uint32 (buffer, offset, &offset, lock_timeout)) {
1381
gkr_proto_decode_set_attributes (EggBuffer *buffer, char **keyring,
1382
guint32 *item_id, GnomeKeyringAttributeList **attributes)
1385
GnomeKeyringOpCode op;
1390
if (!gkr_proto_decode_packet_operation (buffer, &op)) {
1393
if (op != GNOME_KEYRING_OP_SET_ITEM_ATTRIBUTES) {
1397
if (!gkr_proto_get_utf8_string (buffer, offset, &offset, keyring)) {
1400
if (!egg_buffer_get_uint32 (buffer, offset, &offset, item_id)) {
1404
if (!gkr_proto_decode_attribute_list (buffer, offset, &offset, attributes)) {
1417
gkr_proto_decode_set_acl (EggBuffer *buffer, char **keyring, guint32 *item_id,
1421
GnomeKeyringOpCode op;
1426
if (!gkr_proto_decode_packet_operation (buffer, &op)) {
1429
if (op != GNOME_KEYRING_OP_SET_ITEM_ACL) {
1433
if (!gkr_proto_get_utf8_string (buffer, offset, &offset, keyring)) {
1436
if (!egg_buffer_get_uint32 (buffer, offset, &offset, item_id)) {
1440
if (!gkr_proto_decode_acl (buffer, offset, &offset, acl)) {
1452
gkr_proto_decode_prepare_environment (EggBuffer *buffer, gchar ***environment)
1454
GnomeKeyringOpCode op;
1457
if (!gkr_proto_decode_packet_operation (buffer, &op))
1459
if (op != GNOME_KEYRING_OP_PREPARE_ENVIRONMENT)
1464
if (!egg_buffer_get_stringv (buffer, offset, &offset, environment, g_realloc))
1471
gkr_proto_decode_prepare_environment_reply (EggBuffer *buffer, GnomeKeyringResult *result,
1472
char ***environment)
1479
if (!egg_buffer_get_uint32 (buffer, offset, &offset, &res))
1483
if (res == GNOME_KEYRING_RESULT_OK) {
1484
if (!egg_buffer_get_stringv (buffer, offset, &offset, environment, g_realloc))
1492
gkr_proto_decode_result_int_list_reply (EggBuffer *buffer, GnomeKeyringResult *result,
1496
guint32 res, len, i, id;
1502
if (!egg_buffer_get_uint32 (buffer, offset, &offset, &res)) {
1507
if (!egg_buffer_get_uint32 (buffer, offset, &offset, &len)) {
1511
for (i = 0; i < len; i++) {
1512
if (!egg_buffer_get_uint32 (buffer, offset, &offset, &id)) {
1513
g_list_free (*list);
1517
*list = g_list_prepend (*list, GUINT_TO_POINTER (id));
1520
*list = g_list_reverse (*list);
1525
gkr_proto_decode_result_integer_reply (EggBuffer *buffer, GnomeKeyringResult *result,
1533
if (!egg_buffer_get_uint32 (buffer, offset, &offset, &res)) {
1536
if (!egg_buffer_get_uint32 (buffer, offset, &offset, &val)) {
1541
if (integer != NULL) {