• Skip to content
  • Skip to link menu
  • KDE API Reference
  • kdelibs-4.14.38 API Reference
  • KDE Home
  • Contact Us
 

KDEUI

  • kdeui
  • util
qosxkeychain.h
Go to the documentation of this file.
1/* This file is part of the KDE project
2 *
3 * Copyright (C) 2014 René Bertin <rjvbertin@gmail.com>
4 *
5 * This library is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU Library General Public
7 * License as published by the Free Software Foundation; either
8 * version 2 of the License, or (at your option) any later version.
9 *
10 * This library is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * Library General Public License for more details.
14 *
15 * You should have received a copy of the GNU Library General Public License
16 * along with this library; see the file COPYING.LIB. If not, write to
17 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
18 * Boston, MA 02110-1301, USA.
19 */
20
21#include <Security/Security.h>
22#include <Security/SecKeychain.h>
23
24namespace {
25 template <typename T>
26 struct CFReleaser {
27 explicit CFReleaser( const T& r ) : ref( r ) {}
28 ~CFReleaser() { if( ref ){ CFRelease( ref ); } }
29 T ref;
30 };
31
32 template <typename T>
33 struct CPPDeleter {
34 explicit CPPDeleter( const T& r ) : ptr( r ) {}
35 ~CPPDeleter() { if( ptr ){ delete ptr; } }
36 T ptr;
37 };
38
39 template <typename T>
40 struct CPPArrayDeleter {
41 explicit CPPArrayDeleter( const T& r ) : ptr( r ) {}
42 ~CPPArrayDeleter() { if( ptr ){ delete[] ptr; } }
43 T ptr;
44 };
45
46 template <typename T>
47 struct CacheOldValue {
48 explicit CacheOldValue( T &var, const T newVal )
49 : oldVal(var), varRef(var)
50 {
51 var = newVal;
52 }
53 ~CacheOldValue()
54 {
55 varRef = oldVal;
56 }
57 T oldVal, &varRef;
58 };
59}
60
61static inline QString asQString( CFStringRef sr )
62{ CFIndex len = CFStringGetLength(sr)*2;
63 const CPPArrayDeleter<char*> buff(new char[len]);
64 if( CFStringGetCString( sr, buff.ptr, len, kCFStringEncodingUTF8 ) ){
65 return QString::fromUtf8(buff.ptr); //RJVB: use UTF8
66 }
67 else if( CFStringGetCString( sr, buff.ptr, len, kCFStringEncodingNonLossyASCII ) ){
68 return QString::fromLocal8Bit(buff.ptr);
69 }
70 else{
71 CFStringGetCString( sr, buff.ptr, len, NULL );
72 return QString::fromLatin1(buff.ptr);
73 }
74}
75
76static inline QString errorString( OSStatus s )
77{
78 const CFReleaser<CFStringRef> ref( SecCopyErrorMessageString( s, NULL ) );
79 return asQString( ref.ref );
80}
81
82static inline bool isError( OSStatus s, QString *errMsg )
83{
84 if( errMsg ){
85 *errMsg = errorString(s);
86 }
87 return s != 0;
88}
89
90class OSXKeychain
91{
92private:
93 SecKeychainRef keyChainRef;
94 QString keyChainPath;
95 bool isDefaultKeychain, generateFolderList;
96
97public:
98 enum EntryType { Unknown='K\?\?\?', Password='KPWD', Map='KMAP', Stream='KSTR' };
99 QString name;
100 QString currentService, lastReadService;
101 QStringList serviceList;
102 bool isKDEChain;
103
104 OSXKeychain();
105 OSXKeychain(const QString &name);
106 virtual ~OSXKeychain();
107
108 inline SecKeychainRef reference()
109 {
110 return keyChainRef;
111 }
112 inline QString &path()
113 {
114 return keyChainPath;
115 }
116 inline bool isDefault()
117 {
118 return isDefaultKeychain;
119 }
120 inline bool isOpen()
121 {
122 return IsOpen(keyChainRef);
123 }
124 inline OSStatus lock()
125 {
126 return Lock(keyChainRef);
127 }
128 inline OSStatus unLock()
129 {
130 return UnLock(keyChainRef);
131 }
132 void close();
133 inline bool hasItem(const QString &key, OSStatus *errReturn, SecKeychainItemRef *itemRef=NULL)
134 {
135 // qDebug() << "OSXKeychain::hasItem(" << key << "): scanning '" << name << "'=" << (void*) keyChainRef;
136 return OSXKeychain::HasItem( key, keyChainRef, errReturn, itemRef );
137 }
138 inline OSStatus readItem(const QString &key, QByteArray *value, SecKeychainItemRef *itemRef=NULL)
139 {
140 return ReadItem( key, value, keyChainRef, itemRef, this );
141 }
142 inline OSStatus itemType(const QString &key, EntryType *entryType)
143 {
144 return ItemType( key, entryType, keyChainRef );
145 }
146 inline OSStatus removeItem(const QString &key)
147 {
148 return RemoveItem( key, keyChainRef );
149 }
150 inline OSStatus writeItem( const QString &key, const QByteArray &value, EntryType *entryType=NULL )
151 {
152 return WriteItem( key, value, keyChainRef, NULL, entryType, this );
153 }
154 inline OSStatus writeItem( const QString &key, const QByteArray &value, const QString &comment,
155 EntryType *entryType=NULL )
156 {
157 return WriteItem( key, value, comment, keyChainRef, entryType, this );
158 }
159 inline OSStatus itemList( QStringList &keyList )
160 {
161 return ItemList( keyChainRef, keyList, this );
162 }
163 inline QStringList folderList()
164 {
165 QStringList r;
166 CacheOldValue<bool> gFL(generateFolderList, true);
167 ItemList( keyChainRef, r, this );
168 r.clear();
169 return serviceList;
170 }
171 OSStatus renameItem(const QString &currentKey, const QString &newKey);
172
173#pragma mark ==== class methods aka static member functions ====
174 static OSStatus KeychainList(QStringList &theList);
175 static QString Path(const SecKeychainRef keychain);
176 static bool IsOpen(const SecKeychainRef keychain);
177 static bool IsOpen(const QString& name);
178 static OSStatus UnLock(const SecKeychainRef keychain);
179 static OSStatus Lock(const SecKeychainRef keychain);
180 static OSStatus Lock(const QString &walletName);
186 static bool HasItem(const QString &key,
187 const SecKeychainRef keychain, OSStatus *errReturn, SecKeychainItemRef *itemRef);
188 static OSStatus ReadItem(const QString &key, QByteArray *value,
189 const SecKeychainRef keychain, SecKeychainItemRef *itemRef=NULL, OSXKeychain *osxKeyChain=NULL);
190 static OSStatus ItemType(const QString &key, EntryType *entryType,
191 const SecKeychainRef keychain);
192 static OSStatus RemoveItem(const QString &key, const SecKeychainRef keychain);
193 static OSStatus WriteItem( const QString &key, const QByteArray &value,
194 const SecKeychainRef keychain, SecKeychainItemRef *itemRef=NULL, EntryType *entryType=NULL, OSXKeychain *osxKeyChain=NULL );
195 static OSStatus WriteItem( const QString& key, const QByteArray& value,
196 const QString& comment, const SecKeychainRef keychain, EntryType *entryType, OSXKeychain *osxKeyChain=NULL );
197 static OSStatus ItemList( const SecKeychainRef keychain, QStringList &keyList, OSXKeychain *osxKeyChain=NULL );
198 static OSStatus Destroy( SecKeychainRef *keychain );
199 static OSStatus Destroy( const QString &walletName );
200};
OSXKeychain
Definition: qosxkeychain.h:91
OSXKeychain::writeItem
OSStatus writeItem(const QString &key, const QByteArray &value, EntryType *entryType=NULL)
Definition: qosxkeychain.h:150
OSXKeychain::currentService
QString currentService
Definition: qosxkeychain.h:100
OSXKeychain::itemType
OSStatus itemType(const QString &key, EntryType *entryType)
Definition: qosxkeychain.h:142
OSXKeychain::IsOpen
static bool IsOpen(const SecKeychainRef keychain)
Definition: qosxkeychain.cpp:261
OSXKeychain::writeItem
OSStatus writeItem(const QString &key, const QByteArray &value, const QString &comment, EntryType *entryType=NULL)
Definition: qosxkeychain.h:154
OSXKeychain::UnLock
static OSStatus UnLock(const SecKeychainRef keychain)
Definition: qosxkeychain.cpp:295
OSXKeychain::path
QString & path()
Definition: qosxkeychain.h:112
OSXKeychain::ItemList
static OSStatus ItemList(const SecKeychainRef keychain, QStringList &keyList, OSXKeychain *osxKeyChain=NULL)
Definition: qosxkeychain.cpp:613
OSXKeychain::ItemType
static OSStatus ItemType(const QString &key, EntryType *entryType, const SecKeychainRef keychain)
Definition: qosxkeychain.cpp:443
OSXKeychain::removeItem
OSStatus removeItem(const QString &key)
Definition: qosxkeychain.h:146
OSXKeychain::OSXKeychain
OSXKeychain()
Definition: qosxkeychain.cpp:147
OSXKeychain::RemoveItem
static OSStatus RemoveItem(const QString &key, const SecKeychainRef keychain)
Definition: qosxkeychain.cpp:506
OSXKeychain::isKDEChain
bool isKDEChain
Definition: qosxkeychain.h:102
OSXKeychain::Path
static QString Path(const SecKeychainRef keychain)
Definition: qosxkeychain.cpp:250
OSXKeychain::name
QString name
Definition: qosxkeychain.h:99
OSXKeychain::lastReadService
QString lastReadService
Definition: qosxkeychain.h:100
OSXKeychain::Lock
static OSStatus Lock(const SecKeychainRef keychain)
Definition: qosxkeychain.cpp:310
OSXKeychain::readItem
OSStatus readItem(const QString &key, QByteArray *value, SecKeychainItemRef *itemRef=NULL)
Definition: qosxkeychain.h:138
OSXKeychain::EntryType
EntryType
Definition: qosxkeychain.h:98
OSXKeychain::Password
@ Password
Definition: qosxkeychain.h:98
OSXKeychain::Stream
@ Stream
Definition: qosxkeychain.h:98
OSXKeychain::Unknown
@ Unknown
Definition: qosxkeychain.h:98
OSXKeychain::Map
@ Map
Definition: qosxkeychain.h:98
OSXKeychain::itemList
OSStatus itemList(QStringList &keyList)
Definition: qosxkeychain.h:159
OSXKeychain::folderList
QStringList folderList()
Definition: qosxkeychain.h:163
OSXKeychain::HasItem
static bool HasItem(const QString &key, const SecKeychainRef keychain, OSStatus *errReturn, SecKeychainItemRef *itemRef)
use the keychain search functions to find the first matching item, if any, returning True if found.
Definition: qosxkeychain.cpp:343
OSXKeychain::close
void close()
Definition: qosxkeychain.cpp:197
OSXKeychain::Destroy
static OSStatus Destroy(SecKeychainRef *keychain)
Definition: qosxkeychain.cpp:700
OSXKeychain::renameItem
OSStatus renameItem(const QString &currentKey, const QString &newKey)
Definition: qosxkeychain.cpp:210
OSXKeychain::serviceList
QStringList serviceList
Definition: qosxkeychain.h:101
OSXKeychain::isOpen
bool isOpen()
Definition: qosxkeychain.h:120
OSXKeychain::WriteItem
static OSStatus WriteItem(const QString &key, const QByteArray &value, const SecKeychainRef keychain, SecKeychainItemRef *itemRef=NULL, EntryType *entryType=NULL, OSXKeychain *osxKeyChain=NULL)
Definition: qosxkeychain.cpp:525
OSXKeychain::unLock
OSStatus unLock()
Definition: qosxkeychain.h:128
OSXKeychain::~OSXKeychain
virtual ~OSXKeychain()
Definition: qosxkeychain.cpp:205
OSXKeychain::isDefault
bool isDefault()
Definition: qosxkeychain.h:116
OSXKeychain::KeychainList
static OSStatus KeychainList(QStringList &theList)
Definition: qosxkeychain.cpp:232
OSXKeychain::lock
OSStatus lock()
Definition: qosxkeychain.h:124
OSXKeychain::hasItem
bool hasItem(const QString &key, OSStatus *errReturn, SecKeychainItemRef *itemRef=NULL)
Definition: qosxkeychain.h:133
OSXKeychain::ReadItem
static OSStatus ReadItem(const QString &key, QByteArray *value, const SecKeychainRef keychain, SecKeychainItemRef *itemRef=NULL, OSXKeychain *osxKeyChain=NULL)
Definition: qosxkeychain.cpp:384
OSXKeychain::reference
SecKeychainRef reference()
Definition: qosxkeychain.h:108
T
#define T
currentKey
static const char * currentKey
Definition: kviewstatesaver.cpp:35
ref
void ref()
isError
static bool isError(OSStatus s, QString *errMsg)
Definition: qosxkeychain.h:82
asQString
static QString asQString(CFStringRef sr)
Definition: qosxkeychain.h:61
errorString
static QString errorString(OSStatus s)
Definition: qosxkeychain.h:76
This file is part of the KDE documentation.
Documentation copyright © 1996-2023 The KDE developers.
Generated on Mon Feb 20 2023 00:00:00 by doxygen 1.9.6 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

KDEUI

Skip menu "KDEUI"
  • Main Page
  • Namespace List
  • Namespace Members
  • Alphabetical List
  • Class List
  • Class Hierarchy
  • Class Members
  • File List
  • File Members
  • Modules
  • Related Pages

kdelibs-4.14.38 API Reference

Skip menu "kdelibs-4.14.38 API Reference"
  • DNSSD
  • Interfaces
  •   KHexEdit
  •   KMediaPlayer
  •   KSpeech
  •   KTextEditor
  • kconf_update
  • KDE3Support
  •   KUnitTest
  • KDECore
  • KDED
  • KDEsu
  • KDEUI
  • KDEWebKit
  • KDocTools
  • KFile
  • KHTML
  • KImgIO
  • KInit
  • kio
  • KIOSlave
  • KJS
  •   KJS-API
  •   WTF
  • kjsembed
  • KNewStuff
  • KParts
  • KPty
  • Kross
  • KUnitConversion
  • KUtils
  • Nepomuk
  • Plasma
  • Solid
  • Sonnet
  • ThreadWeaver
Report problems with this website to our bug tracking system.
Contact the specific authors with questions and comments about the page contents.

KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal