FRAIdentityDatabaseSQLiteOperations.m revision 6ca6bef8bd63e8c1fd132e38f8e3904b8d2ad172
fc9bee101f530464b5da5a9602697f40a91c5c50Diego Colantoni/*
415243fbc81341293a852ff6aa14e9608d08685cCraig McDonnell * The contents of this file are subject to the terms of the Common Development and
415243fbc81341293a852ff6aa14e9608d08685cCraig McDonnell * Distribution License (the License). You may not use this file except in compliance with the
415243fbc81341293a852ff6aa14e9608d08685cCraig McDonnell * License.
415243fbc81341293a852ff6aa14e9608d08685cCraig McDonnell *
415243fbc81341293a852ff6aa14e9608d08685cCraig McDonnell * You can obtain a copy of the License at legal/CDDLv1.0.txt. See the License for the
415243fbc81341293a852ff6aa14e9608d08685cCraig McDonnell * specific language governing permission and limitations under the License.
415243fbc81341293a852ff6aa14e9608d08685cCraig McDonnell *
415243fbc81341293a852ff6aa14e9608d08685cCraig McDonnell * When distributing Covered Software, include this CDDL Header Notice in each file and include
415243fbc81341293a852ff6aa14e9608d08685cCraig McDonnell * the License file at legal/CDDLv1.0.txt. If applicable, add the following below the CDDL
415243fbc81341293a852ff6aa14e9608d08685cCraig McDonnell * Header, with the fields enclosed by brackets [] replaced by your own identifying
415243fbc81341293a852ff6aa14e9608d08685cCraig McDonnell * information: "Portions copyright [year] [name of copyright owner]".
415243fbc81341293a852ff6aa14e9608d08685cCraig McDonnell *
415243fbc81341293a852ff6aa14e9608d08685cCraig McDonnell * Copyright 2016 ForgeRock AS.
415243fbc81341293a852ff6aa14e9608d08685cCraig McDonnell */
415243fbc81341293a852ff6aa14e9608d08685cCraig McDonnell
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott#import "FMDatabase.h"
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott#import "FRAError.h"
caa9e77dc369fea8df9ae2c598d3c83b7214c1cfDiego Colantoni#import "FRAFMDatabaseConnectionHelper.h"
caa9e77dc369fea8df9ae2c598d3c83b7214c1cfDiego Colantoni#import "FRAHotpOathMechanism.h"
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott#import "FRAIdentity.h"
415243fbc81341293a852ff6aa14e9608d08685cCraig McDonnell#import "FRAIdentityDatabaseSQLiteOperations.h"
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott#import "FRAMechanism.h"
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott#import "FRANotification.h"
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott#import "FRAOathCode.h"
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott#import "FRAPushMechanism.h"
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott#import "FRASerialization.h"
caa9e77dc369fea8df9ae2c598d3c83b7214c1cfDiego Colantoni#import "FRATotpOathMechanism.h"
415243fbc81341293a852ff6aa14e9608d08685cCraig McDonnell
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott@implementation FRAIdentityDatabaseSQLiteOperations {
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott FRAFMDatabaseConnectionHelper *sqlDatabase;
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott}
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott#pragma mark -
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott#pragma Life cycle Functions
415243fbc81341293a852ff6aa14e9608d08685cCraig McDonnell
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott- (instancetype)initWithDatabase:(FRAFMDatabaseConnectionHelper *)database {
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott self = [super init];
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott if (self) {
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott sqlDatabase = database;
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott }
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott return self;
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott}
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott#pragma mark -
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott#pragma SQL Functions
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott- (BOOL)performStatement:(NSString *)schema withValues:(NSArray *)values error:(NSError * __autoreleasing *)error {
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott // Get schema
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott NSString *sql = [FRAFMDatabaseConnectionHelper readSchema:schema withError:error];
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott if (sql == nil) {
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott return NO;
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott }
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott // Open Database
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott FMDatabase *database;
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott @try {
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott database = [sqlDatabase getConnectionWithError:error];
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott if (database == nil) {
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott return NO;
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott }
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott // Perform update
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott BOOL result = [database executeUpdate:sql values:values error:error];
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott NSLog(@"Result: %@\nValues: %@\nSQL: %@", result ? @"YES" : @"NO", values, sql);
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott return result;
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott }
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott @finally {
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott [sqlDatabase closeConnectionToDatabase:database];
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott }
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott}
415243fbc81341293a852ff6aa14e9608d08685cCraig McDonnell
415243fbc81341293a852ff6aa14e9608d08685cCraig McDonnell#pragma mark -
415243fbc81341293a852ff6aa14e9608d08685cCraig McDonnell#pragma mark Identity Functions
415243fbc81341293a852ff6aa14e9608d08685cCraig McDonnell
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott- (BOOL)insertIdentity:(FRAIdentity *)identity error:(NSError *__autoreleasing *)error {
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott NSMutableArray *arguments = [[NSMutableArray alloc] init];
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott // Issuer
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott [arguments addObject:[FRASerialization nonNilString:identity.issuer]];
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott // Account Name
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott [arguments addObject:[FRASerialization nonNilString:identity.accountName]];
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott // Image URL
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott if (identity.image) {
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott NSURL *imageUrl = identity.image;
fc9bee101f530464b5da5a9602697f40a91c5c50Diego Colantoni [arguments addObject:[imageUrl absoluteString]];
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott } else {
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott [arguments addObject:[NSNull null]];
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott }
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott // Background Color
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott if (identity.backgroundColor) {
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott [arguments addObject:identity.backgroundColor];
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott } else {
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott [arguments addObject:[NSNull null]];
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott }
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott return [self performStatement:@"insert_identity" withValues:arguments error:error];
415243fbc81341293a852ff6aa14e9608d08685cCraig McDonnell}
415243fbc81341293a852ff6aa14e9608d08685cCraig McDonnell
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott- (BOOL)deleteIdentity:(FRAIdentity *)identity error:(NSError *__autoreleasing *)error {
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott NSMutableArray* arguments = [[NSMutableArray alloc] init];
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott // Issuer
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott [arguments addObject:[FRASerialization nonNilString:identity.issuer]];
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott // Account Name
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott [arguments addObject:[FRASerialization nonNilString:identity.accountName]];
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott return [self performStatement:@"delete_identity" withValues:arguments error:error];
415243fbc81341293a852ff6aa14e9608d08685cCraig McDonnell}
415243fbc81341293a852ff6aa14e9608d08685cCraig McDonnell
415243fbc81341293a852ff6aa14e9608d08685cCraig McDonnell#pragma mark -
415243fbc81341293a852ff6aa14e9608d08685cCraig McDonnell#pragma mark Mechanism Functions
415243fbc81341293a852ff6aa14e9608d08685cCraig McDonnell
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott- (BOOL)insertMechanism:(FRAMechanism *)mechanism error:(NSError *__autoreleasing *)error {
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott NSMutableArray *arguments = [[NSMutableArray alloc] init];
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott FRAIdentity *parent = mechanism.parent;
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott // idIssuer
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott [arguments addObject:[FRASerialization nonNilString:parent.issuer]];
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott // idAccountName
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott [arguments addObject:[FRASerialization nonNilString:parent.accountName]];
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott // mechanismUID - Special case for PushMechanism
caa9e77dc369fea8df9ae2c598d3c83b7214c1cfDiego Colantoni if ([mechanism isKindOfClass:[FRAHotpOathMechanism class]] || [mechanism isKindOfClass:[FRATotpOathMechanism class]]) {
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott [arguments addObject:[NSNull null]];
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott } else if ([mechanism isKindOfClass:[FRAPushMechanism class]]) {
caa9e77dc369fea8df9ae2c598d3c83b7214c1cfDiego Colantoni FRAPushMechanism *pushMechanism = (FRAPushMechanism*)mechanism;
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott [arguments addObject:[FRASerialization nonNilString:pushMechanism.mechanismUID]];
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott } else {
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott @throw [FRAError createIllegalStateException:@"Unrecognised class of Mechanism"];
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott }
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott
caa9e77dc369fea8df9ae2c598d3c83b7214c1cfDiego Colantoni // Mechanism Type
caa9e77dc369fea8df9ae2c598d3c83b7214c1cfDiego Colantoni [arguments addObject:[FRASerialization nonNilString:[[mechanism class] mechanismType]]];
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott // Version
caa9e77dc369fea8df9ae2c598d3c83b7214c1cfDiego Colantoni [arguments addObject:[NSNumber numberWithInteger:mechanism.version]];
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott // Options
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott NSMutableDictionary *options = [[NSMutableDictionary alloc] init];
caa9e77dc369fea8df9ae2c598d3c83b7214c1cfDiego Colantoni if ([mechanism isKindOfClass:[FRAHotpOathMechanism class]]) {
caa9e77dc369fea8df9ae2c598d3c83b7214c1cfDiego Colantoni FRAHotpOathMechanism *hotpOathMechanism = (FRAHotpOathMechanism *)mechanism;
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott // Secret Key
0fc1bec9becddcbec0d26541dd7ef40b43c0a67bKen Stubbings NSString *base64Key = [FRASerialization serializeSecret:hotpOathMechanism.secretKey];
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott [options setObject:[FRASerialization nonNilString:base64Key] forKey:OATH_MECHANISM_SECRET];
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott // Algorithm
caa9e77dc369fea8df9ae2c598d3c83b7214c1cfDiego Colantoni NSString *algorithm = [FRAOathCode asString:hotpOathMechanism.algorithm];
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott [options setObject:[FRASerialization nonNilString:algorithm] forKey:OATH_MECHANISM_ALGORITHM];
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott
caa9e77dc369fea8df9ae2c598d3c83b7214c1cfDiego Colantoni // Code Length
caa9e77dc369fea8df9ae2c598d3c83b7214c1cfDiego Colantoni NSString *digitsString = [[NSNumber numberWithUnsignedInteger:hotpOathMechanism.codeLength] stringValue];
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott [options setObject:[FRASerialization nonNilString:digitsString] forKey:OATH_MECHANISM_DIGITS];
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott // Counter
caa9e77dc369fea8df9ae2c598d3c83b7214c1cfDiego Colantoni NSString *counterString = [[NSNumber numberWithUnsignedLongLong:hotpOathMechanism.counter] stringValue];
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott [options setObject:[FRASerialization nonNilString:counterString] forKey:OATH_MECHANISM_COUNTER];
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott
caa9e77dc369fea8df9ae2c598d3c83b7214c1cfDiego Colantoni } else if ([mechanism isKindOfClass:[FRATotpOathMechanism class]]) {
caa9e77dc369fea8df9ae2c598d3c83b7214c1cfDiego Colantoni FRATotpOathMechanism *totpOathMechanism = (FRATotpOathMechanism *)mechanism;
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott
caa9e77dc369fea8df9ae2c598d3c83b7214c1cfDiego Colantoni // Secret Key
6ca6bef8bd63e8c1fd132e38f8e3904b8d2ad172Ken Stubbings NSString *base64Key = [FRASerialization serializeSecret:totpOathMechanism.secretKey];
caa9e77dc369fea8df9ae2c598d3c83b7214c1cfDiego Colantoni [options setObject:[FRASerialization nonNilString:base64Key] forKey:OATH_MECHANISM_SECRET];
caa9e77dc369fea8df9ae2c598d3c83b7214c1cfDiego Colantoni
caa9e77dc369fea8df9ae2c598d3c83b7214c1cfDiego Colantoni // Algorithm
caa9e77dc369fea8df9ae2c598d3c83b7214c1cfDiego Colantoni NSString *algorithm = [FRAOathCode asString:totpOathMechanism.algorithm];
caa9e77dc369fea8df9ae2c598d3c83b7214c1cfDiego Colantoni [options setObject:[FRASerialization nonNilString:algorithm] forKey:OATH_MECHANISM_ALGORITHM];
caa9e77dc369fea8df9ae2c598d3c83b7214c1cfDiego Colantoni
caa9e77dc369fea8df9ae2c598d3c83b7214c1cfDiego Colantoni // Code Length
caa9e77dc369fea8df9ae2c598d3c83b7214c1cfDiego Colantoni NSString *digitsString = [[NSNumber numberWithUnsignedInteger:totpOathMechanism.codeLength] stringValue];
caa9e77dc369fea8df9ae2c598d3c83b7214c1cfDiego Colantoni [options setObject:[FRASerialization nonNilString:digitsString] forKey:OATH_MECHANISM_DIGITS];
caa9e77dc369fea8df9ae2c598d3c83b7214c1cfDiego Colantoni
caa9e77dc369fea8df9ae2c598d3c83b7214c1cfDiego Colantoni // Period
caa9e77dc369fea8df9ae2c598d3c83b7214c1cfDiego Colantoni NSString *periodString = [[NSNumber numberWithUnsignedInteger:totpOathMechanism.period] stringValue];
caa9e77dc369fea8df9ae2c598d3c83b7214c1cfDiego Colantoni [options setObject:[FRASerialization nonNilString:periodString] forKey:OATH_MECHANISM_PERIOD];
6ca6bef8bd63e8c1fd132e38f8e3904b8d2ad172Ken Stubbings
caa9e77dc369fea8df9ae2c598d3c83b7214c1cfDiego Colantoni } else if ([mechanism isKindOfClass:[FRAPushMechanism class]]) {
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott FRAPushMechanism *pushMechanism = (FRAPushMechanism *)mechanism;
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott // Secret Key as String
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott [options setObject:[FRASerialization nonNilString:pushMechanism.secret] forKey:PUSH_MECHANISM_SECRET];
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott // Auth Endpoint as String
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott [options setObject:[FRASerialization nonNilString:pushMechanism.authEndpoint] forKey:PUSH_MECHANISM_AUTH_END_POINT];
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott // Version integer as String
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott NSString *versionString = [[NSNumber numberWithInteger:pushMechanism.version] stringValue];
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott [options setObject:[FRASerialization nonNilString:versionString] forKey:PUSH_MECHANISM_VERSION];
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott } else {
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott @throw [FRAError createIllegalStateException:@"Unrecognised class of Mechanism"];
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott }
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott // Convert options to JSON
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott NSString *jsonString;
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott if (![FRASerialization serializeMap:options intoString:&jsonString error:error]) {
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott return NO;
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott }
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott [arguments addObject:jsonString];
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott return [self performStatement:@"insert_mechanism" withValues:arguments error:error];
415243fbc81341293a852ff6aa14e9608d08685cCraig McDonnell}
415243fbc81341293a852ff6aa14e9608d08685cCraig McDonnell
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott- (BOOL)deleteMechanism:(FRAMechanism *)mechanism error:(NSError *__autoreleasing *)error {
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott NSMutableArray *arguments = [[NSMutableArray alloc] init];
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott FRAIdentity *parent = mechanism.parent;
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott // Issuer
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott [arguments addObject:[FRASerialization nonNilString:parent.issuer]];
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott // Account Name
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott [arguments addObject:[FRASerialization nonNilString:parent.accountName]];
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott
caa9e77dc369fea8df9ae2c598d3c83b7214c1cfDiego Colantoni // Mechanism Type
caa9e77dc369fea8df9ae2c598d3c83b7214c1cfDiego Colantoni [arguments addObject:[FRASerialization nonNilString:[[mechanism class] mechanismType]]];
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott return [self performStatement:@"delete_mechanism" withValues:arguments error:error];
415243fbc81341293a852ff6aa14e9608d08685cCraig McDonnell}
415243fbc81341293a852ff6aa14e9608d08685cCraig McDonnell
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott- (BOOL)updateMechanism:(FRAMechanism *)mechanism error:(NSError *__autoreleasing *)error {
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott return [self insertMechanism:mechanism error:error];
415243fbc81341293a852ff6aa14e9608d08685cCraig McDonnell}
415243fbc81341293a852ff6aa14e9608d08685cCraig McDonnell
415243fbc81341293a852ff6aa14e9608d08685cCraig McDonnell#pragma mark -
415243fbc81341293a852ff6aa14e9608d08685cCraig McDonnell#pragma mark Notification Functions
415243fbc81341293a852ff6aa14e9608d08685cCraig McDonnell
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott- (BOOL)insertNotification:(FRANotification *)notification error:(NSError *__autoreleasing *)error {
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott NSMutableArray* arguments = [[NSMutableArray alloc] init];
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott FRAMechanism *parent = notification.parent;
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott // mechanismUID
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott NSString *mechanismUID;
caa9e77dc369fea8df9ae2c598d3c83b7214c1cfDiego Colantoni if ([parent isKindOfClass:[FRAHotpOathMechanism class]] || [parent isKindOfClass:[FRATotpOathMechanism class]]) {
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott mechanismUID = nil;
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott } else if ([parent isKindOfClass:[FRAPushMechanism class]]) {
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott FRAPushMechanism *pushMechanism = (FRAPushMechanism *)parent;
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott mechanismUID = pushMechanism.mechanismUID;
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott } else {
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott @throw [[NSException alloc] initWithName:@"Illegal State" reason:@"Unrecognised class of Mechanism" userInfo:nil];
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott }
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott [arguments addObject:[FRASerialization nonNilString:mechanismUID]];
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott // timeReceived
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott [arguments addObject:[FRASerialization nonNilDate:notification.timeReceived]];
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott // timeExpired
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott [arguments addObject:[FRASerialization nonNilDate:notification.timeExpired]];
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott // Data Json Map
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott NSMutableDictionary *dataMap = [[NSMutableDictionary alloc] init];
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott // Data: Message ID
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott [dataMap setObject:notification.messageId forKey:NOTIFICATION_MESSAGE_ID];
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott // Data: Push Challenge
465ea459a87d4605e145d8f45b6a9c104b696e3bCraig McDonnell [dataMap setObject:notification.challenge forKey:NOTIFICATION_PUSH_CHALLENGE];
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott // Data: Time to Live
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott NSString *ttlString = [NSString stringWithFormat:@"%f", notification.timeToLive];
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott [dataMap setObject:ttlString forKey:NOTIFICATION_TIME_TO_LIVE];
5d37db6a3aca50ba14cba8909d3ae44f7d43e407Ken Stubbings
5d37db6a3aca50ba14cba8909d3ae44f7d43e407Ken Stubbings // Data: Load Balancer cookie
5d37db6a3aca50ba14cba8909d3ae44f7d43e407Ken Stubbings [dataMap setObject:notification.loadBalancerCookie forKey:NOTIFICATION_LOAD_BALANCER_COOKIE];
5d37db6a3aca50ba14cba8909d3ae44f7d43e407Ken Stubbings
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott // Convert map to JSON
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott NSString *jsonString;
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott if (![FRASerialization serializeMap:dataMap intoString:&jsonString error:error]) {
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott return NO;
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott }
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott [arguments addObject:jsonString];
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott // pending
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott [arguments addObject:[NSNumber numberWithBool:[notification isPending]]];
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott // approved
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott [arguments addObject:[NSNumber numberWithBool:[notification isApproved]]];
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott return [self performStatement:@"insert_notification" withValues:arguments error:error];
415243fbc81341293a852ff6aa14e9608d08685cCraig McDonnell}
415243fbc81341293a852ff6aa14e9608d08685cCraig McDonnell
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott- (BOOL)deleteNotification:(FRANotification *)notification error:(NSError *__autoreleasing *)error {
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott NSMutableArray *arguments = [[NSMutableArray alloc] init];
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott FRAMechanism *parent = notification.parent;
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott // mechanismUID
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott NSString *mechanismUID;
caa9e77dc369fea8df9ae2c598d3c83b7214c1cfDiego Colantoni if ([parent isKindOfClass:[FRAHotpOathMechanism class]] || [parent isKindOfClass:[FRATotpOathMechanism class]]) {
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott mechanismUID = nil;
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott } else if ([parent isKindOfClass:[FRAPushMechanism class]]) {
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott FRAPushMechanism *pushMechanism = (FRAPushMechanism *)parent;
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott mechanismUID = pushMechanism.mechanismUID;
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott } else {
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott @throw [[NSException alloc] initWithName:@"Illegal State" reason:@"Unrecognised class of Mechanism" userInfo:nil];
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott }
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott [arguments addObject:[FRASerialization nonNilString:mechanismUID]];
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott // timeReceived
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott [arguments addObject:[FRASerialization nonNilDate:notification.timeReceived]];
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott return [self performStatement:@"delete_notification" withValues:arguments error:error];
415243fbc81341293a852ff6aa14e9608d08685cCraig McDonnell}
415243fbc81341293a852ff6aa14e9608d08685cCraig McDonnell
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott- (BOOL)updateNotification:(FRANotification *)notification error:(NSError *__autoreleasing *)error {
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott return [self insertNotification:notification error:error];
415243fbc81341293a852ff6aa14e9608d08685cCraig McDonnell}
415243fbc81341293a852ff6aa14e9608d08685cCraig McDonnell
415243fbc81341293a852ff6aa14e9608d08685cCraig McDonnell
415243fbc81341293a852ff6aa14e9608d08685cCraig McDonnell@end