Eine aufbereitete Darstellung der Quelle

 
     
 
 
Anforderungen  |   Konzepte  |   Entwurf  |   Entwicklung  |   Qualitätssicherung  |   Lebenszyklus  |   Steuerung
 
 
 
 

Benutzer

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:(__bridge 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






Wurzel

Suchen

PVS Prover

Isabelle Prover


Cephes Mathematical Library

Vienna Development Method

Haftungshinweis

Die Informationen auf dieser Webseite wurden nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit, noch Qualität der bereit gestellten Informationen zugesichert.

Bemerkung:

Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.






                                                                                                                                                                                                                                                                                                                                                                                                     


Neuigkeiten

     Aktuelles
     Motto des Tages

Open Source Software

     Quellcodebibliothek
     Eigene Quellcodes
     Fremde Quellcodes
     Suchen

Jenseits des Üblichen ....
    

Besucherstatistik

Besucherstatistik

Statistik
#Sources=1104851
#Domains=417127