Получение ненужных данных при хранении и доступе к ключу

Мне нужно несколько указаний о следующем. Пожалуйста, проведите меня через него:

Цель: Хранить и получать доступ к ключам шифрования файлов для данного пользователя. Каждый файл будет иметь отдельный ключ шифрования. Таким образом, у пользователя, который хочет зашифровать 10 файлов, будет 10 разных ключей, хранящихся в связке ключей.

Проблема: Я сталкиваюсь с двумя проблемами: 1. Получение ненужных данных при хранении и доступе к ключам 2. Функция обратного вызова не вызывается

Реализация: [ 116]

#include <stdio.h>
#include <gnome-keyring-1/gnome-keyring.h>
#include <gnome-keyring-1/gnome-keyring-memory.h>

GnomeKeyringPasswordSchema my_schema = {
    GNOME_KEYRING_ITEM_GENERIC_SECRET,
    {
        { "user", GNOME_KEYRING_ATTRIBUTE_TYPE_STRING },
        { "file", GNOME_KEYRING_ATTRIBUTE_TYPE_STRING },
        { NULL, 0 }
    }
};

void
stored_password (GnomeKeyringResult res, gpointer user_data)
{
    printf( "DEBUG: StoredPass - BFR\n" );

        /* user_data will be the same as was passed to gnome_keyring_store_password() */
        if (res == GNOME_KEYRING_RESULT_OK)
                printf ("password saved successfully!\n");
        else
                printf ("couldn't save password: %s", gnome_keyring_result_to_message (res));

    printf( "DEBUG: StoredPass - AFR\n" );
}

void
save_my_password()
{
    GnomeKeyringResult res;
    gpointer gp = NULL, gp2 = NULL;

    printf( "DEBUG: SaveMyPass - BFR\n" );

        gp = gnome_keyring_store_password ( &my_schema,         /* The password type */
                                          GNOME_KEYRING_DEFAULT,          /* Where to save it */
                                          "My file encryption password",    /* Password description, displayed to user */
                                          "test1000",                     /* The password itself */
                                          stored_password,                /* A function called when complete */
                                          gp2, NULL,                        /* User data for callback, and destroy notify */

                                          /* Attributes */
                                          "user", "piyush",
                    "file", "abc.txt",
                                          NULL);                 /* Always end with NULL */

    printf( "DEBUG: SaveMyPass - AFR\n" );

    g_assert( gp != NULL );
    printf( "%p %s\n", gp, (char *)gp );
}

/* A callback called when the operation completes */
void
found_password (GnomeKeyringResult res, const gchar* password, gpointer user_data)
{
        /* user_data will be the same as was passed to gnome_keyring_find_password() */
    printf( "DEBUG: FoundPass - BFR\n" );

        if (res == GNOME_KEYRING_RESULT_OK)
                printf ("password found was: %s\n", password);
        else
                printf ("couldn't find password: %s", gnome_keyring_result_to_message (res));

        /* Once this function returns |password| will be freed */
    printf( "DEBUG: FoundPass - AFR\n" );
}

void
find_my_password()
{
    printf( "DEBUG: FindMyPass - BFR\n" );

        gpointer gp = gnome_keyring_find_password ( &my_schema,      /* The password type */
                                         found_password,                 /* A function called when complete */
                                         NULL, NULL,                     /* User data for callback, and destroy notify */

                                          /* Attributes */
                                          "user", "piyush", 
                                          "file", "abc.txt",
                                     NULL);                 /* Always end with NULL */

    printf( "DEBUG: FindMyPass - AFR\n" );
    g_assert( gp != NULL );
    printf( "%p %s\n", gp, (char *)gp );
}

int main() {
    save_my_password();
    find_my_password();
}

Компиляция: gcc gnomekey.c -o gnomekey -lgnome-keyring pkg-config --cflags --libs gnome-keyring-1

Вывод: ./gnomekey

DEBUG: SaveMyPass - BFR
DEBUG: SaveMyPass - AFR
0x8676800 <junk-data>
DEBUG: FindMyPass - BFR
DEBUG: FindMyPass - AFR
0x8676828 <junk-data>
2
задан 21 November 2011 в 18:56

1 ответ

Похоже, вы используете асинхронный API для gnome-keyring. Эти API полагаются на цикл событий glib, выполняемый для получения ответов от демона связки ключей.

Похоже, что ваше приложение не выполняет цикл обработки событий и завершает работу, прежде чем можно будет ответить на ответы на запросы демона набора ключей, что объяснит возникшие проблемы.

Существует два способа решения этой проблемы:

  1. Измените приложение, чтобы оно запускало основной цикл, чтобы оно могло получать ответы.
  2. Используйте синхронные версии API (т. Е. gnome_keyring_store_password_sync и gnome_keyring_find_password_sync), поэтому библиотека вызывает блок, ожидая ответов вместо этого.

Если вы пишете графическое приложение, вы, вероятно, уже делаете (1), поэтому вы используете правильный API. Это может быть просто случай изменения ваших тестовых программ для запуска основного цикла.

Если вы пишете сценарий командной строки, то поведение блокировки, вероятно, не является большой проблемой, поэтому использование синхронного API сделает вашу жизнь намного проще.

0
ответ дан 21 November 2011 в 18:56

Другие вопросы по тегам:

Похожие вопросы: