Blame client/iOS/FreeRDP/ios_freerdp_ui.m

Packit Service fa4841
/*
Packit Service fa4841
 RDP ui callbacks
Packit Service fa4841
Packit Service fa4841
 Copyright 2013 Thincast Technologies GmbH, Authors: Martin Fleisz, Dorian Johnson
Packit Service fa4841
Packit Service fa4841
 This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0.
Packit Service fa4841
 If a copy of the MPL was not distributed with this file, You can obtain one at
Packit Service fa4841
 http://mozilla.org/MPL/2.0/.
Packit Service fa4841
 */
Packit Service fa4841
Packit Service fa4841
#import <Foundation/Foundation.h>
Packit Service fa4841
Packit Service fa4841
#import <freerdp/gdi/gdi.h>
Packit Service fa4841
#import "ios_freerdp_ui.h"
Packit Service fa4841
Packit Service fa4841
#import "RDPSession.h"
Packit Service fa4841
Packit Service fa4841
#pragma mark -
Packit Service fa4841
#pragma mark Certificate authentication
Packit Service fa4841
Packit Service fa4841
static void ios_resize_display_buffer(mfInfo *mfi);
Packit Service fa4841
static BOOL ios_ui_authenticate_raw(freerdp *instance, char **username, char **password,
Packit Service fa4841
                                    char **domain, const char *title)
Packit Service fa4841
{
Packit Service fa4841
	mfInfo *mfi = MFI_FROM_INSTANCE(instance);
Packit Service fa4841
	NSMutableDictionary *params = [NSMutableDictionary
Packit Service fa4841
	    dictionaryWithObjectsAndKeys:(*username) ? [NSString stringWithUTF8String:*username] : @"",
Packit Service fa4841
	                                 @"username",
Packit Service fa4841
	                                 (*password) ? [NSString stringWithUTF8String:*password] : @"",
Packit Service fa4841
	                                 @"password",
Packit Service fa4841
	                                 (*domain) ? [NSString stringWithUTF8String:*domain] : @"",
Packit Service fa4841
	                                 @"domain",
Packit Service fa4841
	                                 [NSString
Packit Service fa4841
	                                     stringWithUTF8String:instance->settings->ServerHostname],
Packit Service fa4841
	                                 @"hostname", // used for the auth prompt message; not changed
Packit Service fa4841
	                                 nil];
Packit Service fa4841
	// request auth UI
Packit Service fa4841
	[mfi->session performSelectorOnMainThread:@selector(sessionRequestsAuthenticationWithParams:)
Packit Service fa4841
	                               withObject:params
Packit Service fa4841
	                            waitUntilDone:YES];
Packit Service fa4841
	// wait for UI request to be completed
Packit Service fa4841
	[[mfi->session uiRequestCompleted] lock];
Packit Service fa4841
	[[mfi->session uiRequestCompleted] wait];
Packit Service fa4841
	[[mfi->session uiRequestCompleted] unlock];
Packit Service fa4841
Packit Service fa4841
	if (![[params valueForKey:@"result"] boolValue])
Packit Service fa4841
	{
Packit Service fa4841
		mfi->unwanted = YES;
Packit Service fa4841
		return FALSE;
Packit Service fa4841
	}
Packit Service fa4841
Packit Service fa4841
	// Free old values
Packit Service fa4841
	free(*username);
Packit Service fa4841
	free(*password);
Packit Service fa4841
	free(*domain);
Packit Service fa4841
	// set values back
Packit Service fa4841
	*username = strdup([[params objectForKey:@"username"] UTF8String]);
Packit Service fa4841
	*password = strdup([[params objectForKey:@"password"] UTF8String]);
Packit Service fa4841
	*domain = strdup([[params objectForKey:@"domain"] UTF8String]);
Packit Service fa4841
Packit Service fa4841
	if (!(*username) || !(*password) || !(*domain))
Packit Service fa4841
	{
Packit Service fa4841
		free(*username);
Packit Service fa4841
		free(*password);
Packit Service fa4841
		free(*domain);
Packit Service fa4841
		return FALSE;
Packit Service fa4841
	}
Packit Service fa4841
Packit Service fa4841
	return TRUE;
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
BOOL ios_ui_authenticate(freerdp *instance, char **username, char **password, char **domain)
Packit Service fa4841
{
Packit Service fa4841
	return ios_ui_authenticate_raw(instance, username, password, domain, "");
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
BOOL ios_ui_gw_authenticate(freerdp *instance, char **username, char **password, char **domain)
Packit Service fa4841
{
Packit Service fa4841
	return ios_ui_authenticate_raw(instance, username, password, domain, "gateway");
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
DWORD ios_ui_verify_certificate(freerdp *instance, const char *common_name, const char *subject,
Packit Service fa4841
                                const char *issuer, const char *fingerprint, BOOL host_mismatch)
Packit Service fa4841
{
Packit Service fa4841
	// check whether we accept all certificates
Packit Service fa4841
	if ([[NSUserDefaults standardUserDefaults] boolForKey:@"security.accept_certificates"] == YES)
Packit Service fa4841
		return 2;
Packit Service fa4841
Packit Service fa4841
	mfInfo *mfi = MFI_FROM_INSTANCE(instance);
Packit Service fa4841
	NSMutableDictionary *params = [NSMutableDictionary
Packit Service fa4841
	    dictionaryWithObjectsAndKeys:(subject) ? [NSString stringWithUTF8String:subject] : @"",
Packit Service fa4841
	                                 @"subject",
Packit Service fa4841
	                                 (issuer) ? [NSString stringWithUTF8String:issuer] : @"",
Packit Service fa4841
	                                 @"issuer",
Packit Service fa4841
	                                 (fingerprint) ? [NSString stringWithUTF8String:subject] : @"",
Packit Service fa4841
	                                 @"fingerprint", nil];
Packit Service fa4841
	// request certificate verification UI
Packit Service fa4841
	[mfi->session performSelectorOnMainThread:@selector(sessionVerifyCertificateWithParams:)
Packit Service fa4841
	                               withObject:params
Packit Service fa4841
	                            waitUntilDone:YES];
Packit Service fa4841
	// wait for UI request to be completed
Packit Service fa4841
	[[mfi->session uiRequestCompleted] lock];
Packit Service fa4841
	[[mfi->session uiRequestCompleted] wait];
Packit Service fa4841
	[[mfi->session uiRequestCompleted] unlock];
Packit Service fa4841
Packit Service fa4841
	if (![[params valueForKey:@"result"] boolValue])
Packit Service fa4841
	{
Packit Service fa4841
		mfi->unwanted = YES;
Packit Service fa4841
		return 0;
Packit Service fa4841
	}
Packit Service fa4841
Packit Service fa4841
	return 1;
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
DWORD ios_ui_verify_changed_certificate(freerdp *instance, const char *common_name,
Packit Service fa4841
                                        const char *subject, const char *issuer,
Packit Service fa4841
                                        const char *new_fingerprint, const char *old_subject,
Packit Service fa4841
                                        const char *old_issuer, const char *old_fingerprint)
Packit Service fa4841
{
Packit Service fa4841
	return ios_ui_verify_certificate(instance, common_name, subject, issuer, new_fingerprint,
Packit Service fa4841
	                                 FALSE);
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
#pragma mark -
Packit Service fa4841
#pragma mark Graphics updates
Packit Service fa4841
Packit Service fa4841
BOOL ios_ui_begin_paint(rdpContext *context)
Packit Service fa4841
{
Packit Service fa4841
	rdpGdi *gdi = context->gdi;
Packit Service fa4841
	gdi->primary->hdc->hwnd->invalid->null = TRUE;
Packit Service fa4841
	return TRUE;
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
BOOL ios_ui_end_paint(rdpContext *context)
Packit Service fa4841
{
Packit Service fa4841
	mfInfo *mfi = MFI_FROM_INSTANCE(context->instance);
Packit Service fa4841
	rdpGdi *gdi = context->gdi;
Packit Service fa4841
	CGRect dirty_rect =
Packit Service fa4841
	    CGRectMake(gdi->primary->hdc->hwnd->invalid->x, gdi->primary->hdc->hwnd->invalid->y,
Packit Service fa4841
	               gdi->primary->hdc->hwnd->invalid->w, gdi->primary->hdc->hwnd->invalid->h);
Packit Service fa4841
Packit Service fa4841
	if (!gdi->primary->hdc->hwnd->invalid->null)
Packit Service fa4841
		[mfi->session performSelectorOnMainThread:@selector(setNeedsDisplayInRectAsValue:)
Packit Service fa4841
		                               withObject:[NSValue valueWithCGRect:dirty_rect]
Packit Service fa4841
		                            waitUntilDone:NO];
Packit Service fa4841
Packit Service fa4841
	return TRUE;
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
BOOL ios_ui_resize_window(rdpContext *context)
Packit Service fa4841
{
Packit Service fa4841
	rdpSettings *settings;
Packit Service fa4841
	rdpGdi *gdi;
Packit Service fa4841
Packit Service fa4841
	if (!context || !context->settings)
Packit Service fa4841
		return FALSE;
Packit Service fa4841
Packit Service fa4841
	settings = context->settings;
Packit Service fa4841
	gdi = context->gdi;
Packit Service fa4841
Packit Service fa4841
	if (!gdi_resize(gdi, settings->DesktopWidth, settings->DesktopHeight))
Packit Service fa4841
		return FALSE;
Packit Service fa4841
Packit Service fa4841
	ios_resize_display_buffer(MFI_FROM_INSTANCE(context->instance));
Packit Service fa4841
	return TRUE;
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
#pragma mark -
Packit Service fa4841
#pragma mark Exported
Packit Service fa4841
Packit Service fa4841
static void ios_create_bitmap_context(mfInfo *mfi)
Packit Service fa4841
{
Packit Service fa4841
	[mfi->session performSelectorOnMainThread:@selector(sessionBitmapContextWillChange)
Packit Service fa4841
	                               withObject:nil
Packit Service fa4841
	                            waitUntilDone:YES];
Packit Service fa4841
	rdpGdi *gdi = mfi->instance->context->gdi;
Packit Service fa4841
	CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
Packit Service fa4841
Packit Service fa4841
	if (GetBytesPerPixel(gdi->dstFormat) == 2)
Packit Service fa4841
		mfi->bitmap_context = CGBitmapContextCreate(
Packit Service fa4841
		    gdi->primary_buffer, gdi->width, gdi->height, 5, gdi->stride, colorSpace,
Packit Service fa4841
		    kCGBitmapByteOrder16Little | kCGImageAlphaNoneSkipFirst);
Packit Service fa4841
	else
Packit Service fa4841
		mfi->bitmap_context = CGBitmapContextCreate(
Packit Service fa4841
		    gdi->primary_buffer, gdi->width, gdi->height, 8, gdi->stride, colorSpace,
Packit Service fa4841
		    kCGBitmapByteOrder32Little | kCGImageAlphaNoneSkipFirst);
Packit Service fa4841
Packit Service fa4841
	CGColorSpaceRelease(colorSpace);
Packit Service fa4841
	[mfi->session performSelectorOnMainThread:@selector(sessionBitmapContextDidChange)
Packit Service fa4841
	                               withObject:nil
Packit Service fa4841
	                            waitUntilDone:YES];
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
void ios_allocate_display_buffer(mfInfo *mfi)
Packit Service fa4841
{
Packit Service fa4841
	ios_create_bitmap_context(mfi);
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
void ios_resize_display_buffer(mfInfo *mfi)
Packit Service fa4841
{
Packit Service fa4841
	// Release the old context in a thread-safe manner
Packit Service fa4841
	CGContextRef old_context = mfi->bitmap_context;
Packit Service fa4841
	mfi->bitmap_context = NULL;
Packit Service fa4841
	CGContextRelease(old_context);
Packit Service fa4841
	// Create the new context
Packit Service fa4841
	ios_create_bitmap_context(mfi);
Packit Service fa4841
}