FRAMessageUtils.m revision b3a21de0a0e0a5dea71bece7e5c0356700136fbc
b3a21de0a0e0a5dea71bece7e5c0356700136fbcDiego Colantoni/*
b3a21de0a0e0a5dea71bece7e5c0356700136fbcDiego Colantoni * The contents of this file are subject to the terms of the Common Development and
b3a21de0a0e0a5dea71bece7e5c0356700136fbcDiego Colantoni * Distribution License (the License). You may not use this file except in compliance with the
b3a21de0a0e0a5dea71bece7e5c0356700136fbcDiego Colantoni * License.
b3a21de0a0e0a5dea71bece7e5c0356700136fbcDiego Colantoni *
b3a21de0a0e0a5dea71bece7e5c0356700136fbcDiego Colantoni * You can obtain a copy of the License at legal/CDDLv1.0.txt. See the License for the
b3a21de0a0e0a5dea71bece7e5c0356700136fbcDiego Colantoni * specific language governing permission and limitations under the License.
b3a21de0a0e0a5dea71bece7e5c0356700136fbcDiego Colantoni *
b3a21de0a0e0a5dea71bece7e5c0356700136fbcDiego Colantoni * When distributing Covered Software, include this CDDL Header Notice in each file and include
b3a21de0a0e0a5dea71bece7e5c0356700136fbcDiego Colantoni * the License file at legal/CDDLv1.0.txt. If applicable, add the following below the CDDL
b3a21de0a0e0a5dea71bece7e5c0356700136fbcDiego Colantoni * Header, with the fields enclosed by brackets [] replaced by your own identifying
b3a21de0a0e0a5dea71bece7e5c0356700136fbcDiego Colantoni * information: "Portions copyright [year] [name of copyright owner]".
b3a21de0a0e0a5dea71bece7e5c0356700136fbcDiego Colantoni *
b3a21de0a0e0a5dea71bece7e5c0356700136fbcDiego Colantoni * Copyright 2016 ForgeRock AS.
b3a21de0a0e0a5dea71bece7e5c0356700136fbcDiego Colantoni */
b3a21de0a0e0a5dea71bece7e5c0356700136fbcDiego Colantoni
b3a21de0a0e0a5dea71bece7e5c0356700136fbcDiego Colantoni#import "FRAMessageUtils.h"
b3a21de0a0e0a5dea71bece7e5c0356700136fbcDiego Colantoni
b3a21de0a0e0a5dea71bece7e5c0356700136fbcDiego Colantonistatic NSString * const JSON_CONTENT_TYPE = @"application/json";
b3a21de0a0e0a5dea71bece7e5c0356700136fbcDiego Colantonistatic NSString * const CONTENT_TYPE_HEADER = @"Content-Type";
b3a21de0a0e0a5dea71bece7e5c0356700136fbcDiego Colantoni
b3a21de0a0e0a5dea71bece7e5c0356700136fbcDiego ColantoniNSInteger const NOT_FOUND = 404;
b3a21de0a0e0a5dea71bece7e5c0356700136fbcDiego Colantoni
b3a21de0a0e0a5dea71bece7e5c0356700136fbcDiego Colantoni@implementation FRAMessageUtils
b3a21de0a0e0a5dea71bece7e5c0356700136fbcDiego Colantoni
b3a21de0a0e0a5dea71bece7e5c0356700136fbcDiego Colantoni- (void)respond:(NSString *)endpoint
b3a21de0a0e0a5dea71bece7e5c0356700136fbcDiego Colantoni base64Secret:(NSString *)base64Secret
b3a21de0a0e0a5dea71bece7e5c0356700136fbcDiego Colantoni messageId:(NSString *)messageId
b3a21de0a0e0a5dea71bece7e5c0356700136fbcDiego Colantoni data:(NSDictionary *)data
b3a21de0a0e0a5dea71bece7e5c0356700136fbcDiego Colantoni handler:(void (^)(NSInteger, NSError *))handler {
b3a21de0a0e0a5dea71bece7e5c0356700136fbcDiego Colantoni [self respond:endpoint base64Secret:base64Secret messageId:messageId data:data protocol:nil handler:handler];
b3a21de0a0e0a5dea71bece7e5c0356700136fbcDiego Colantoni}
b3a21de0a0e0a5dea71bece7e5c0356700136fbcDiego Colantoni
b3a21de0a0e0a5dea71bece7e5c0356700136fbcDiego Colantoni- (void)respond:(NSString *)endpoint
b3a21de0a0e0a5dea71bece7e5c0356700136fbcDiego Colantoni base64Secret:(NSString *)base64Secret
b3a21de0a0e0a5dea71bece7e5c0356700136fbcDiego Colantoni messageId:(NSString *)messageId
b3a21de0a0e0a5dea71bece7e5c0356700136fbcDiego Colantoni data:(NSDictionary *)data
b3a21de0a0e0a5dea71bece7e5c0356700136fbcDiego Colantoni protocol:(Class) protocol
b3a21de0a0e0a5dea71bece7e5c0356700136fbcDiego Colantoni handler:(void (^)(NSInteger, NSError *))handler {
b3a21de0a0e0a5dea71bece7e5c0356700136fbcDiego Colantoni
b3a21de0a0e0a5dea71bece7e5c0356700136fbcDiego Colantoni NSURL *URL = [NSURL URLWithString:endpoint];
b3a21de0a0e0a5dea71bece7e5c0356700136fbcDiego Colantoni NSDictionary *payload = [self createPayloadWithMessageId:messageId base64Secret:base64Secret data:data];
b3a21de0a0e0a5dea71bece7e5c0356700136fbcDiego Colantoni
b3a21de0a0e0a5dea71bece7e5c0356700136fbcDiego Colantoni AFHTTPSessionManager *manager = [self createHTTPSessionManager:protocol];
b3a21de0a0e0a5dea71bece7e5c0356700136fbcDiego Colantoni [manager.requestSerializer setValue:JSON_CONTENT_TYPE forHTTPHeaderField:CONTENT_TYPE_HEADER];
b3a21de0a0e0a5dea71bece7e5c0356700136fbcDiego Colantoni
b3a21de0a0e0a5dea71bece7e5c0356700136fbcDiego Colantoni [manager POST:URL.absoluteString
b3a21de0a0e0a5dea71bece7e5c0356700136fbcDiego Colantoni parameters:payload
b3a21de0a0e0a5dea71bece7e5c0356700136fbcDiego Colantoni progress:nil
b3a21de0a0e0a5dea71bece7e5c0356700136fbcDiego Colantoni success:^(NSURLSessionTask *task, id responseObject) {
b3a21de0a0e0a5dea71bece7e5c0356700136fbcDiego Colantoni handler([(NSHTTPURLResponse*)task.response statusCode], nil);
b3a21de0a0e0a5dea71bece7e5c0356700136fbcDiego Colantoni } failure:^(NSURLSessionTask *operation, NSError *error) {
b3a21de0a0e0a5dea71bece7e5c0356700136fbcDiego Colantoni handler(NOT_FOUND, error);
b3a21de0a0e0a5dea71bece7e5c0356700136fbcDiego Colantoni }];
b3a21de0a0e0a5dea71bece7e5c0356700136fbcDiego Colantoni}
b3a21de0a0e0a5dea71bece7e5c0356700136fbcDiego Colantoni
b3a21de0a0e0a5dea71bece7e5c0356700136fbcDiego Colantoni- (AFHTTPSessionManager *)createHTTPSessionManager:(Class)protocol {
b3a21de0a0e0a5dea71bece7e5c0356700136fbcDiego Colantoni
b3a21de0a0e0a5dea71bece7e5c0356700136fbcDiego Colantoni if(protocol) {
b3a21de0a0e0a5dea71bece7e5c0356700136fbcDiego Colantoni NSURLSessionConfiguration *sessionConfiguration = [NSURLSessionConfiguration defaultSessionConfiguration];
b3a21de0a0e0a5dea71bece7e5c0356700136fbcDiego Colantoni NSMutableArray * protocolsArray = [sessionConfiguration.protocolClasses mutableCopy];
b3a21de0a0e0a5dea71bece7e5c0356700136fbcDiego Colantoni [protocolsArray insertObject:protocol atIndex:0];
b3a21de0a0e0a5dea71bece7e5c0356700136fbcDiego Colantoni sessionConfiguration.protocolClasses = protocolsArray;
b3a21de0a0e0a5dea71bece7e5c0356700136fbcDiego Colantoni
b3a21de0a0e0a5dea71bece7e5c0356700136fbcDiego Colantoni return [[AFHTTPSessionManager alloc] initWithSessionConfiguration:sessionConfiguration];
b3a21de0a0e0a5dea71bece7e5c0356700136fbcDiego Colantoni }
b3a21de0a0e0a5dea71bece7e5c0356700136fbcDiego Colantoni
b3a21de0a0e0a5dea71bece7e5c0356700136fbcDiego Colantoni return [AFHTTPSessionManager manager];
b3a21de0a0e0a5dea71bece7e5c0356700136fbcDiego Colantoni}
b3a21de0a0e0a5dea71bece7e5c0356700136fbcDiego Colantoni
b3a21de0a0e0a5dea71bece7e5c0356700136fbcDiego Colantoni- (NSDictionary *)createPayloadWithMessageId:(NSString *)messageId
b3a21de0a0e0a5dea71bece7e5c0356700136fbcDiego Colantoni base64Secret:(NSString *)base64Secret
b3a21de0a0e0a5dea71bece7e5c0356700136fbcDiego Colantoni data:(NSDictionary *)data {
b3a21de0a0e0a5dea71bece7e5c0356700136fbcDiego Colantoni return @{@"messageId":messageId, @"jwt":[self generateJwtWithPayload:data base64Secret:base64Secret]};
b3a21de0a0e0a5dea71bece7e5c0356700136fbcDiego Colantoni}
b3a21de0a0e0a5dea71bece7e5c0356700136fbcDiego Colantoni
b3a21de0a0e0a5dea71bece7e5c0356700136fbcDiego Colantoni- (NSString *)generateJwtWithPayload:(NSDictionary *)payload base64Secret:(NSString *)base64Secret {
b3a21de0a0e0a5dea71bece7e5c0356700136fbcDiego Colantoni
b3a21de0a0e0a5dea71bece7e5c0356700136fbcDiego Colantoni id<JWTAlgorithm> algorithm = [JWTAlgorithmFactory algorithmByName:@"HS256"];
b3a21de0a0e0a5dea71bece7e5c0356700136fbcDiego Colantoni
b3a21de0a0e0a5dea71bece7e5c0356700136fbcDiego Colantoni return [JWTBuilder encodePayload:payload].secret(base64Secret).algorithm(algorithm).encode;
b3a21de0a0e0a5dea71bece7e5c0356700136fbcDiego Colantoni}
b3a21de0a0e0a5dea71bece7e5c0356700136fbcDiego Colantoni
b3a21de0a0e0a5dea71bece7e5c0356700136fbcDiego Colantoni@end