SecKeychainFindGenericPassord завершается с ошибкой errSecItemNotFound - PullRequest
0 голосов
/ 24 февраля 2020

Пытаясь получить доступ к цепочке для ключей с целью получения учетных данных прокси в MacOs-Catalina, я не могу получить что-либо из-за errSecItemNotFound или " Указанный элемент не найден в цепочке для ключей."

Однако, получая доступ к цепочке для ключей через Keychain Access, я могу отфильтровать и просмотреть заданные учетные данные.

В конечном итоге вопрос: Как получить доступ к цепочке для ключей для получения учетных данных прокси-сервера?
Но, в частности: Какую концепцию я пропускаю? Что не так с этим?

Ниже приведен минимальный код для тестирования:

#include <iostream>
#include <CoreFoundation/CoreFoundation.h>
#include <Security/Security.h>
#include <Security/SecKeychain.h>

using namespace std;

/// CFSTR equivalent, not throwing old-c cast warning.
#define CFSTRv2(cStr) (reinterpret_cast<const CFStringRef>(\
    __builtin___CFStringMakeConstantString ("" cStr "")))


std::string getPasswordForService(const std::string& service)
{
    std::string account="collector";
    char* buffer=nullptr;
    uint32_t size=0;


    auto errorCode = SecKeychainFindGenericPassword (
                nullptr,//CFSTRv2("login"), 
                static_cast<uint32_t>(service.size()),  
                service.c_str(), 
                static_cast<uint32_t>(account.size()), 
                account.c_str(), 
                &size,
                reinterpret_cast<void**>(&buffer), 
                nullptr);

    if (errorCode != errSecSuccess)
    {
        //cerr << CFStringRefToStdString(SecCopyErrorMessageString(errorCode, nullptr),
        //    "no-error-string") << endl;
        cerr << "Error returned: " << static_cast<int>(errorCode) << endl;
    }

    std::string result(buffer, size);

    return result;
}

int main(int, char*[])
{
    std::string service{"proxy_test"};
    auto password = getPasswordForService(service);
    cout << "Passoword for: " <<service << " : " << password << endl;
}

Также здесь представлен скриншот хранилища ключей:

enter image description here

Наконец, и только если это облегчит вашу жизнь, вот CMakeFile:

cmake_minimum_required(VERSION 3.0)

if (APPLE)
    set(CMAKE_OSX_DEPLOYMENT_TARGET "10.12" CACHE STRING "Minimum OS X deployment version")
endif()

project("Password_support")
set(CMAKE_CXX_STANDARD 17)

set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -framework Foundation -framework Security")

find_library(CORE_FOUNDATION CoreFoundation)

set ( TESTCPP password.cpp )
set ( LIBS ${CORE_FOUNDATION})

if (APPLE)
    add_executable( ${PROJECT_NAME} ${TESTCPP} ) 
    target_link_libraries(${PROJECT_NAME} ${LIBS})
endif()

Ниже приведены некоторые связанные вопросы, которые помогают, но не отвечают на мой вопрос:

1 Ответ

0 голосов
/ 24 февраля 2020

Проблема была связана с функцией, используемой для восстановления пароля: SecKeychainGenericPassword. Прокси - это технология inte rnet, и, как следствие, пароль хранится в другом kind, что бы это ни значило.

Правильная функция для его получения - SecKeychainFindInternetPassword

auto errorCode = SecKeychainFindInternetPassword (
            nullptr,

            static_cast<uint32_t>(service.size()),  
            service.c_str(), 

            static_cast<uint32_t>(0),
            nullptr,

            static_cast<uint32_t>(0), 
            nullptr, 

            static_cast<uint32_t>(0),
            nullptr,

            static_cast<uint16_t>(1080),

            SecProtocolType::kSecProtocolTypeAny,
            SecAuthenticationType::kSecAuthenticationTypeAny,
            &size,
            reinterpret_cast<void**>(&buffer), 
            nullptr);

Заметка: убейте моего сотрудника, если он когда-нибудь напишет функцию с таким количеством параметров (шутка)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...