|
|
|
|
Quelle KKKeychain.m
Sprache: Unknown
|
|
Spracherkennung für: .m vermutete Sprache: Abap {ABAP[72] Python[32] Lisp[30]} [Methode: maximale Elemente, drei Dimensionen]
//
// Copyright 2011- 2012 Kosher Penguin LLC
// Created by Adar Porat ( https://github.com/aporat) on 1/ 16/ 2012.
//
// Licensed under the Apache License, Version 2. 0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2. 0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
# import "KKKeychain.h"
# import <Security/Security.h>
# import "BundleUtil.h"
@ implementation KKKeychain
+ (NSString *)appName
{
NSBundle *bundle = [BundleUtil mainBundle];
NSString *appName = [bundle objectForInfoDictionaryKey:@"CFBundleDisplayName"];
if (!appName) {
appName = [bundle objectForInfoDictionaryKey:@ "CFBundleName"];
}
return appName;
}
+ (BOOL)setString:(NSString *)string forKey:(NSString*)key
{
if ( string == nil || key == nil) {
return NO;
}
key = [NSString stringWithFormat:@ "%@ - %@", [KKKeychain appName], key];
// First check if it already exists, by creating a search dictionary and requesting that
// nothing be returned, and performing the search anyway.
NSMutableDictionary *existsQueryDictionary = [NSMutableDictionary dictionary];
NSData *data = [string dataUsingEncoding:NSUTF8StringEncoding];
[existsQueryDictionary setObject:(__bridge id)kSecClassGenericPassword forKey:(__br idge id)kSecClass];
// Add the keys to the search dict
[existsQueryDictionary setObject:@"service" forKey:(__bridge id)kSecAttrService];
[existsQueryDictionary setObject:key forKey:(__bridge id)kSecAttrAccount];
// Have SecItemCopyMatching return the data even though we're not interested in it (to work around a Citrix Worx bug)
CFTypeRef dataDummy = nil;
[existsQueryDictionary setObject:(id)kCFBooleanTrue forKey:(__bridge id)kSecReturnData];
OSStatus res = SecItemCopyMatching((__bridge CFDictionaryRef)existsQueryDictionary, &dataDummy);
if (dataDummy)
CFRelease(dataDummy);
[existsQueryDictionary removeObjectForKey:(__bridge id)kSecReturnData];
if (res == errSecItemNotFound) {
if (string != nil) {
NSMutableDictionary *addDict = existsQueryDictionary;
[addDict setObject:data forKey:(__bridge id)kSecValueData];
[addDict setObject:(__bridge id)kSecAttrAccessibleAfterFirstUnlock forKey:(__bridge id)kSecAttrAccessible];
res = SecItemAdd((__bridge CFDictionaryRef)addDict, NULL);
NSAssert1(res == errSecSuccess, @"Recieved %ld from SecItemAdd!", (long)res);
}
} else if (res == errSecSuccess) {
// Modify an existing one
// Actually pull it now of the keychain at this point.
NSDictionary *attributeDict = @{
(__bridge id)kSecValueData: data,
(__bridge id)kSecAttrAccessible: (__bridge id)kSecAttrAccessibleAfterFirstUnlock
};
res = SecItemUpdate((__bridge CFDictionaryRef)existsQueryDictionary, (__bridge CFDictionaryRef)attributeDict);
NSAssert1(res == errSecSuccess, @"SecItemUpdated returned %ld!", (long)res);
} else {
NSAssert1(NO, @"Received %ld from SecItemCopyMatching!", (long)res);
}
return YES;
}
+ (NSString*)getStringForKey:(NSString*)key
{
key = [NSString stringWithFormat:@"%@ - %@", [KKKeychain appName], key];
NSMutableDictionary *existsQueryDictionary = [NSMutableDictionary dictionary];
[existsQueryDictionary setObject:(__bridge id)kSecClassGenericPassword forKey:(__bridge id)kSecClass];
// Add the keys to the search dict
[existsQueryDictionary setObject:@"service" forKey:(__bridge id)kSecAttrService];
[existsQueryDictionary setObject:key forKey:(__bridge id)kSecAttrAccount];
// We want the data back!
CFTypeRef data = nil;
[existsQueryDictionary setObject:(id)kCFBooleanTrue forKey:(__bridge id)kSecReturnData];
OSStatus res = SecItemCopyMatching((__bridge CFDictionaryRef)existsQueryDictionary, &pan style='color:red'>data);
if (res == errSecSuccess) {
NSString *string = [[NSString alloc] initWithData:(__bridge NSData*)data encoding:NSUTF8StringEncoding];
CFRelease(data);
return string;
} else {
if (data)
CFRelease(data);
NSAssert1(res == errSecItemNotFound, @"SecItemCopyMatching returned %ld!", (long)res);
}
return nil;
}
+ (void)upgradeAccessibilityForKey:(NSString*)key {
// Check if the accessibility attributes need to be upgraded
NSString *derivedKey = [NSString stringWithFormat:@"%@ - %@", [KKKeychain appName], key];
NSMutableDictionary *queryDictionary = [NSMutableDictionary dictionary];
[queryDictionary setObject:(__bridge id)kSecClassGenericPassword forKey:(__bridge id)kSecClass];
// Add the keys to the search dict
[queryDictionary setObject:@"service" forKey:(__bridge id)kSecAttrService];
[queryDictionary setObject:derivedKey forKey:(__bridge id)kSecAttrAccount];
CFTypeRef attrs = nil;
[queryDictionary setObject:(id)kCFBooleanTrue forKey:(__bridge id)kSecReturnAttributes];
[queryDictionary setObject:(id)kCFBooleanTrue forKey:(__bridge id)kSecReturnData];
OSStatus res = SecItemCopyMatching((__bridge CFDictionaryRef)queryDictionary, &attrs);
if (res == errSecSuccess) {
NSDictionary *attrsDict = (__bridge NSDictionary*)attrs;
if (![[attrsDict objectForKey:(__bridge id)kSecAttrAccessible] isEqualToString:(__bridge NSString*)kSecAttrAccessibleAfterFirstUnlock]) {
// Need to upgrade the accessibility on this key by setting it again
[KKKeychain setString:[[NSString alloc] initWithData:[attrsDict objectForKey:(__bridge id)kSecValueData] encoding:NSUTF8StringEncoding] forKey:key];
}
}
if (attrs)
CFRelease(attrs);
}
@end
¤ Dauer der Verarbeitung: 0.0 Sekunden
(vorverarbeitet am 2026-11-04)
¤
*© Formatika GbR, Deutschland
|
|
2026-11-01
|
|
|
|
|
Neuigkeiten |
| Aktuelles |
| Motto des Tages |
|
Open Source Software |
|
|
|
Jenseits des Üblichen ....
|
|
Besucherstatistik |
|
|
| Statistik |
| #Sources=1104851 |
| #Domains=417127 |
|
|