Skip to content

Commit

Permalink
Allow disabling Gravatar
Browse files Browse the repository at this point in the history
Resolves #3600
  • Loading branch information
cgx committed May 25, 2016
1 parent 9fc22f2 commit a9ee261
Show file tree
Hide file tree
Showing 12 changed files with 100 additions and 35 deletions.
10 changes: 10 additions & 0 deletions Documentation/SOGoInstallationGuide.asciidoc
Expand Up @@ -1973,6 +1973,16 @@ SOGo webmail interface. The parameter is an array, for example:
`SOGoMailListViewColumnsOrder = (Flagged, Attachment, Priority, From, Subject, Unread, Date, Size);`
|D |SOGoExternalAvatarsEnabled
|Parameter used to enable fetching of avatars from remote services.
Defaults to `YES` when unset.
|U |SOGoGravatarEnabled
|Parameter used to activate fetching of avatars from http://gravatar.com/[Gravatar].
Defaults to `YES` when unset.
|D |SOGoVacationEnabled
|Parameter used to activate the edition from the preferences window of a
vacation message.
Expand Down
1 change: 1 addition & 0 deletions NEWS
Expand Up @@ -3,6 +3,7 @@

Enhancements
- [web] expose all email addresses in autocompletion of message editor (#3443)
- [web] Gravatar service can now be disabled (#3600)

Bug fixes
- [web] fixed creation of chip on blur (sgTransformOnBlur directive)
Expand Down
4 changes: 3 additions & 1 deletion SoObjects/SOGo/SOGoDefaults.plist
Expand Up @@ -54,12 +54,14 @@
SOGoFirstWeekOfYear = "January1";
SOGoShortDateFormat = "%d-%b-%y";
SOGoLongDateFormat = "%A, %B %d, %Y";
SOGoExternalAvatarsEnabled = YES;
SOGoGravatarEnabled = NO;
SOGoAlternateAvatar = "none";

SOGoIMAPServer = "localhost";
SOGoMailDomain = "localhost";
SOGoSelectedAddressBook = "collected";
SOGoRefreshViewCheck = "manually";
SOGoAlternateAvatar = "none";
SOGoMailMessageForwarding = "inline";
SOGoMailReplyPlacement = "below";
SOGoMailSignaturePlacement = "below";
Expand Down
1 change: 1 addition & 0 deletions SoObjects/SOGo/SOGoDomainDefaults.h
Expand Up @@ -47,6 +47,7 @@
- (NSString *) imapFolderSeparator;
- (BOOL) imapAclConformsToIMAPExt;
- (BOOL) forceExternalLoginWithEmail;
- (BOOL) externalAvatarsEnabled;
- (BOOL) sieveScriptsEnabled;
- (BOOL) forwardEnabled;
- (int) forwardConstraints;
Expand Down
7 changes: 6 additions & 1 deletion SoObjects/SOGo/SOGoDomainDefaults.m
@@ -1,6 +1,6 @@
/* SOGoDomainDefaults.m - this file is part of SOGo
*
* Copyright (C) 2009-2015 Inverse inc.
* Copyright (C) 2009-2016 Inverse inc.
*
* This file is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
Expand Down Expand Up @@ -191,6 +191,11 @@ - (BOOL) forceExternalLoginWithEmail
return [self boolForKey: @"SOGoForceIMAPLoginWithEmail"];
}

- (BOOL) externalAvatarsEnabled
{
return [self boolForKey: @"SOGoExternalAvatarsEnabled"];
}

- (BOOL) sieveScriptsEnabled
{
return [self boolForKey: @"SOGoSieveScriptsEnabled"];
Expand Down
1 change: 1 addition & 0 deletions SoObjects/SOGo/SOGoUserDefaults.h
Expand Up @@ -126,6 +126,7 @@ extern NSString *SOGoWeekStartFirstFullWeek;
- (void) setRefreshViewCheck: (NSString *) newValue;
- (NSString *) refreshViewCheck;

- (BOOL) gravatarEnabled;
- (void) setAlternateAvatar: (NSString *) newValue;
- (NSString *) alternateAvatar;

Expand Down
5 changes: 5 additions & 0 deletions SoObjects/SOGo/SOGoUserDefaults.m
Expand Up @@ -514,6 +514,11 @@ - (NSString *) refreshViewCheck
return [self stringForKey: @"SOGoRefreshViewCheck"];
}

- (BOOL) gravatarEnabled
{
return [self boolForKey: @"SOGoGravatarEnabled"];
}

- (void) setAlternateAvatar: (NSString *) newValue
{
[self setObject: newValue forKey: @"SOGoAlternateAvatar"];
Expand Down
1 change: 1 addition & 0 deletions UI/PreferencesUI/English.lproj/Localizable.strings
Expand Up @@ -365,6 +365,7 @@
"TLS" = "TLS";

/* Avatars */
"Use Gravatar" = "Use Gravatar";
"Alternate Avatar" = "Alternate Avatar";
"none" = "None";
"identicon" = "Ident Icon";
Expand Down
17 changes: 15 additions & 2 deletions UI/PreferencesUI/UIxJSONPreferences.m
Expand Up @@ -30,6 +30,7 @@

#import <SOGo/NSObject+Utilities.h>
#import <SOGo/NSString+Utilities.h>
#import <SOGo/SOGoDomainDefaults.h>
#import <SOGo/SOGoUser.h>
#import <SOGo/SOGoUserDefaults.h>
#import <SOGo/SOGoUserSettings.h>
Expand Down Expand Up @@ -73,6 +74,7 @@ - (WOResponse *) jsonDefaultsAction
{
NSMutableDictionary *values, *account;
SOGoUserDefaults *defaults;
SOGoDomainDefaults *domainDefaults;
NSMutableArray *accounts;
NSDictionary *categoryLabels;
NSDictionary *locale;
Expand All @@ -84,6 +86,7 @@ - (WOResponse *) jsonDefaultsAction
}

defaults = [[context activeUser] userDefaults];
domainDefaults = [[context activeUser] domainDefaults];
categoryLabels = nil;

//
Expand All @@ -110,8 +113,18 @@ - (WOResponse *) jsonDefaultsAction
if (![[defaults source] objectForKey: @"SOGoRefreshViewCheck"])
[[defaults source] setObject: [defaults refreshViewCheck] forKey: @"SOGoRefreshViewCheck"];

if (![[defaults source] objectForKey: @"SOGoAlternateAvatar"])
[[defaults source] setObject: [defaults alternateAvatar] forKey: @"SOGoAlternateAvatar"];
if ([domainDefaults externalAvatarsEnabled])
{
if (![[defaults source] objectForKey: @"SOGoGravatarEnabled"])
[[defaults source] setObject: [NSNumber numberWithBool: [defaults gravatarEnabled]] forKey: @"SOGoGravatarEnabled"];
if (![[defaults source] objectForKey: @"SOGoAlternateAvatar"])
[[defaults source] setObject: [defaults alternateAvatar] forKey: @"SOGoAlternateAvatar"];
}
else
{
[[defaults source] setObject: [NSNumber numberWithInt: 0] forKey: @"SOGoGravatarEnabled"];
[[defaults source] removeObjectForKey: @"SOGoAlternateAvatar"];
}

//
// Default Calendar preferences
Expand Down
53 changes: 33 additions & 20 deletions UI/PreferencesUI/UIxPreferences.m
Expand Up @@ -686,7 +686,7 @@ - (NSArray *) hoursList
// SOGoUserSettings *us;
// NSMutableDictionary *moduleSettings;
// NSArray *whiteList;

// us = [user userSettings];
// moduleSettings = [us objectForKey: @"Calendar"];
// whiteList = [moduleSettings objectForKey:@"PreventInvitationsWhitelist"];
Expand All @@ -697,7 +697,7 @@ - (NSArray *) hoursList
// {
// SOGoUserSettings *us;
// NSMutableDictionary *moduleSettings;

// us = [user userSettings];
// moduleSettings = [us objectForKey: @"Calendar"];
// [moduleSettings setObject: whiteListString forKey: @"PreventInvitationsWhitelist"];
Expand Down Expand Up @@ -890,7 +890,7 @@ - (NSArray *) refreshViewList
value = @"every_minute";
else if (interval == 60)
value = @"once_per_hour";
else if (interval == 2 || interval == 5 || interval == 10
else if (interval == 2 || interval == 5 || interval == 10
|| interval == 20 || interval == 30)
value = [NSString stringWithFormat: @"every_%d_minutes", interval];
else
Expand Down Expand Up @@ -1417,6 +1417,11 @@ - (NSString *) itemModuleText
return [self labelForKey: item];
}

- (BOOL) externalAvatarsEnabled
{
return [[user domainDefaults] externalAvatarsEnabled];
}

- (NSArray *) alternateAvatar
{
// See: https://en.gravatar.com/site/implement/images/
Expand Down Expand Up @@ -1795,7 +1800,7 @@ - (BOOL) mailAuxiliaryUserAccountsEnabled
//
- (void) _extractMainIdentity: (NSDictionary *) identity
inDictionary: (NSMutableDictionary *) target

{
/* We perform some validation here as we have no guaranty on the input
validity. */
Expand Down Expand Up @@ -1825,7 +1830,7 @@ - (void) _extractMainIdentity: (NSDictionary *) identity
[target setObject: value forKey: @"SOGoMailCustomEmail"];
else
[target removeObjectForKey: @"SOGoMailCustomEmail"];

value = [[identity objectForKey: @"fullName"]
stringByTrimmingSpaces];
if ([value length] == 0
Expand Down Expand Up @@ -1878,11 +1883,11 @@ - (void) _extractMainReceiptsPreferences: (NSDictionary *) receipts
action = [receipts objectForKey: @"receiptNonRecipientAction"];
if ([self _validateReceiptAction: action])
[target setObject: action forKey: @"SOGoMailReceiptNonRecipientAction"];

action = [receipts objectForKey: @"receiptOutsideDomainAction"];
if ([self _validateReceiptAction: action])
[target setObject: action forKey: @"SOGoMailReceiptOutsideDomainAction"];

action = [receipts objectForKey: @"receiptAnyAction"];
if ([self _validateReceiptAction: action])
[target setObject: action forKey: @"SOGoMailReceiptAnyAction"];
Expand Down Expand Up @@ -2128,10 +2133,10 @@ - (NSString *) forwardEnabled
{
id <WOActionResults> results;
id o, v;

o = [[[context request] contentAsString] objectFromJSONString];
results = nil;

// Proceed with data sanitization of the "defaults"
if ((v = [o objectForKey: @"defaults"]))
{
Expand All @@ -2156,7 +2161,15 @@ - (NSString *) forwardEnabled

if ([[v objectForKey: @"SOGoLongDateFormat"] isEqualToString: @"default"])
[v removeObjectForKey: @"SOGoLongDateFormat"];


if (![self externalAvatarsEnabled])
{
[v removeObjectForKey: @"SOGoGravatarEnabled"];
[[[user userDefaults] source] removeObjectForKey: @"SOGoGravatarEnabled"];
[v removeObjectForKey: @"SOGoAlternateAvatar"];
[[[user userDefaults] source] removeObjectForKey: @"SOGoAlternateAvatar"];
}

//
// We sanitize mail labels
//
Expand All @@ -2166,20 +2179,20 @@ - (NSString *) forwardEnabled
// We encode correctly our keys
sanitizedLabels = [NSMutableDictionary dictionary];
allKeys = [newLabels allKeys];

for (i = 0; i < [allKeys count]; i++)
{
name = [allKeys objectAtIndex: i];

if (![name is7bitSafe])
name = [name stringByEncodingImap4FolderName];

name = [name lowercaseString];

[sanitizedLabels setObject: [newLabels objectForKey: [allKeys objectAtIndex: i]]
forKey: name];
}

[v setObject: sanitizedLabels forKey: @"SOGoMailLabelsColors"];
}

Expand All @@ -2202,23 +2215,23 @@ - (NSString *) forwardEnabled
}

[[[user userDefaults] source] setValues: v];

if ([[user userDefaults] synchronize])
{
SOGoMailAccount *account;
SOGoMailAccounts *folder;
SOGoDomainDefaults *dd;

dd = [[context activeUser] domainDefaults];

// We check if the Sieve server is available *ONLY* if at least one of the option is enabled
if (!([dd sieveScriptsEnabled] || [dd vacationEnabled] || [dd forwardEnabled]) || [self _isSieveServerAvailable])
{

folder = [[[context activeUser] homeFolderInContext: context] mailAccountsFolder: @"Mail"
inContext: context];
account = [folder lookupName: @"0" inContext: context acquire: NO];

if (![account updateFilters])
{
results = (id <WOActionResults>) [self responseWithStatus: 502
Expand All @@ -2230,7 +2243,7 @@ - (NSString *) forwardEnabled
andJSONRepresentation: [NSDictionary dictionaryWithObjectsAndKeys: @"Service temporarily unavailable", @"message", nil]];
}
}

if ((v = [o objectForKey: @"settings"]))
{
[[[user userSettings] source] setValues: v];
Expand Down
32 changes: 22 additions & 10 deletions UI/Templates/PreferencesUI/UIxPreferences.wox
Expand Up @@ -194,16 +194,28 @@
</md-select>
</md-input-container>

<md-input-container>
<label><var:string label:value="Alternate Avatar"/></label>
<md-select ng-model="app.preferences.defaults.SOGoAlternateAvatar">
<var:foreach list="alternateAvatar" item="item">
<md-option var:value="item">
<var:string value="itemAlternateAvatarText"/>
</md-option>
</var:foreach>
</md-select>
</md-input-container>
<var:if condition="externalAvatarsEnabled">
<div layout="row" layout-align="start start">
<md-checkbox flex="20"
ng-model="app.preferences.defaults.SOGoGravatarEnabled"
ng-true-value="1"
ng-false-value="0"
label:aria-label="Use Gravatar">
<var:string label:value="Use Gravatar"/>
</md-checkbox>
<md-input-container class="md-flex">
<label><var:string label:value="Alternate Avatar"/></label>
<md-select ng-model="app.preferences.defaults.SOGoAlternateAvatar"
ng-disabled="!app.preferences.defaults.SOGoGravatarEnabled">
<var:foreach list="alternateAvatar" item="item">
<md-option var:value="item">
<var:string value="itemAlternateAvatarText"/>
</md-option>
</var:foreach>
</md-select>
</md-input-container>
</div>
</var:if>
</div>
</md-content>
</md-tab>
Expand Down
3 changes: 2 additions & 1 deletion UI/WebServerResources/js/Common/sgAvatarImage.directive.js
Expand Up @@ -60,7 +60,8 @@
if (email && vm.urlEmail != email) {
// Email has changed or doesn't match the current URL (this happens when using md-virtual-repeat)
showGenericAvatar();
getGravatar(email);
if (Preferences.defaults.SOGoGravatarEnabled)
getGravatar(email);
}
else if (!email)
showGenericAvatar();
Expand Down

0 comments on commit a9ee261

Please sign in to comment.