From ec345a388fd173667be7b4723316fb0f333e38a5 Mon Sep 17 00:00:00 2001 From: Harris Kauffman Date: Tue, 3 Dec 2013 13:40:11 -0500 Subject: [PATCH] adium: condense code Use hash maps to condense and, hopefully, simplify code. --- src/adium/ESPurpleSIPEAccount.h | 29 +--- src/adium/ESPurpleSIPEAccount.m | 187 ++++++++------------ src/adium/ESSIPEAccountViewController.h | 2 + src/adium/ESSIPEAccountViewController.m | 291 +++++++++++++++---------------- src/adium/ESSIPEService.m | 292 ++++++++++++++------------------ src/adium/PurpleDefaultsSIPE.plist | 2 + 6 files changed, 347 insertions(+), 456 deletions(-) rewrite src/adium/ESSIPEAccountViewController.m (84%) rewrite src/adium/ESSIPEService.m (62%) diff --git a/src/adium/ESPurpleSIPEAccount.h b/src/adium/ESPurpleSIPEAccount.h index a890989d..89f010ee 100644 --- a/src/adium/ESPurpleSIPEAccount.h +++ b/src/adium/ESPurpleSIPEAccount.h @@ -27,34 +27,9 @@ #define PURPLE_SSL_CDSA_BEAST_TLS_WORKAROUND "ssl_cdsa_beast_tls_workaround" -// TODO: Remove when sipe_status_activity_to_token calls work -#define SIPE_ACTIVITY_NUM_TYPES 17 -static struct -{ - const gchar *status_id; - const gchar *desc; -} const sipe_activity_map[SIPE_ACTIVITY_NUM_TYPES] = { - /* SIPE_ACTIVITY_UNSET */ { "unset", NULL }, - /* SIPE_ACTIVITY_AVAILABLE */ { "available", NULL }, - /* SIPE_ACTIVITY_ONLINE */ { "online", NULL }, - /* SIPE_ACTIVITY_INACTIVE */ { "idle", N_("Inactive") }, - /* SIPE_ACTIVITY_BUSY */ { "busy", N_("Busy") }, - /* SIPE_ACTIVITY_BUSYIDLE */ { "busyidle", N_("Busy-Idle") }, - /* SIPE_ACTIVITY_DND */ { "do-not-disturb", NULL }, - /* SIPE_ACTIVITY_BRB */ { "be-right-back", N_("Be right back") }, - /* SIPE_ACTIVITY_AWAY */ { "away", NULL }, - /* SIPE_ACTIVITY_LUNCH */ { "out-to-lunch", N_("Out to lunch") }, - /* SIPE_ACTIVITY_INVISIBLE */ { "invisible", NULL }, - /* SIPE_ACTIVITY_OFFLINE */ { "offline", NULL }, - /* SIPE_ACTIVITY_ON_PHONE */ { "on-the-phone", N_("In a call") }, - /* SIPE_ACTIVITY_IN_CONF */ { "in-a-conference", N_("In a conference") }, - /* SIPE_ACTIVITY_IN_MEETING */ { "in-a-meeting", N_("In a meeting") }, - /* SIPE_ACTIVITY_OOF */ { "out-of-office", N_("Out of office") }, - /* SIPE_ACTIVITY_URGENT_ONLY */ { "urgent-interruptions-only", N_("Urgent interruptions only") }, -}; - @interface ESPurpleSIPEAccount : CBPurpleAccount { - + NSDictionary *adium_to_sipe_status; + NSDictionary *sipe_to_adium_status; } @end diff --git a/src/adium/ESPurpleSIPEAccount.m b/src/adium/ESPurpleSIPEAccount.m index 919b6f8a..9090100a 100644 --- a/src/adium/ESPurpleSIPEAccount.m +++ b/src/adium/ESPurpleSIPEAccount.m @@ -25,6 +25,56 @@ @implementation ESPurpleSIPEAccount +- (void)initAccount +{ + [super initAccount]; + + sipe_to_adium_status = + [[NSDictionary alloc] initWithObjectsAndKeys: + STATUS_NAME_AVAILABLE, @"available", //SIPE_ACTIVITY_AVAILABLE + STATUS_NAME_AVAILABLE, @"online", //SIPE_ACTIVITY_ONLINE + STATUS_NAME_AWAY, @"idle", //SIPE_ACTIVITY_INACTIVE + STATUS_NAME_BUSY, @"busy", //SIPE_ACTIVITY_BUSY + STATUS_NAME_BUSY, @"busyidle", //SIPE_ACTIVITY_BUSYIDLE + STATUS_NAME_DND, @"do-not-disturb", //SIPE_ACTIVITY_DND + STATUS_NAME_BRB, @"be-right-back", //SIPE_ACTIVITY_BRB + STATUS_NAME_AWAY, @"away", //SIPE_ACTIVITY_AWAY + STATUS_NAME_LUNCH, @"out-to-lunch", //SIPE_ACTIVITY_LUNCH + STATUS_NAME_INVISIBLE, @"invisible", //SIPE_ACTIVITY_INVISIBLE + STATUS_NAME_OFFLINE, @"offline", //SIPE_ACTIVITY_OFFLINE + STATUS_NAME_PHONE, @"on-the-phone", //SIPE_ACTIVITY_ON_PHONE + STATUS_NAME_NOT_AT_DESK, @"in-a-conference", //SIPE_ACTIVITY_IN_CONF + STATUS_NAME_NOT_AT_DESK, @"in-a-meeting", //SIPE_ACTIVITY_IN_MEETING + STATUS_NAME_NOT_IN_OFFICE, @"out-of-office", //SIPE_ACTIVITY_OOF + STATUS_NAME_AWAY_FRIENDS_ONLY, @"urgent-interruptions-only", //SIPE_ACTIVITY_URGENT_ONLY + nil + ]; + + adium_to_sipe_status = + [[NSDictionary alloc] initWithObjectsAndKeys: + @"available", STATUS_NAME_AVAILABLE, //SIPE_ACTIVITY_AVAILABLE + @"busy", STATUS_NAME_BUSY, //SIPE_ACTIVITY_BUSY + @"do-not-disturb", STATUS_NAME_DND, //SIPE_ACTIVITY_DND + @"be-right-back", STATUS_NAME_BRB, //SIPE_ACTIVITY_BRB + @"away", STATUS_NAME_AWAY, //SIPE_ACTIVITY_AWAY + @"out-to-lunch", STATUS_NAME_LUNCH, //SIPE_ACTIVITY_LUNCH + @"invisible", STATUS_NAME_INVISIBLE, //SIPE_ACTIVITY_INVISIBLE + @"offline", STATUS_NAME_OFFLINE, //SIPE_ACTIVITY_OFFLINE + @"on-the-phone", STATUS_NAME_PHONE, //SIPE_ACTIVITY_ON_PHONE + @"in-a-meeting", STATUS_NAME_NOT_AT_DESK, //SIPE_ACTIVITY_IN_MEETING + @"out-of-office", STATUS_NAME_NOT_IN_OFFICE, //SIPE_ACTIVITY_OOF + @"urgent-interruptions-only", STATUS_NAME_AWAY_FRIENDS_ONLY, //SIPE_ACTIVITY_URGENT_ONLY + nil + ]; +} + +- (void)dealloc +{ + [adium_to_sipe_status release]; + [sipe_to_adium_status release]; + [super dealloc]; +} + - (const char*)protocolPlugin { return "prpl-sipe"; @@ -210,58 +260,18 @@ NSString *statusName = [super statusNameForPurpleBuddy:buddy]; PurplePresence *presence = purple_buddy_get_presence(buddy); PurpleStatus *status = purple_presence_get_active_status(presence); - const char *purpleStatusID = purple_status_get_id(status); - + NSString *purpleStatusID = [NSString stringWithUTF8String:purple_status_get_id(status)]; + if (!purpleStatusID) return nil; - - switch (sipe_purple_token_to_activity(purpleStatusID)) - { - case SIPE_ACTIVITY_AVAILABLE: - case SIPE_ACTIVITY_ONLINE: - statusName = STATUS_NAME_AVAILABLE; - break; - case SIPE_ACTIVITY_AWAY: - case SIPE_ACTIVITY_INACTIVE: - statusName = STATUS_NAME_AWAY; - break; - case SIPE_ACTIVITY_BRB: - statusName = STATUS_NAME_BRB; - break; - case SIPE_ACTIVITY_BUSY: - case SIPE_ACTIVITY_BUSYIDLE: - statusName = STATUS_NAME_BUSY; - break; - case SIPE_ACTIVITY_DND: - statusName = STATUS_NAME_DND; - break; - case SIPE_ACTIVITY_LUNCH: - statusName = STATUS_NAME_LUNCH; - break; - case SIPE_ACTIVITY_INVISIBLE: - statusName = STATUS_NAME_INVISIBLE; - break; - case SIPE_ACTIVITY_OFFLINE: - statusName = STATUS_NAME_OFFLINE; - break; - case SIPE_ACTIVITY_ON_PHONE: - statusName = STATUS_NAME_PHONE; - break; - case SIPE_ACTIVITY_IN_CONF: - case SIPE_ACTIVITY_IN_MEETING: - statusName = STATUS_NAME_NOT_AT_DESK; - break; - case SIPE_ACTIVITY_OOF: - statusName = STATUS_NAME_NOT_IN_OFFICE; - break; - case SIPE_ACTIVITY_URGENT_ONLY: - statusName = STATUS_NAME_AWAY_FRIENDS_ONLY; - break; - default: - statusName = STATUS_NAME_OFFLINE; + + if (sipe_to_adium_status[purpleStatusID]) + statusName = sipe_to_adium_status[purpleStatusID]; + else { + AILog(@"(ESPurpleSIPEAccount) Unknown purpleStatusID in statusNameForPurpleBuddy: %@", purpleStatusID); + statusName = STATUS_NAME_OFFLINE; } - + return statusName; - } /*! @@ -274,79 +284,14 @@ NSString *statusMessageString = [statusState statusMessageString]; if (!statusMessageString) statusMessageString = @""; - - // TODO: figure out why sipe_status_activity_to_token calls return junk, instead of a gchar* - switch (statusState.statusType) { - case AIAvailableStatusType: - statusID = sipe_activity_map[SIPE_ACTIVITY_AVAILABLE].status_id; - //statusID = sipe_status_activity_to_token(SIPE_ACTIVITY_AVAILABLE); - break; - - case AIAwayStatusType: - if (([statusName isEqualToString:STATUS_NAME_AWAY]) || - ([statusMessageString caseInsensitiveCompare:[adium.statusController localizedDescriptionForCoreStatusName:STATUS_NAME_AWAY]] == NSOrderedSame)) - { - //statusID = sipe_status_activity_to_token(SIPE_ACTIVITY_AWAY); - statusID = sipe_activity_map[SIPE_ACTIVITY_AWAY].status_id; - } else if (([statusName isEqualToString:STATUS_NAME_BRB]) || - ([statusMessageString caseInsensitiveCompare:[adium.statusController localizedDescriptionForCoreStatusName:STATUS_NAME_BRB]] == NSOrderedSame)) - { - //statusID = sipe_status_activity_to_token(SIPE_ACTIVITY_BRB); - statusID = sipe_activity_map[SIPE_ACTIVITY_BRB].status_id; - } else if (([statusName isEqualToString:STATUS_NAME_BUSY]) || - ([statusMessageString caseInsensitiveCompare:[adium.statusController localizedDescriptionForCoreStatusName:STATUS_NAME_BUSY]] == NSOrderedSame)) - { - // TODO: Figure out how to determine if they should be "busy" or "busyidle" - //statusID = sipe_status_activity_to_token(SIPE_ACTIVITY_BUSY); - statusID = sipe_activity_map[SIPE_ACTIVITY_BUSY].status_id; - } else if (([statusName isEqualToString:STATUS_NAME_DND]) || - ([statusMessageString caseInsensitiveCompare:[adium.statusController localizedDescriptionForCoreStatusName:STATUS_NAME_DND]] == NSOrderedSame)) - { - //statusID = sipe_status_activity_to_token(SIPE_ACTIVITY_DND); - statusID = sipe_activity_map[SIPE_ACTIVITY_DND].status_id; - } else if (([statusName isEqualToString:STATUS_NAME_LUNCH]) || - ([statusMessageString caseInsensitiveCompare:[adium.statusController localizedDescriptionForCoreStatusName:STATUS_NAME_LUNCH]] == NSOrderedSame)) - { - //statusID = sipe_status_activity_to_token(SIPE_ACTIVITY_LUNCH); - statusID = sipe_activity_map[SIPE_ACTIVITY_LUNCH].status_id; - } else if (([statusName isEqualToString:STATUS_NAME_PHONE]) || - ([statusMessageString caseInsensitiveCompare:[adium.statusController localizedDescriptionForCoreStatusName:STATUS_NAME_PHONE]] == NSOrderedSame)) - { - //statusID = sipe_status_activity_to_token(SIPE_ACTIVITY_ON_PHONE); - statusID = sipe_activity_map[SIPE_ACTIVITY_ON_PHONE].status_id; - } else if (([statusName isEqualToString:STATUS_NAME_NOT_AT_DESK]) || - ([statusMessageString caseInsensitiveCompare:[adium.statusController localizedDescriptionForCoreStatusName:STATUS_NAME_NOT_AT_DESK]] == NSOrderedSame)) - { - // TODO: Figure out how to determine if they should be "In a meeting" or "In a conference" - //statusID = sipe_status_activity_to_token(SIPE_ACTIVITY_IN_MEETING); - statusID = sipe_activity_map[SIPE_ACTIVITY_IN_MEETING].status_id; - } else if (([statusName isEqualToString:STATUS_NAME_NOT_IN_OFFICE]) || - ([statusMessageString caseInsensitiveCompare:[adium.statusController localizedDescriptionForCoreStatusName:STATUS_NAME_NOT_IN_OFFICE]] == NSOrderedSame)) - { - //statusID = sipe_status_activity_to_token(SIPE_ACTIVITY_OOF); - statusID = sipe_activity_map[SIPE_ACTIVITY_OOF].status_id; - } else if (([statusName isEqualToString:STATUS_NAME_AWAY_FRIENDS_ONLY]) || - ([statusMessageString caseInsensitiveCompare:[adium.statusController localizedDescriptionForCoreStatusName:STATUS_NAME_AWAY_FRIENDS_ONLY]] == NSOrderedSame)) - { - //statusID = sipe_status_activity_to_token(SIPE_ACTIVITY_URGENT_ONLY); - statusID = sipe_activity_map[SIPE_ACTIVITY_URGENT_ONLY].status_id; - } - break; - case AIInvisibleStatusType: - //statusID = sipe_status_activity_to_token(SIPE_ACTIVITY_INVISIBLE); - statusID = sipe_activity_map[SIPE_ACTIVITY_INVISIBLE].status_id; - break; - - case AIOfflineStatusType: - //statusID = sipe_status_activity_to_token(SIPE_ACTIVITY_OFFLINE); - statusID = sipe_activity_map[SIPE_ACTIVITY_OFFLINE].status_id; - break; + + if ( adium_to_sipe_status[statusName] ) + statusID = [adium_to_sipe_status[statusName] UTF8String]; + else { + AILog(@"(ESPurpleSIPEAccount): Unknown statusName in purpleStatusIDForStatus: %@", statusName); + statusID = [super purpleStatusIDForStatus:statusState arguments:arguments]; } - - - //If we didn't get a purple status type, request one from super - if (statusID == NULL) statusID = [super purpleStatusIDForStatus:statusState arguments:arguments]; - + return statusID; } diff --git a/src/adium/ESSIPEAccountViewController.h b/src/adium/ESSIPEAccountViewController.h index e2a450e0..160b678b 100644 --- a/src/adium/ESSIPEAccountViewController.h +++ b/src/adium/ESSIPEAccountViewController.h @@ -29,6 +29,8 @@ IBOutlet NSPopUpButton *popup_connectionType; IBOutlet NSPopUpButton *popup_authenticationScheme; + + NSDictionary *sipe_key_to_gui; } diff --git a/src/adium/ESSIPEAccountViewController.m b/src/adium/ESSIPEAccountViewController.m dissimilarity index 84% index c5c5bc37..dc941c33 100644 --- a/src/adium/ESSIPEAccountViewController.m +++ b/src/adium/ESSIPEAccountViewController.m @@ -1,145 +1,146 @@ -// -// ESSIPEAccountViewController.m -// SIPEAdiumPlugin -// -// Created by Matt Meissner on 10/30/09. -// Modified by Michael Lamb on 2/27/13 -// Copyright 2013 Michael Lamb/Harris Kauffman. All rights reserved. -// - - -#import "ESSIPEAccountViewController.h" - -#import - -#include "prpl.h" -#include "ESPurpleSIPEAccount.h" - -@implementation ESSIPEAccountViewController - -- (NSString *)nibName{ - return @"ESSIPEAccountView"; -} - -#pragma mark Configuration methods -- (void)configureForAccount:(AIAccount *)inAccount -{ - [super configureForAccount:inAccount]; - - NSString *server = [account preferenceForKey:KEY_SIPE_CONNECT_HOST group:GROUP_ACCOUNT_STATUS]; - [textField_server setStringValue:(server ? server : @"")]; - - NSString *windowsLogin = [account preferenceForKey:KEY_SIPE_WINDOWS_LOGIN group:GROUP_ACCOUNT_STATUS]; - [textField_windowsLogin setStringValue:(windowsLogin ? windowsLogin : @"")]; - - [checkBox_singleSignOn setState:[[account preferenceForKey:KEY_SIPE_SINGLE_SIGN_ON group:GROUP_ACCOUNT_STATUS] boolValue]]; - - [checkbox_dontPublish setState:[[account preferenceForKey:KEY_SIPE_DONT_PUBLISH group:GROUP_ACCOUNT_STATUS] boolValue]]; - - NSString *userAgent = [account preferenceForKey:KEY_SIPE_USER_AGENT group:GROUP_ACCOUNT_STATUS]; - [textField_userAgent setStringValue:(userAgent ? userAgent : @"")]; - - NSString *emailURL = [account preferenceForKey:KEY_SIPE_EMAIL_URL group:GROUP_ACCOUNT_STATUS]; - [textField_emailURL setStringValue:(emailURL ? emailURL : @"")]; - - NSString *email = [account preferenceForKey:KEY_SIPE_EMAIL group:GROUP_ACCOUNT_STATUS]; - [textField_email setStringValue:(email ? email : @"")]; - - NSString *emailLogin = [account preferenceForKey:KEY_SIPE_EMAIL_LOGIN group:GROUP_ACCOUNT_STATUS]; - [textField_emailLogin setStringValue:(emailLogin ? emailLogin : @"")]; - - NSString *emailPassword = [account preferenceForKey:KEY_SIPE_EMAIL_PASSWORD group:GROUP_ACCOUNT_STATUS]; - [textField_emailPassword setStringValue:(emailPassword ? emailPassword : @"")]; - - NSString *groupchatUser = [account preferenceForKey:KEY_SIPE_GROUP_CHAT_PROXY group:GROUP_ACCOUNT_STATUS]; - [textField_groupchatUser setStringValue:(groupchatUser ? groupchatUser : @"")]; - - NSString *connType = [account preferenceForKey:KEY_SIPE_CONNECTION_TYPE group:GROUP_ACCOUNT_STATUS]; - NSDictionary *connTypeDict = [NSDictionary dictionaryWithObjectsAndKeys: - @"Auto",@"auto", - @"SSL/TLS",@"tls", - @"TCP",@"tcp", - nil]; - [popup_connectionType selectItemWithTitle:[connTypeDict objectForKey:(connType ? connType : @"auto")]]; - - // Gotta define these here, because they're not yet in the 10.9 SDK. :( -#define NSAppKitVersionNumber10_8 1187 -#define NSAppKitVersionNumber10_8_5 1187.4 -#define NSAppKitVersionNumber10_9 1265 - - // BEAST mitigation for Mavericks users - if (floor(NSAppKitVersionNumber) <= NSAppKitVersionNumber10_8) { - // We are not running on Mavericks - Don't display BEAST mitigation configuration option - [checkbox_beastDisable setHidden:YES]; - } else { - [checkbox_beastDisable setState:[[account preferenceForKey:KEY_SIPE_BEAST_DISABLE group:GROUP_ACCOUNT_STATUS] boolValue]]; - } - - NSString *authType = [account preferenceForKey:KEY_SIPE_AUTH_SCHEME group:GROUP_ACCOUNT_STATUS]; - NSDictionary *authTypeDict = [NSDictionary dictionaryWithObjectsAndKeys: - @"NTLM",@"ntlm", - @"Kerberos",@"krb5", - @"TLS-DSK",@"tls-dsk", - nil]; - [popup_authenticationScheme selectItemWithTitle:[authTypeDict objectForKey:(authType ? authType : @"ntlm")]]; -} - -- (void)saveConfiguration -{ - [super saveConfiguration]; - - [account setPreference:[textField_windowsLogin stringValue] - forKey:KEY_SIPE_WINDOWS_LOGIN group:GROUP_ACCOUNT_STATUS]; - - [account setPreference:[textField_server stringValue] - forKey:KEY_SIPE_CONNECT_HOST group:GROUP_ACCOUNT_STATUS]; - - // TODO: Figure out how to only save the password if the user has "Save password" checked - [account setPreference:[textField_password stringValue] - forKey:KEY_SIPE_PASSWORD group:GROUP_ACCOUNT_STATUS]; - - [account setPreference:[NSNumber numberWithBool:[checkBox_singleSignOn state]] - forKey:KEY_SIPE_SINGLE_SIGN_ON group:GROUP_ACCOUNT_STATUS]; - - [account setPreference:[NSNumber numberWithBool:[checkbox_dontPublish state]] - forKey:KEY_SIPE_DONT_PUBLISH group:GROUP_ACCOUNT_STATUS]; - - [account setPreference:[NSNumber numberWithBool:[checkbox_beastDisable state]] - forKey:KEY_SIPE_BEAST_DISABLE group:GROUP_ACCOUNT_STATUS]; - - [account setPreference: - ([[textField_userAgent stringValue] length] ? [textField_userAgent stringValue] : nil) - forKey:KEY_SIPE_USER_AGENT group:GROUP_ACCOUNT_STATUS]; - - [account setPreference: - ([[textField_emailURL stringValue] length] ? [textField_emailURL stringValue] : nil) - forKey:KEY_SIPE_EMAIL_URL group:GROUP_ACCOUNT_STATUS]; - - [account setPreference: - ([[textField_email stringValue] length] ? [textField_email stringValue] : nil) - forKey:KEY_SIPE_EMAIL group:GROUP_ACCOUNT_STATUS]; - - [account setPreference: - ([[textField_emailLogin stringValue] length] ? [textField_emailLogin stringValue] : nil) - forKey:KEY_SIPE_EMAIL_LOGIN group:GROUP_ACCOUNT_STATUS]; - - [account setPreference: - ([[textField_emailPassword stringValue] length] ? [textField_emailPassword stringValue] : nil) - forKey:KEY_SIPE_EMAIL_PASSWORD group:GROUP_ACCOUNT_STATUS]; - - [account setPreference: - ([[textField_groupchatUser stringValue] length] ? [textField_groupchatUser stringValue] : nil) - forKey:KEY_SIPE_GROUP_CHAT_PROXY group:GROUP_ACCOUNT_STATUS]; - - NSMutableArray *myArray = [[NSMutableArray alloc] initWithObjects:@"auto", @"tls", @"tcp", nil]; - [account setPreference: [myArray objectAtIndex:[popup_connectionType selectedTag]] - forKey:KEY_SIPE_CONNECTION_TYPE group:GROUP_ACCOUNT_STATUS]; - [myArray release]; - - myArray = [[NSMutableArray alloc] initWithObjects:@"ntlm", @"krb5", @"tls-dsk", nil]; - [account setPreference: [myArray objectAtIndex:[popup_authenticationScheme selectedTag]] - forKey:KEY_SIPE_AUTH_SCHEME group:GROUP_ACCOUNT_STATUS]; - [myArray release]; -} - -@end +// +// ESSIPEAccountViewController.m +// SIPEAdiumPlugin +// +// Created by Matt Meissner on 10/30/09. +// Modified by Michael Lamb on 2/27/13 +// Copyright 2013 Michael Lamb/Harris Kauffman. All rights reserved. +// + +#import +#import +#import "ESSIPEAccountViewController.h" + +#include "prpl.h" +#include "ESPurpleSIPEAccount.h" + +// Gotta define these here, because they're not yet in the 10.9 SDK. :( +#define NSAppKitVersionNumber10_8 1187 +#define NSAppKitVersionNumber10_8_5 1187.4 +#define NSAppKitVersionNumber10_9 1265 + +@implementation ESSIPEAccountViewController + +- (id)init { + [super init]; + + sipe_key_to_gui = + [[NSDictionary alloc] initWithObjectsAndKeys: + textField_password, KEY_SIPE_PASSWORD, + textField_windowsLogin, KEY_SIPE_WINDOWS_LOGIN, + checkBox_singleSignOn, KEY_SIPE_SINGLE_SIGN_ON, + checkbox_dontPublish, KEY_SIPE_DONT_PUBLISH, + textField_userAgent, KEY_SIPE_USER_AGENT, + textField_emailURL, KEY_SIPE_EMAIL_URL, + textField_email, KEY_SIPE_EMAIL, + textField_emailLogin, KEY_SIPE_EMAIL_LOGIN, + textField_emailPassword, KEY_SIPE_EMAIL_PASSWORD, + textField_groupchatUser, KEY_SIPE_GROUP_CHAT_PROXY, + popup_connectionType, KEY_SIPE_CONNECTION_TYPE, + popup_authenticationScheme, KEY_SIPE_AUTH_SCHEME, + checkbox_beastDisable, KEY_SIPE_BEAST_DISABLE, + nil + ]; + + return self; +} + +- (void)dealloc +{ + [sipe_key_to_gui release]; + [super dealloc]; +} + +- (NSString *)nibName{ + return @"ESSIPEAccountView"; +} + +#pragma mark Configuration methods +- (void)configureForAccount:(AIAccount *)inAccount +{ + [super configureForAccount:inAccount]; + + // BEAST mitigation for Mavericks users + if (floor(NSAppKitVersionNumber) <= NSAppKitVersionNumber10_8) { + // We are not running on Mavericks - Don't display BEAST mitigation configuration option + [checkbox_beastDisable setHidden:YES]; + } + + // Only need 1 hash for both connection & auth since there are no overlapping keys + NSDictionary *conn_auth_dict = + [NSDictionary dictionaryWithObjectsAndKeys: + @"NTLM",@"ntlm", + @"Kerberos",@"krb5", + @"TLS-DSK",@"tls-dsk", + @"Auto",@"auto", + @"SSL/TLS",@"tls", + @"TCP",@"tcp", + nil]; + + for (NSString* key in sipe_key_to_gui) { + id value = [sipe_key_to_gui objectForKey:key]; + + if ([value isKindOfClass:[NSTextField class]]) { + NSString *tmp = [account preferenceForKey:key group:GROUP_ACCOUNT_STATUS]; + [value setStringValue:(tmp ? tmp : @"")]; + } else if ([value isKindOfClass:[NSPopUpButton class]]) { + // NSPopUpButton *MUST* appear before NSButton in the if/else + // because NSPopUpButton is a NSButton... + NSString *tmp_key = [account preferenceForKey:key group:GROUP_ACCOUNT_STATUS]; + NSString *tmp = [key isEqualToString:KEY_SIPE_CONNECTION_TYPE] ? @"auto" : @"ntlm"; + + if (conn_auth_dict[tmp_key]) + tmp = conn_auth_dict[tmp_key]; + + [value selectItemWithTitle:tmp]; + } else if ([value isKindOfClass:[NSButton class]]) { + [value setState:[[account preferenceForKey:key group:GROUP_ACCOUNT_STATUS] boolValue]]; + } else { + AILog(@"(ESSIPEAccountViewController) Unknown class %@ for key %@", [value class], key); + } + } +} + +- (void)saveConfiguration +{ + [super saveConfiguration]; + + // Only need 1 hash for both connection & auth since there are no overlapping keys + NSDictionary *conn_auth_dict = + [NSDictionary dictionaryWithObjectsAndKeys: + @"ntlm",@"NTLM", + @"krb5",@"Kerberos", + @"tls-dsk",@"TLS-DSK", + @"auto",@"Auto", + @"tls",@"SSL/TLS", + @"tcp",@"TCP", + nil]; + + for (NSString* key in sipe_key_to_gui) { + id value = [sipe_key_to_gui objectForKey:key]; + + if ([value isKindOfClass:[NSTextField class]]) { + [account + setPreference:[[value stringValue] length] ? [value stringValue] : @"" + forKey:key + group:GROUP_ACCOUNT_STATUS]; + } else if ([value isKindOfClass:[NSPopUpButton class]]) { + // NSPopUpButton *MUST* appear before NSButton in the if/else + // because NSPopUpButton is a NSButton... + NSString *tmp = conn_auth_dict[[[value selectedItem] title]]; + [account + setPreference:tmp + forKey:key + group:GROUP_ACCOUNT_STATUS]; + } else if ([value isKindOfClass:[NSButton class]]) { + [account + setPreference:[NSNumber numberWithBool:[value state]] + forKey:key + group:GROUP_ACCOUNT_STATUS]; + } else { + AILog(@"(ESSIPEAccountViewController) Unknown class %@ for key %@", [value class], key); + } + } +} + +@end diff --git a/src/adium/ESSIPEService.m b/src/adium/ESSIPEService.m dissimilarity index 62% index 4cd14a24..9f83e94d 100644 --- a/src/adium/ESSIPEService.m +++ b/src/adium/ESSIPEService.m @@ -1,163 +1,129 @@ -// -// ESSIPEService.m -// SIPEAdiumPlugin -// -// Created by Matt Meissner on 10/30/09. -// Modified by Michael Lamb on 2/27/13 -// Copyright 2013 Michael Lamb/Harris Kauffman. All rights reserved. -// - -#import -#import -#import -#import - -#import "DCPurpleSIPEJoinChatViewController.h" -#import "ESSIPEAccountViewController.h" -#import "ESPurpleSIPEAccount.h" -#import "ESSIPEService.h" - -@implementation ESSIPEService - -#pragma mark Account/Chat Creation -- (Class)accountClass -{ - return [ESPurpleSIPEAccount class]; -} - -- (AIAccountViewController *)accountViewController{ - return [ESSIPEAccountViewController accountViewController]; -} - -- (DCJoinChatViewController *)joinChatView{ - return [DCPurpleSIPEJoinChatViewController joinChatView]; -} - -- (BOOL)canCreateGroupChats{ - return YES; -} - -#pragma mark Service Description Metadata -- (NSString *)serviceCodeUniqueID{ - return @"libpurple-SIPE"; -} - -- (NSString *)serviceID{ - return @"SIPE"; -} - -- (NSString *)serviceClass{ - return @"SIPE"; -} - -- (NSString *)shortDescription{ - return @"OCS"; -} - -- (NSString *)longDescription{ - return @"Office Communicator"; -} - -- (BOOL)caseSensitive{ - return NO; -} -- (AIServiceImportance)serviceImportance{ - return AIServiceSecondary; -} - -// Some auth schemes may not need a password -- (BOOL)requiresPassword{ - return NO; -} - -- (NSImage *)defaultServiceIconOfType:(AIServiceIconType)iconType { - NSImage *baseImage = [NSImage imageNamed:@"sipe" forClass:[self class]]; - - if ((iconType == AIServiceIconSmall) || (iconType == AIServiceIconList)) { - [baseImage setSize:NSMakeSize(16, 16)]; - } - - return baseImage; -} - - -#pragma mark Service Properties -- (NSCharacterSet *)allowedCharacters -{ - NSMutableCharacterSet *allowedCharacters = [[NSCharacterSet alphanumericCharacterSet] mutableCopy]; - NSCharacterSet *returnSet; - - [allowedCharacters addCharactersInString:@"._@-()[]^%#|/\\`=,"]; - returnSet = [allowedCharacters immutableCopy]; - - return [returnSet autorelease]; -} - -#pragma mark Statuses -- (void)registerStatuses{ - - - [adium.statusController registerStatus:STATUS_NAME_AVAILABLE - withDescription:[adium.statusController localizedDescriptionForCoreStatusName:STATUS_NAME_AVAILABLE] - ofType:AIAvailableStatusType - forService:self]; - - [adium.statusController registerStatus:STATUS_NAME_AWAY - withDescription:[adium.statusController localizedDescriptionForCoreStatusName:STATUS_NAME_AWAY] - ofType:AIAwayStatusType - forService:self]; - - [adium.statusController registerStatus:STATUS_NAME_BUSY - withDescription:[adium.statusController localizedDescriptionForCoreStatusName:STATUS_NAME_BUSY] - ofType:AIAwayStatusType - forService:self]; - - [adium.statusController registerStatus:STATUS_NAME_INVISIBLE - withDescription:[adium.statusController localizedDescriptionForCoreStatusName:STATUS_NAME_INVISIBLE] - ofType:AIInvisibleStatusType - forService:self]; - - [adium.statusController registerStatus:STATUS_NAME_BRB - withDescription:[adium.statusController localizedDescriptionForCoreStatusName:STATUS_NAME_BRB] - ofType:AIAwayStatusType - forService:self]; - - [adium.statusController registerStatus:STATUS_NAME_DND - withDescription:[adium.statusController localizedDescriptionForCoreStatusName:STATUS_NAME_DND] - ofType:AIAwayStatusType - forService:self]; - - [adium.statusController registerStatus:STATUS_NAME_LUNCH - withDescription:[adium.statusController localizedDescriptionForCoreStatusName:STATUS_NAME_LUNCH] - ofType:AIAwayStatusType - forService:self]; - - [adium.statusController registerStatus:STATUS_NAME_OFFLINE - withDescription:[adium.statusController localizedDescriptionForCoreStatusName:STATUS_NAME_OFFLINE] - ofType:AIOfflineStatusType - forService:self]; - - [adium.statusController registerStatus:STATUS_NAME_PHONE - withDescription:[adium.statusController localizedDescriptionForCoreStatusName:STATUS_NAME_PHONE] - ofType:AIAwayStatusType - forService:self]; - - [adium.statusController registerStatus:STATUS_NAME_NOT_AT_DESK - withDescription:[adium.statusController localizedDescriptionForCoreStatusName:STATUS_NAME_NOT_AT_DESK] - ofType:AIAwayStatusType - forService:self]; - - [adium.statusController registerStatus:STATUS_NAME_NOT_IN_OFFICE - withDescription:[adium.statusController localizedDescriptionForCoreStatusName:STATUS_NAME_NOT_IN_OFFICE] - ofType:AIAwayStatusType - forService:self]; - - [adium.statusController registerStatus:STATUS_NAME_AWAY_FRIENDS_ONLY - withDescription:[adium.statusController localizedDescriptionForCoreStatusName:STATUS_NAME_AWAY_FRIENDS_ONLY] - ofType:AIAwayStatusType - forService:self]; -} - - -@end - +// +// ESSIPEService.m +// SIPEAdiumPlugin +// +// Created by Matt Meissner on 10/30/09. +// Modified by Michael Lamb on 2/27/13 +// Copyright 2013 Michael Lamb/Harris Kauffman. All rights reserved. +// + +#import +#import +#import +#import + +#import "DCPurpleSIPEJoinChatViewController.h" +#import "ESSIPEAccountViewController.h" +#import "ESPurpleSIPEAccount.h" +#import "ESSIPEService.h" + +@implementation ESSIPEService + +#pragma mark Account/Chat Creation +- (Class)accountClass +{ + return [ESPurpleSIPEAccount class]; +} + +- (AIAccountViewController *)accountViewController{ + return [ESSIPEAccountViewController accountViewController]; +} + +- (DCJoinChatViewController *)joinChatView{ + return [DCPurpleSIPEJoinChatViewController joinChatView]; +} + +- (BOOL)canCreateGroupChats{ + return YES; +} + +#pragma mark Service Description Metadata +- (NSString *)serviceCodeUniqueID{ + return @"libpurple-SIPE"; +} + +- (NSString *)serviceID{ + return @"SIPE"; +} + +- (NSString *)serviceClass{ + return @"SIPE"; +} + +- (NSString *)shortDescription{ + return @"OCS"; +} + +- (NSString *)longDescription{ + return @"Office Communicator"; +} + +- (BOOL)caseSensitive{ + return NO; +} +- (AIServiceImportance)serviceImportance{ + return AIServiceSecondary; +} + +// Some auth schemes may not need a password +- (BOOL)requiresPassword{ + return NO; +} + +- (NSImage *)defaultServiceIconOfType:(AIServiceIconType)iconType { + NSImage *baseImage = [NSImage imageNamed:@"sipe" forClass:[self class]]; + + if ((iconType == AIServiceIconSmall) || (iconType == AIServiceIconList)) { + [baseImage setSize:NSMakeSize(16, 16)]; + } + + return baseImage; +} + + +#pragma mark Service Properties +- (NSCharacterSet *)allowedCharacters +{ + NSMutableCharacterSet *allowedCharacters = [[NSCharacterSet alphanumericCharacterSet] mutableCopy]; + NSCharacterSet *returnSet; + + [allowedCharacters addCharactersInString:@"._@-()[]^%#|/\\`=,"]; + returnSet = [allowedCharacters immutableCopy]; + + return [returnSet autorelease]; +} + +#pragma mark Statuses +- (void)registerStatuses{ + NSDictionary *statuses = + [NSDictionary dictionaryWithObjectsAndKeys: + AIAvailableStatusType, STATUS_NAME_AVAILABLE, + AIAwayStatusType, STATUS_NAME_AWAY, + AIAwayStatusType, STATUS_NAME_BUSY, + AIInvisibleStatusType, STATUS_NAME_INVISIBLE, + AIAwayStatusType, STATUS_NAME_BRB, + AIAwayStatusType, STATUS_NAME_DND, + AIAwayStatusType, STATUS_NAME_LUNCH, + AIOfflineStatusType, STATUS_NAME_OFFLINE, + AIAwayStatusType, STATUS_NAME_PHONE, + AIAwayStatusType, STATUS_NAME_NOT_AT_DESK, + AIAwayStatusType, STATUS_NAME_NOT_IN_OFFICE, + AIAwayStatusType, STATUS_NAME_AWAY_FRIENDS_ONLY, + nil + ]; + + for (NSString* key in statuses) { + AIStatusType value = [statuses objectForKey:key]; + + [adium.statusController + registerStatus:key + withDescription:[adium.statusController localizedDescriptionForCoreStatusName:key] + ofType:value + forService:self + ]; + } +} + + +@end + diff --git a/src/adium/PurpleDefaultsSIPE.plist b/src/adium/PurpleDefaultsSIPE.plist index f88fe173..153f3255 100644 --- a/src/adium/PurpleDefaultsSIPE.plist +++ b/src/adium/PurpleDefaultsSIPE.plist @@ -2,6 +2,8 @@ + SIPE:Authentication Scheme + ntlm SIPE:Single Sign On SIPE:Dont Publish -- 2.11.4.GIT