Merge pull request #25974 from nextcloud/backport/25417/stable19-fix-account-data-visibility-after-disabling-public-addressbook-upload
[stable19] Fix account data visibility after disabling public addressbook upload
This commit is contained in:
commit
1092ba8328
25
.drone.yml
25
.drone.yml
|
@ -1178,6 +1178,31 @@ trigger:
|
||||||
- pull_request
|
- pull_request
|
||||||
- push
|
- push
|
||||||
|
|
||||||
|
---
|
||||||
|
kind: pipeline
|
||||||
|
name: integration-contacts-menu
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: submodules
|
||||||
|
image: docker:git
|
||||||
|
commands:
|
||||||
|
- git submodule update --init
|
||||||
|
- name: integration-contacts-menu
|
||||||
|
image: nextcloudci/integration-php7.3:integration-php7.3-2
|
||||||
|
commands:
|
||||||
|
- bash tests/drone-run-integration-tests.sh || exit 0
|
||||||
|
- ./occ maintenance:install --admin-pass=admin --data-dir=/dev/shm/nc_int
|
||||||
|
- cd build/integration
|
||||||
|
- ./run.sh features/contacts-menu.feature
|
||||||
|
|
||||||
|
trigger:
|
||||||
|
branch:
|
||||||
|
- master
|
||||||
|
- stable*
|
||||||
|
event:
|
||||||
|
- pull_request
|
||||||
|
- push
|
||||||
|
|
||||||
---
|
---
|
||||||
kind: pipeline
|
kind: pipeline
|
||||||
name: integration-favorites
|
name: integration-favorites
|
||||||
|
|
|
@ -372,6 +372,18 @@ select {
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
&.disabled {
|
||||||
|
/* !important is needed to override important opacity of
|
||||||
|
* ".popovermenu li > .menuitem.active" */
|
||||||
|
opacity: .5 !important;
|
||||||
|
|
||||||
|
cursor: default;
|
||||||
|
|
||||||
|
span {
|
||||||
|
cursor: default;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -117,6 +117,17 @@
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var lookupServerUploadEnabled = $('#lookupServerUploadEnabled').val();
|
||||||
|
if (!lookupServerUploadEnabled && !this._scopes[2].active) {
|
||||||
|
this._scopes[2].hidden = true
|
||||||
|
} else if (!lookupServerUploadEnabled && this._scopes[2].active) {
|
||||||
|
this._scopes[2].hidden = false
|
||||||
|
this._scopes[2].disabled = true
|
||||||
|
} else {
|
||||||
|
this._scopes[2].hidden = false
|
||||||
|
this._scopes[2].disabled = false
|
||||||
|
}
|
||||||
|
|
||||||
this.render();
|
this.render();
|
||||||
this.$el.removeClass('hidden');
|
this.$el.removeClass('hidden');
|
||||||
|
|
||||||
|
|
|
@ -43,7 +43,14 @@
|
||||||
if (!scopeOnly) {
|
if (!scopeOnly) {
|
||||||
self._config.set(field, $('#' + field).val());
|
self._config.set(field, $('#' + field).val());
|
||||||
}
|
}
|
||||||
self._config.set(field + 'Scope', $('#' + field + 'scope').val());
|
// A scope could have been stored as null due to a previous bug.
|
||||||
|
// Null values should be kept as such until the user explicitly
|
||||||
|
// sets the right value, but they will be returned as empty
|
||||||
|
// strings in the template (which would overwrite the null value
|
||||||
|
// if sent). Due to this an extra class is needed to
|
||||||
|
// differentiate them.
|
||||||
|
var initialScopeValue = $('#' + field + 'scope').hasClass('corrupted-scope-value') ? undefined : $('#' + field + 'scope').val();
|
||||||
|
self._config.set(field + 'Scope', initialScopeValue);
|
||||||
|
|
||||||
// Set inputs whenever model values change
|
// Set inputs whenever model values change
|
||||||
if (!scopeOnly) {
|
if (!scopeOnly) {
|
||||||
|
@ -219,6 +226,12 @@
|
||||||
$icon.addClass('icon-link');
|
$icon.addClass('icon-link');
|
||||||
$icon.removeClass('hidden');
|
$icon.removeClass('hidden');
|
||||||
break;
|
break;
|
||||||
|
case '':
|
||||||
|
case null:
|
||||||
|
case undefined:
|
||||||
|
$icon.addClass('icon-error');
|
||||||
|
$icon.removeClass('hidden');
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
|
@ -1,6 +1,15 @@
|
||||||
(function() {
|
(function() {
|
||||||
var template = Handlebars.template, templates = OC.Settings.Templates = OC.Settings.Templates || {};
|
var template = Handlebars.template, templates = OC.Settings.Templates = OC.Settings.Templates || {};
|
||||||
templates['federationscopemenu'] = template({"1":function(container,depth0,helpers,partials,data) {
|
templates['federationscopemenu'] = template({"1":function(container,depth0,helpers,partials,data) {
|
||||||
|
var stack1, lookupProperty = container.lookupProperty || function(parent, propertyName) {
|
||||||
|
if (Object.prototype.hasOwnProperty.call(parent, propertyName)) {
|
||||||
|
return parent[propertyName];
|
||||||
|
}
|
||||||
|
return undefined
|
||||||
|
};
|
||||||
|
|
||||||
|
return ((stack1 = lookupProperty(helpers,"unless").call(depth0 != null ? depth0 : (container.nullContext || {}),(depth0 != null ? lookupProperty(depth0,"hidden") : depth0),{"name":"unless","hash":{},"fn":container.program(2, data, 0),"inverse":container.noop,"data":data,"loc":{"start":{"line":3,"column":2},"end":{"line":25,"column":13}}})) != null ? stack1 : "");
|
||||||
|
},"2":function(container,depth0,helpers,partials,data) {
|
||||||
var stack1, helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=container.hooks.helperMissing, alias3="function", alias4=container.escapeExpression, lookupProperty = container.lookupProperty || function(parent, propertyName) {
|
var stack1, helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=container.hooks.helperMissing, alias3="function", alias4=container.escapeExpression, lookupProperty = container.lookupProperty || function(parent, propertyName) {
|
||||||
if (Object.prototype.hasOwnProperty.call(parent, propertyName)) {
|
if (Object.prototype.hasOwnProperty.call(parent, propertyName)) {
|
||||||
return parent[propertyName];
|
return parent[propertyName];
|
||||||
|
@ -8,22 +17,49 @@ templates['federationscopemenu'] = template({"1":function(container,depth0,helpe
|
||||||
return undefined
|
return undefined
|
||||||
};
|
};
|
||||||
|
|
||||||
return " <li tabindex=\"0\">\n <a href=\"#\" class=\"menuitem action action-"
|
return " <li tabindex=\"0\">\n"
|
||||||
+ alias4(((helper = (helper = lookupProperty(helpers,"name") || (depth0 != null ? lookupProperty(depth0,"name") : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"name","hash":{},"data":data,"loc":{"start":{"line":4,"column":45},"end":{"line":4,"column":53}}}) : helper)))
|
+ ((stack1 = lookupProperty(helpers,"if").call(alias1,(depth0 != null ? lookupProperty(depth0,"disabled") : depth0),{"name":"if","hash":{},"fn":container.program(3, data, 0),"inverse":container.program(6, data, 0),"data":data,"loc":{"start":{"line":5,"column":3},"end":{"line":9,"column":10}}})) != null ? stack1 : "")
|
||||||
+ " permanent "
|
+ ((stack1 = lookupProperty(helpers,"if").call(alias1,(depth0 != null ? lookupProperty(depth0,"iconClass") : depth0),{"name":"if","hash":{},"fn":container.program(8, data, 0),"inverse":container.program(10, data, 0),"data":data,"loc":{"start":{"line":10,"column":4},"end":{"line":14,"column":11}}})) != null ? stack1 : "")
|
||||||
+ ((stack1 = lookupProperty(helpers,"if").call(alias1,(depth0 != null ? lookupProperty(depth0,"active") : depth0),{"name":"if","hash":{},"fn":container.program(2, data, 0),"inverse":container.noop,"data":data,"loc":{"start":{"line":4,"column":64},"end":{"line":4,"column":91}}})) != null ? stack1 : "")
|
|
||||||
+ "\" data-action=\""
|
|
||||||
+ alias4(((helper = (helper = lookupProperty(helpers,"name") || (depth0 != null ? lookupProperty(depth0,"name") : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"name","hash":{},"data":data,"loc":{"start":{"line":4,"column":106},"end":{"line":4,"column":114}}}) : helper)))
|
|
||||||
+ "\">\n"
|
|
||||||
+ ((stack1 = lookupProperty(helpers,"if").call(alias1,(depth0 != null ? lookupProperty(depth0,"iconClass") : depth0),{"name":"if","hash":{},"fn":container.program(4, data, 0),"inverse":container.program(6, data, 0),"data":data,"loc":{"start":{"line":5,"column":4},"end":{"line":9,"column":11}}})) != null ? stack1 : "")
|
|
||||||
+ " <p>\n <strong class=\"menuitem-text\">"
|
+ " <p>\n <strong class=\"menuitem-text\">"
|
||||||
+ alias4(((helper = (helper = lookupProperty(helpers,"displayName") || (depth0 != null ? lookupProperty(depth0,"displayName") : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"displayName","hash":{},"data":data,"loc":{"start":{"line":11,"column":35},"end":{"line":11,"column":50}}}) : helper)))
|
+ alias4(((helper = (helper = lookupProperty(helpers,"displayName") || (depth0 != null ? lookupProperty(depth0,"displayName") : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"displayName","hash":{},"data":data,"loc":{"start":{"line":16,"column":35},"end":{"line":16,"column":50}}}) : helper)))
|
||||||
+ "</strong><br>\n <span class=\"menuitem-text-detail\">"
|
+ "</strong><br>\n <span class=\"menuitem-text-detail\">"
|
||||||
+ alias4(((helper = (helper = lookupProperty(helpers,"tooltip") || (depth0 != null ? lookupProperty(depth0,"tooltip") : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"tooltip","hash":{},"data":data,"loc":{"start":{"line":12,"column":40},"end":{"line":12,"column":51}}}) : helper)))
|
+ alias4(((helper = (helper = lookupProperty(helpers,"tooltip") || (depth0 != null ? lookupProperty(depth0,"tooltip") : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"tooltip","hash":{},"data":data,"loc":{"start":{"line":17,"column":40},"end":{"line":17,"column":51}}}) : helper)))
|
||||||
+ "</span>\n </p>\n </a>\n </li>\n";
|
+ "</span>\n </p>\n"
|
||||||
},"2":function(container,depth0,helpers,partials,data) {
|
+ ((stack1 = lookupProperty(helpers,"if").call(alias1,(depth0 != null ? lookupProperty(depth0,"disabled") : depth0),{"name":"if","hash":{},"fn":container.program(12, data, 0),"inverse":container.program(14, data, 0),"data":data,"loc":{"start":{"line":19,"column":3},"end":{"line":23,"column":10}}})) != null ? stack1 : "")
|
||||||
return "active";
|
+ " </li>\n";
|
||||||
|
},"3":function(container,depth0,helpers,partials,data) {
|
||||||
|
var stack1, helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=container.hooks.helperMissing, alias3="function", alias4=container.escapeExpression, lookupProperty = container.lookupProperty || function(parent, propertyName) {
|
||||||
|
if (Object.prototype.hasOwnProperty.call(parent, propertyName)) {
|
||||||
|
return parent[propertyName];
|
||||||
|
}
|
||||||
|
return undefined
|
||||||
|
};
|
||||||
|
|
||||||
|
return " <div class=\"menuitem action action-"
|
||||||
|
+ alias4(((helper = (helper = lookupProperty(helpers,"name") || (depth0 != null ? lookupProperty(depth0,"name") : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"name","hash":{},"data":data,"loc":{"start":{"line":6,"column":38},"end":{"line":6,"column":46}}}) : helper)))
|
||||||
|
+ " permanent "
|
||||||
|
+ ((stack1 = lookupProperty(helpers,"if").call(alias1,(depth0 != null ? lookupProperty(depth0,"active") : depth0),{"name":"if","hash":{},"fn":container.program(4, data, 0),"inverse":container.noop,"data":data,"loc":{"start":{"line":6,"column":57},"end":{"line":6,"column":84}}})) != null ? stack1 : "")
|
||||||
|
+ " disabled\" data-action=\""
|
||||||
|
+ alias4(((helper = (helper = lookupProperty(helpers,"name") || (depth0 != null ? lookupProperty(depth0,"name") : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"name","hash":{},"data":data,"loc":{"start":{"line":6,"column":108},"end":{"line":6,"column":116}}}) : helper)))
|
||||||
|
+ "\">\n";
|
||||||
},"4":function(container,depth0,helpers,partials,data) {
|
},"4":function(container,depth0,helpers,partials,data) {
|
||||||
|
return "active";
|
||||||
|
},"6":function(container,depth0,helpers,partials,data) {
|
||||||
|
var stack1, helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=container.hooks.helperMissing, alias3="function", alias4=container.escapeExpression, lookupProperty = container.lookupProperty || function(parent, propertyName) {
|
||||||
|
if (Object.prototype.hasOwnProperty.call(parent, propertyName)) {
|
||||||
|
return parent[propertyName];
|
||||||
|
}
|
||||||
|
return undefined
|
||||||
|
};
|
||||||
|
|
||||||
|
return " <a href=\"#\" class=\"menuitem action action-"
|
||||||
|
+ alias4(((helper = (helper = lookupProperty(helpers,"name") || (depth0 != null ? lookupProperty(depth0,"name") : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"name","hash":{},"data":data,"loc":{"start":{"line":8,"column":45},"end":{"line":8,"column":53}}}) : helper)))
|
||||||
|
+ " permanent "
|
||||||
|
+ ((stack1 = lookupProperty(helpers,"if").call(alias1,(depth0 != null ? lookupProperty(depth0,"active") : depth0),{"name":"if","hash":{},"fn":container.program(4, data, 0),"inverse":container.noop,"data":data,"loc":{"start":{"line":8,"column":64},"end":{"line":8,"column":91}}})) != null ? stack1 : "")
|
||||||
|
+ "\" data-action=\""
|
||||||
|
+ alias4(((helper = (helper = lookupProperty(helpers,"name") || (depth0 != null ? lookupProperty(depth0,"name") : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"name","hash":{},"data":data,"loc":{"start":{"line":8,"column":106},"end":{"line":8,"column":114}}}) : helper)))
|
||||||
|
+ "\">\n";
|
||||||
|
},"8":function(container,depth0,helpers,partials,data) {
|
||||||
var helper, lookupProperty = container.lookupProperty || function(parent, propertyName) {
|
var helper, lookupProperty = container.lookupProperty || function(parent, propertyName) {
|
||||||
if (Object.prototype.hasOwnProperty.call(parent, propertyName)) {
|
if (Object.prototype.hasOwnProperty.call(parent, propertyName)) {
|
||||||
return parent[propertyName];
|
return parent[propertyName];
|
||||||
|
@ -32,10 +68,14 @@ templates['federationscopemenu'] = template({"1":function(container,depth0,helpe
|
||||||
};
|
};
|
||||||
|
|
||||||
return " <span class=\"icon "
|
return " <span class=\"icon "
|
||||||
+ container.escapeExpression(((helper = (helper = lookupProperty(helpers,"iconClass") || (depth0 != null ? lookupProperty(depth0,"iconClass") : depth0)) != null ? helper : container.hooks.helperMissing),(typeof helper === "function" ? helper.call(depth0 != null ? depth0 : (container.nullContext || {}),{"name":"iconClass","hash":{},"data":data,"loc":{"start":{"line":6,"column":23},"end":{"line":6,"column":36}}}) : helper)))
|
+ container.escapeExpression(((helper = (helper = lookupProperty(helpers,"iconClass") || (depth0 != null ? lookupProperty(depth0,"iconClass") : depth0)) != null ? helper : container.hooks.helperMissing),(typeof helper === "function" ? helper.call(depth0 != null ? depth0 : (container.nullContext || {}),{"name":"iconClass","hash":{},"data":data,"loc":{"start":{"line":11,"column":23},"end":{"line":11,"column":36}}}) : helper)))
|
||||||
+ "\"></span>\n";
|
+ "\"></span>\n";
|
||||||
},"6":function(container,depth0,helpers,partials,data) {
|
},"10":function(container,depth0,helpers,partials,data) {
|
||||||
return " <span class=\"no-icon\"></span>\n";
|
return " <span class=\"no-icon\"></span>\n";
|
||||||
|
},"12":function(container,depth0,helpers,partials,data) {
|
||||||
|
return " </div>\n";
|
||||||
|
},"14":function(container,depth0,helpers,partials,data) {
|
||||||
|
return " </a>\n";
|
||||||
},"compiler":[8,">= 4.3.0"],"main":function(container,depth0,helpers,partials,data) {
|
},"compiler":[8,">= 4.3.0"],"main":function(container,depth0,helpers,partials,data) {
|
||||||
var stack1, lookupProperty = container.lookupProperty || function(parent, propertyName) {
|
var stack1, lookupProperty = container.lookupProperty || function(parent, propertyName) {
|
||||||
if (Object.prototype.hasOwnProperty.call(parent, propertyName)) {
|
if (Object.prototype.hasOwnProperty.call(parent, propertyName)) {
|
||||||
|
@ -45,7 +85,7 @@ templates['federationscopemenu'] = template({"1":function(container,depth0,helpe
|
||||||
};
|
};
|
||||||
|
|
||||||
return "<ul>\n"
|
return "<ul>\n"
|
||||||
+ ((stack1 = lookupProperty(helpers,"each").call(depth0 != null ? depth0 : (container.nullContext || {}),(depth0 != null ? lookupProperty(depth0,"items") : depth0),{"name":"each","hash":{},"fn":container.program(1, data, 0),"inverse":container.noop,"data":data,"loc":{"start":{"line":2,"column":1},"end":{"line":16,"column":10}}})) != null ? stack1 : "")
|
+ ((stack1 = lookupProperty(helpers,"each").call(depth0 != null ? depth0 : (container.nullContext || {}),(depth0 != null ? lookupProperty(depth0,"items") : depth0),{"name":"each","hash":{},"fn":container.program(1, data, 0),"inverse":container.noop,"data":data,"loc":{"start":{"line":2,"column":1},"end":{"line":26,"column":10}}})) != null ? stack1 : "")
|
||||||
+ "</ul>\n";
|
+ "</ul>\n";
|
||||||
},"useData":true});
|
},"useData":true});
|
||||||
})();
|
})();
|
|
@ -1,7 +1,12 @@
|
||||||
<ul>
|
<ul>
|
||||||
{{#each items}}
|
{{#each items}}
|
||||||
|
{{#unless hidden}}
|
||||||
<li tabindex="0">
|
<li tabindex="0">
|
||||||
|
{{#if disabled}}
|
||||||
|
<div class="menuitem action action-{{name}} permanent {{#if active}}active{{/if}} disabled" data-action="{{name}}">
|
||||||
|
{{else}}
|
||||||
<a href="#" class="menuitem action action-{{name}} permanent {{#if active}}active{{/if}}" data-action="{{name}}">
|
<a href="#" class="menuitem action action-{{name}} permanent {{#if active}}active{{/if}}" data-action="{{name}}">
|
||||||
|
{{/if}}
|
||||||
{{#if iconClass}}
|
{{#if iconClass}}
|
||||||
<span class="icon {{iconClass}}"></span>
|
<span class="icon {{iconClass}}"></span>
|
||||||
{{else}}
|
{{else}}
|
||||||
|
@ -11,7 +16,12 @@
|
||||||
<strong class="menuitem-text">{{displayName}}</strong><br>
|
<strong class="menuitem-text">{{displayName}}</strong><br>
|
||||||
<span class="menuitem-text-detail">{{tooltip}}</span>
|
<span class="menuitem-text-detail">{{tooltip}}</span>
|
||||||
</p>
|
</p>
|
||||||
|
{{#if disabled}}
|
||||||
|
</div>
|
||||||
|
{{else}}
|
||||||
</a>
|
</a>
|
||||||
|
{{/if}}
|
||||||
</li>
|
</li>
|
||||||
|
{{/unless}}
|
||||||
{{/each}}
|
{{/each}}
|
||||||
</ul>
|
</ul>
|
||||||
|
|
|
@ -38,6 +38,7 @@ use OC\ForbiddenException;
|
||||||
use OC\Security\IdentityProof\Manager;
|
use OC\Security\IdentityProof\Manager;
|
||||||
use OCA\Settings\BackgroundJobs\VerifyUserData;
|
use OCA\Settings\BackgroundJobs\VerifyUserData;
|
||||||
use OCA\User_LDAP\User_Proxy;
|
use OCA\User_LDAP\User_Proxy;
|
||||||
|
use OCP\Accounts\IAccountManager;
|
||||||
use OCP\App\IAppManager;
|
use OCP\App\IAppManager;
|
||||||
use OCP\AppFramework\Controller;
|
use OCP\AppFramework\Controller;
|
||||||
use OCP\AppFramework\Http\DataResponse;
|
use OCP\AppFramework\Http\DataResponse;
|
||||||
|
@ -343,7 +344,7 @@ class UsersController extends Controller {
|
||||||
$twitter,
|
$twitter,
|
||||||
$twitterScope
|
$twitterScope
|
||||||
) {
|
) {
|
||||||
$email = strtolower($email);
|
$email = !is_null($email) ? strtolower($email) : $email;
|
||||||
if (!empty($email) && !$this->mailer->validateMailAddress($email)) {
|
if (!empty($email) && !$this->mailer->validateMailAddress($email)) {
|
||||||
return new DataResponse(
|
return new DataResponse(
|
||||||
[
|
[
|
||||||
|
@ -357,19 +358,51 @@ class UsersController extends Controller {
|
||||||
}
|
}
|
||||||
$user = $this->userSession->getUser();
|
$user = $this->userSession->getUser();
|
||||||
$data = $this->accountManager->getUser($user);
|
$data = $this->accountManager->getUser($user);
|
||||||
$data[AccountManager::PROPERTY_AVATAR] = ['scope' => $avatarScope];
|
if (!is_null($avatarScope)) {
|
||||||
|
$data[IAccountManager::PROPERTY_AVATAR]['scope'] = $avatarScope;
|
||||||
|
}
|
||||||
if ($this->config->getSystemValue('allow_user_to_change_display_name', true) !== false) {
|
if ($this->config->getSystemValue('allow_user_to_change_display_name', true) !== false) {
|
||||||
$data[AccountManager::PROPERTY_DISPLAYNAME] = ['value' => $displayname, 'scope' => $displaynameScope];
|
if (!is_null($displayname)) {
|
||||||
$data[AccountManager::PROPERTY_EMAIL] = ['value' => $email, 'scope' => $emailScope];
|
$data[IAccountManager::PROPERTY_DISPLAYNAME]['value'] = $displayname;
|
||||||
|
}
|
||||||
|
if (!is_null($displaynameScope)) {
|
||||||
|
$data[IAccountManager::PROPERTY_DISPLAYNAME]['scope'] = $displaynameScope;
|
||||||
|
}
|
||||||
|
if (!is_null($email)) {
|
||||||
|
$data[IAccountManager::PROPERTY_EMAIL]['value'] = $email;
|
||||||
|
}
|
||||||
|
if (!is_null($emailScope)) {
|
||||||
|
$data[IAccountManager::PROPERTY_EMAIL]['scope'] = $emailScope;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if ($this->appManager->isEnabledForUser('federatedfilesharing')) {
|
if ($this->appManager->isEnabledForUser('federatedfilesharing')) {
|
||||||
$federatedFileSharing = new \OCA\FederatedFileSharing\AppInfo\Application();
|
$federatedFileSharing = new \OCA\FederatedFileSharing\AppInfo\Application();
|
||||||
$shareProvider = $federatedFileSharing->getFederatedShareProvider();
|
$shareProvider = $federatedFileSharing->getFederatedShareProvider();
|
||||||
if ($shareProvider->isLookupServerUploadEnabled()) {
|
if ($shareProvider->isLookupServerUploadEnabled()) {
|
||||||
$data[AccountManager::PROPERTY_WEBSITE] = ['value' => $website, 'scope' => $websiteScope];
|
if (!is_null($website)) {
|
||||||
$data[AccountManager::PROPERTY_ADDRESS] = ['value' => $address, 'scope' => $addressScope];
|
$data[IAccountManager::PROPERTY_WEBSITE]['value'] = $website;
|
||||||
$data[AccountManager::PROPERTY_PHONE] = ['value' => $phone, 'scope' => $phoneScope];
|
}
|
||||||
$data[AccountManager::PROPERTY_TWITTER] = ['value' => $twitter, 'scope' => $twitterScope];
|
if (!is_null($websiteScope)) {
|
||||||
|
$data[IAccountManager::PROPERTY_WEBSITE]['scope'] = $websiteScope;
|
||||||
|
}
|
||||||
|
if (!is_null($address)) {
|
||||||
|
$data[IAccountManager::PROPERTY_ADDRESS]['value'] = $address;
|
||||||
|
}
|
||||||
|
if (!is_null($addressScope)) {
|
||||||
|
$data[IAccountManager::PROPERTY_ADDRESS]['scope'] = $addressScope;
|
||||||
|
}
|
||||||
|
if (!is_null($phone)) {
|
||||||
|
$data[IAccountManager::PROPERTY_PHONE]['value'] = $phone;
|
||||||
|
}
|
||||||
|
if (!is_null($phoneScope)) {
|
||||||
|
$data[IAccountManager::PROPERTY_PHONE]['scope'] = $phoneScope;
|
||||||
|
}
|
||||||
|
if (!is_null($twitter)) {
|
||||||
|
$data[IAccountManager::PROPERTY_TWITTER]['value'] = $twitter;
|
||||||
|
}
|
||||||
|
if (!is_null($twitterScope)) {
|
||||||
|
$data[IAccountManager::PROPERTY_TWITTER]['scope'] = $twitterScope;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
|
@ -379,15 +412,15 @@ class UsersController extends Controller {
|
||||||
'status' => 'success',
|
'status' => 'success',
|
||||||
'data' => [
|
'data' => [
|
||||||
'userId' => $user->getUID(),
|
'userId' => $user->getUID(),
|
||||||
'avatarScope' => $data[AccountManager::PROPERTY_AVATAR]['scope'],
|
'avatarScope' => $data[IAccountManager::PROPERTY_AVATAR]['scope'],
|
||||||
'displayname' => $data[AccountManager::PROPERTY_DISPLAYNAME]['value'],
|
'displayname' => $data[IAccountManager::PROPERTY_DISPLAYNAME]['value'],
|
||||||
'displaynameScope' => $data[AccountManager::PROPERTY_DISPLAYNAME]['scope'],
|
'displaynameScope' => $data[IAccountManager::PROPERTY_DISPLAYNAME]['scope'],
|
||||||
'email' => $data[AccountManager::PROPERTY_EMAIL]['value'],
|
'email' => $data[IAccountManager::PROPERTY_EMAIL]['value'],
|
||||||
'emailScope' => $data[AccountManager::PROPERTY_EMAIL]['scope'],
|
'emailScope' => $data[IAccountManager::PROPERTY_EMAIL]['scope'],
|
||||||
'website' => $data[AccountManager::PROPERTY_WEBSITE]['value'],
|
'website' => $data[IAccountManager::PROPERTY_WEBSITE]['value'],
|
||||||
'websiteScope' => $data[AccountManager::PROPERTY_WEBSITE]['scope'],
|
'websiteScope' => $data[IAccountManager::PROPERTY_WEBSITE]['scope'],
|
||||||
'address' => $data[AccountManager::PROPERTY_ADDRESS]['value'],
|
'address' => $data[IAccountManager::PROPERTY_ADDRESS]['value'],
|
||||||
'addressScope' => $data[AccountManager::PROPERTY_ADDRESS]['scope'],
|
'addressScope' => $data[IAccountManager::PROPERTY_ADDRESS]['scope'],
|
||||||
'message' => $this->l10n->t('Settings saved')
|
'message' => $this->l10n->t('Settings saved')
|
||||||
]
|
]
|
||||||
],
|
],
|
||||||
|
|
|
@ -34,6 +34,9 @@ script('settings', [
|
||||||
]);
|
]);
|
||||||
?>
|
?>
|
||||||
|
|
||||||
|
<!-- config hints for javascript -->
|
||||||
|
<input type="hidden" name="lookupServerUploadEnabled" id="lookupServerUploadEnabled" value="<?php p($_['lookupServerUploadEnabled']); ?>" />
|
||||||
|
|
||||||
<div id="personal-settings">
|
<div id="personal-settings">
|
||||||
<div id="personal-settings-avatar-container" class="personal-settings-container">
|
<div id="personal-settings-avatar-container" class="personal-settings-container">
|
||||||
<div>
|
<div>
|
||||||
|
@ -67,9 +70,7 @@ script('settings', [
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<span class="icon-checkmark hidden"></span>
|
<span class="icon-checkmark hidden"></span>
|
||||||
<?php if ($_['lookupServerUploadEnabled']) { ?>
|
<input type="hidden" id="avatarscope" value="<?php p($_['avatarScope']) ?>"<?php if (is_null($_['avatarScope'])): ?> class="corrupted-scope-value"<?php endif ?>>
|
||||||
<input type="hidden" id="avatarscope" value="<?php p($_['avatarScope']) ?>">
|
|
||||||
<?php } ?>
|
|
||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
<div class="personal-settings-setting-box personal-settings-group-box section">
|
<div class="personal-settings-setting-box personal-settings-group-box section">
|
||||||
|
@ -123,9 +124,7 @@ script('settings', [
|
||||||
<?php } ?>
|
<?php } ?>
|
||||||
<span class="icon-checkmark hidden"></span>
|
<span class="icon-checkmark hidden"></span>
|
||||||
<span class="icon-error hidden" ></span>
|
<span class="icon-error hidden" ></span>
|
||||||
<?php if ($_['lookupServerUploadEnabled']) { ?>
|
<input type="hidden" id="displaynamescope" value="<?php p($_['displayNameScope']) ?>"<?php if (is_null($_['displayNameScope'])): ?> class="corrupted-scope-value"<?php endif ?>>
|
||||||
<input type="hidden" id="displaynamescope" value="<?php p($_['displayNameScope']) ?>">
|
|
||||||
<?php } ?>
|
|
||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
<div class="personal-settings-setting-box">
|
<div class="personal-settings-setting-box">
|
||||||
|
@ -173,9 +172,7 @@ script('settings', [
|
||||||
<?php if ($_['displayNameChangeSupported']) { ?>
|
<?php if ($_['displayNameChangeSupported']) { ?>
|
||||||
<em><?php p($l->t('For password reset and notifications')); ?></em>
|
<em><?php p($l->t('For password reset and notifications')); ?></em>
|
||||||
<?php } ?>
|
<?php } ?>
|
||||||
<?php if ($_['lookupServerUploadEnabled']) { ?>
|
<input type="hidden" id="emailscope" value="<?php p($_['emailScope']) ?>"<?php if (is_null($_['emailScope'])): ?> class="corrupted-scope-value"<?php endif ?>>
|
||||||
<input type="hidden" id="emailscope" value="<?php p($_['emailScope']) ?>">
|
|
||||||
<?php } ?>
|
|
||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
<?php if (!empty($_['phone']) || $_['lookupServerUploadEnabled']) { ?>
|
<?php if (!empty($_['phone']) || $_['lookupServerUploadEnabled']) { ?>
|
||||||
|
@ -196,9 +193,7 @@ script('settings', [
|
||||||
placeholder="<?php p($l->t('Your phone number')); ?>"
|
placeholder="<?php p($l->t('Your phone number')); ?>"
|
||||||
autocomplete="on" autocapitalize="none" autocorrect="off" />
|
autocomplete="on" autocapitalize="none" autocorrect="off" />
|
||||||
<span class="icon-checkmark hidden"></span>
|
<span class="icon-checkmark hidden"></span>
|
||||||
<?php if ($_['lookupServerUploadEnabled']) { ?>
|
<input type="hidden" id="phonescope" value="<?php p($_['phoneScope']) ?>"<?php if (is_null($_['phoneScope'])): ?> class="corrupted-scope-value"<?php endif ?>>
|
||||||
<input type="hidden" id="phonescope" value="<?php p($_['phoneScope']) ?>">
|
|
||||||
<?php } ?>
|
|
||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
<?php } ?>
|
<?php } ?>
|
||||||
|
@ -220,9 +215,7 @@ script('settings', [
|
||||||
value="<?php p($_['address']) ?>"
|
value="<?php p($_['address']) ?>"
|
||||||
autocomplete="on" autocapitalize="none" autocorrect="off" />
|
autocomplete="on" autocapitalize="none" autocorrect="off" />
|
||||||
<span class="icon-checkmark hidden"></span>
|
<span class="icon-checkmark hidden"></span>
|
||||||
<?php if ($_['lookupServerUploadEnabled']) { ?>
|
<input type="hidden" id="addressscope" value="<?php p($_['addressScope']) ?>"<?php if (is_null($_['addressScope'])): ?> class="corrupted-scope-value"<?php endif ?>>
|
||||||
<input type="hidden" id="addressscope" value="<?php p($_['addressScope']) ?>">
|
|
||||||
<?php } ?>
|
|
||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
<?php } ?>
|
<?php } ?>
|
||||||
|
@ -275,9 +268,7 @@ script('settings', [
|
||||||
} ?>
|
} ?>
|
||||||
/>
|
/>
|
||||||
<span class="icon-checkmark hidden"></span>
|
<span class="icon-checkmark hidden"></span>
|
||||||
<?php if ($_['lookupServerUploadEnabled']) { ?>
|
<input type="hidden" id="websitescope" value="<?php p($_['websiteScope']) ?>"<?php if (is_null($_['websiteScope'])): ?> class="corrupted-scope-value"<?php endif ?>>
|
||||||
<input type="hidden" id="websitescope" value="<?php p($_['websiteScope']) ?>">
|
|
||||||
<?php } ?>
|
|
||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
<?php } ?>
|
<?php } ?>
|
||||||
|
@ -330,9 +321,7 @@ script('settings', [
|
||||||
} ?>
|
} ?>
|
||||||
/>
|
/>
|
||||||
<span class="icon-checkmark hidden"></span>
|
<span class="icon-checkmark hidden"></span>
|
||||||
<?php if ($_['lookupServerUploadEnabled']) { ?>
|
<input type="hidden" id="twitterscope" value="<?php p($_['twitterScope']) ?>"<?php if (is_null($_['twitterScope'])): ?> class="corrupted-scope-value"<?php endif ?>>
|
||||||
<input type="hidden" id="twitterscope" value="<?php p($_['twitterScope']) ?>">
|
|
||||||
<?php } ?>
|
|
||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
<?php } ?>
|
<?php } ?>
|
||||||
|
|
|
@ -30,6 +30,7 @@ use OC\Accounts\AccountManager;
|
||||||
use OC\Encryption\Exceptions\ModuleDoesNotExistsException;
|
use OC\Encryption\Exceptions\ModuleDoesNotExistsException;
|
||||||
use OC\Group\Manager;
|
use OC\Group\Manager;
|
||||||
use OCA\Settings\Controller\UsersController;
|
use OCA\Settings\Controller\UsersController;
|
||||||
|
use OCP\Accounts\IAccountManager;
|
||||||
use OCP\App\IAppManager;
|
use OCP\App\IAppManager;
|
||||||
use OCP\AppFramework\Http;
|
use OCP\AppFramework\Http;
|
||||||
use OCP\BackgroundJob\IJobList;
|
use OCP\BackgroundJob\IJobList;
|
||||||
|
@ -165,6 +166,51 @@ class UsersControllerTest extends \Test\TestCase {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected function getDefaultAccountManagerUserData() {
|
||||||
|
return [
|
||||||
|
IAccountManager::PROPERTY_DISPLAYNAME =>
|
||||||
|
[
|
||||||
|
'value' => 'Default display name',
|
||||||
|
'scope' => IAccountManager::VISIBILITY_CONTACTS_ONLY,
|
||||||
|
'verified' => IAccountManager::VERIFIED,
|
||||||
|
],
|
||||||
|
IAccountManager::PROPERTY_ADDRESS =>
|
||||||
|
[
|
||||||
|
'value' => 'Default address',
|
||||||
|
'scope' => IAccountManager::VISIBILITY_PRIVATE,
|
||||||
|
'verified' => IAccountManager::VERIFIED,
|
||||||
|
],
|
||||||
|
IAccountManager::PROPERTY_WEBSITE =>
|
||||||
|
[
|
||||||
|
'value' => 'Default website',
|
||||||
|
'scope' => IAccountManager::VISIBILITY_PRIVATE,
|
||||||
|
'verified' => IAccountManager::VERIFIED,
|
||||||
|
],
|
||||||
|
IAccountManager::PROPERTY_EMAIL =>
|
||||||
|
[
|
||||||
|
'value' => 'Default email',
|
||||||
|
'scope' => IAccountManager::VISIBILITY_CONTACTS_ONLY,
|
||||||
|
'verified' => IAccountManager::VERIFIED,
|
||||||
|
],
|
||||||
|
IAccountManager::PROPERTY_AVATAR =>
|
||||||
|
[
|
||||||
|
'scope' => IAccountManager::VISIBILITY_CONTACTS_ONLY
|
||||||
|
],
|
||||||
|
IAccountManager::PROPERTY_PHONE =>
|
||||||
|
[
|
||||||
|
'value' => 'Default phone',
|
||||||
|
'scope' => IAccountManager::VISIBILITY_PRIVATE,
|
||||||
|
'verified' => IAccountManager::VERIFIED,
|
||||||
|
],
|
||||||
|
IAccountManager::PROPERTY_TWITTER =>
|
||||||
|
[
|
||||||
|
'value' => 'Default twitter',
|
||||||
|
'scope' => IAccountManager::VISIBILITY_PRIVATE,
|
||||||
|
'verified' => IAccountManager::VERIFIED,
|
||||||
|
],
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @dataProvider dataTestSetUserSettings
|
* @dataProvider dataTestSetUserSettings
|
||||||
*
|
*
|
||||||
|
@ -189,48 +235,7 @@ class UsersControllerTest extends \Test\TestCase {
|
||||||
$this->accountManager->expects($this->once())
|
$this->accountManager->expects($this->once())
|
||||||
->method('getUser')
|
->method('getUser')
|
||||||
->with($user)
|
->with($user)
|
||||||
->willReturn([
|
->willReturn($this->getDefaultAccountManagerUserData());
|
||||||
AccountManager::PROPERTY_DISPLAYNAME =>
|
|
||||||
[
|
|
||||||
'value' => 'Display name',
|
|
||||||
'scope' => AccountManager::VISIBILITY_CONTACTS_ONLY,
|
|
||||||
'verified' => AccountManager::NOT_VERIFIED,
|
|
||||||
],
|
|
||||||
AccountManager::PROPERTY_ADDRESS =>
|
|
||||||
[
|
|
||||||
'value' => '',
|
|
||||||
'scope' => AccountManager::VISIBILITY_PRIVATE,
|
|
||||||
'verified' => AccountManager::NOT_VERIFIED,
|
|
||||||
],
|
|
||||||
AccountManager::PROPERTY_WEBSITE =>
|
|
||||||
[
|
|
||||||
'value' => '',
|
|
||||||
'scope' => AccountManager::VISIBILITY_PRIVATE,
|
|
||||||
'verified' => AccountManager::NOT_VERIFIED,
|
|
||||||
],
|
|
||||||
AccountManager::PROPERTY_EMAIL =>
|
|
||||||
[
|
|
||||||
'value' => '',
|
|
||||||
'scope' => AccountManager::VISIBILITY_CONTACTS_ONLY,
|
|
||||||
'verified' => AccountManager::NOT_VERIFIED,
|
|
||||||
],
|
|
||||||
AccountManager::PROPERTY_AVATAR =>
|
|
||||||
[
|
|
||||||
'scope' => AccountManager::VISIBILITY_CONTACTS_ONLY
|
|
||||||
],
|
|
||||||
AccountManager::PROPERTY_PHONE =>
|
|
||||||
[
|
|
||||||
'value' => '',
|
|
||||||
'scope' => AccountManager::VISIBILITY_PRIVATE,
|
|
||||||
'verified' => AccountManager::NOT_VERIFIED,
|
|
||||||
],
|
|
||||||
AccountManager::PROPERTY_TWITTER =>
|
|
||||||
[
|
|
||||||
'value' => '',
|
|
||||||
'scope' => AccountManager::VISIBILITY_PRIVATE,
|
|
||||||
'verified' => AccountManager::NOT_VERIFIED,
|
|
||||||
],
|
|
||||||
]);
|
|
||||||
|
|
||||||
$controller->expects($this->once())->method('saveUserSettings');
|
$controller->expects($this->once())->method('saveUserSettings');
|
||||||
} else {
|
} else {
|
||||||
|
@ -265,6 +270,269 @@ class UsersControllerTest extends \Test\TestCase {
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function testSetUserSettingsWhenUserDisplayNameChangeNotAllowed() {
|
||||||
|
$controller = $this->getController(false, ['saveUserSettings']);
|
||||||
|
$user = $this->createMock(IUser::class);
|
||||||
|
|
||||||
|
$this->userSession->method('getUser')->willReturn($user);
|
||||||
|
|
||||||
|
$defaultProperties = $this->getDefaultAccountManagerUserData();
|
||||||
|
|
||||||
|
$this->accountManager->expects($this->once())
|
||||||
|
->method('getUser')
|
||||||
|
->with($user)
|
||||||
|
->willReturn($defaultProperties);
|
||||||
|
|
||||||
|
$this->config->expects($this->once())
|
||||||
|
->method('getSystemValue')
|
||||||
|
->with('allow_user_to_change_display_name')
|
||||||
|
->willReturn(false);
|
||||||
|
|
||||||
|
$this->appManager->expects($this->once())
|
||||||
|
->method('isEnabledForUser')
|
||||||
|
->with('federatedfilesharing')
|
||||||
|
->willReturn(true);
|
||||||
|
|
||||||
|
$avatarScope = IAccountManager::VISIBILITY_PUBLIC;
|
||||||
|
$displayName = 'Display name';
|
||||||
|
$displayNameScope = IAccountManager::VISIBILITY_PUBLIC;
|
||||||
|
$phone = '47658468';
|
||||||
|
$phoneScope = IAccountManager::VISIBILITY_PUBLIC;
|
||||||
|
$email = 'john@example.com';
|
||||||
|
$emailScope = IAccountManager::VISIBILITY_PUBLIC;
|
||||||
|
$website = 'nextcloud.com';
|
||||||
|
$websiteScope = IAccountManager::VISIBILITY_PUBLIC;
|
||||||
|
$address = 'street and city';
|
||||||
|
$addressScope = IAccountManager::VISIBILITY_PUBLIC;
|
||||||
|
$twitter = '@nextclouders';
|
||||||
|
$twitterScope = IAccountManager::VISIBILITY_PUBLIC;
|
||||||
|
|
||||||
|
// Display name and email are not changed.
|
||||||
|
$expectedProperties = $defaultProperties;
|
||||||
|
$expectedProperties[IAccountManager::PROPERTY_AVATAR]['scope'] = $avatarScope;
|
||||||
|
$expectedProperties[IAccountManager::PROPERTY_PHONE]['value'] = $phone;
|
||||||
|
$expectedProperties[IAccountManager::PROPERTY_PHONE]['scope'] = $phoneScope;
|
||||||
|
$expectedProperties[IAccountManager::PROPERTY_WEBSITE]['value'] = $website;
|
||||||
|
$expectedProperties[IAccountManager::PROPERTY_WEBSITE]['scope'] = $websiteScope;
|
||||||
|
$expectedProperties[IAccountManager::PROPERTY_ADDRESS]['value'] = $address;
|
||||||
|
$expectedProperties[IAccountManager::PROPERTY_ADDRESS]['scope'] = $addressScope;
|
||||||
|
$expectedProperties[IAccountManager::PROPERTY_TWITTER]['value'] = $twitter;
|
||||||
|
$expectedProperties[IAccountManager::PROPERTY_TWITTER]['scope'] = $twitterScope;
|
||||||
|
|
||||||
|
$this->mailer->expects($this->once())->method('validateMailAddress')
|
||||||
|
->willReturn(true);
|
||||||
|
|
||||||
|
$controller->expects($this->once())
|
||||||
|
->method('saveUserSettings')
|
||||||
|
->with($user, $expectedProperties)
|
||||||
|
->willReturnArgument(1);
|
||||||
|
|
||||||
|
$result = $controller->setUserSettings(
|
||||||
|
$avatarScope,
|
||||||
|
$displayName,
|
||||||
|
$displayNameScope,
|
||||||
|
$phone,
|
||||||
|
$phoneScope,
|
||||||
|
$email,
|
||||||
|
$emailScope,
|
||||||
|
$website,
|
||||||
|
$websiteScope,
|
||||||
|
$address,
|
||||||
|
$addressScope,
|
||||||
|
$twitter,
|
||||||
|
$twitterScope
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testSetUserSettingsWhenFederatedFilesharingNotEnabled() {
|
||||||
|
$controller = $this->getController(false, ['saveUserSettings']);
|
||||||
|
$user = $this->createMock(IUser::class);
|
||||||
|
|
||||||
|
$this->userSession->method('getUser')->willReturn($user);
|
||||||
|
|
||||||
|
$defaultProperties = $this->getDefaultAccountManagerUserData();
|
||||||
|
|
||||||
|
$this->accountManager->expects($this->once())
|
||||||
|
->method('getUser')
|
||||||
|
->with($user)
|
||||||
|
->willReturn($defaultProperties);
|
||||||
|
|
||||||
|
$this->appManager->expects($this->once())
|
||||||
|
->method('isEnabledForUser')
|
||||||
|
->with('federatedfilesharing')
|
||||||
|
->willReturn(false);
|
||||||
|
|
||||||
|
$avatarScope = IAccountManager::VISIBILITY_PUBLIC;
|
||||||
|
$displayName = 'Display name';
|
||||||
|
$displayNameScope = IAccountManager::VISIBILITY_PUBLIC;
|
||||||
|
$phone = '47658468';
|
||||||
|
$phoneScope = IAccountManager::VISIBILITY_PUBLIC;
|
||||||
|
$email = 'john@example.com';
|
||||||
|
$emailScope = IAccountManager::VISIBILITY_PUBLIC;
|
||||||
|
$website = 'nextcloud.com';
|
||||||
|
$websiteScope = IAccountManager::VISIBILITY_PUBLIC;
|
||||||
|
$address = 'street and city';
|
||||||
|
$addressScope = IAccountManager::VISIBILITY_PUBLIC;
|
||||||
|
$twitter = '@nextclouders';
|
||||||
|
$twitterScope = IAccountManager::VISIBILITY_PUBLIC;
|
||||||
|
|
||||||
|
// Phone, website, address and twitter are not changed.
|
||||||
|
$expectedProperties = $defaultProperties;
|
||||||
|
$expectedProperties[IAccountManager::PROPERTY_AVATAR]['scope'] = $avatarScope;
|
||||||
|
$expectedProperties[IAccountManager::PROPERTY_DISPLAYNAME]['value'] = $displayName;
|
||||||
|
$expectedProperties[IAccountManager::PROPERTY_DISPLAYNAME]['scope'] = $displayNameScope;
|
||||||
|
$expectedProperties[IAccountManager::PROPERTY_EMAIL]['value'] = $email;
|
||||||
|
$expectedProperties[IAccountManager::PROPERTY_EMAIL]['scope'] = $emailScope;
|
||||||
|
|
||||||
|
$this->mailer->expects($this->once())->method('validateMailAddress')
|
||||||
|
->willReturn(true);
|
||||||
|
|
||||||
|
$controller->expects($this->once())
|
||||||
|
->method('saveUserSettings')
|
||||||
|
->with($user, $expectedProperties)
|
||||||
|
->willReturnArgument(1);
|
||||||
|
|
||||||
|
$result = $controller->setUserSettings(
|
||||||
|
$avatarScope,
|
||||||
|
$displayName,
|
||||||
|
$displayNameScope,
|
||||||
|
$phone,
|
||||||
|
$phoneScope,
|
||||||
|
$email,
|
||||||
|
$emailScope,
|
||||||
|
$website,
|
||||||
|
$websiteScope,
|
||||||
|
$address,
|
||||||
|
$addressScope,
|
||||||
|
$twitter,
|
||||||
|
$twitterScope
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @dataProvider dataTestSetUserSettingsSubset
|
||||||
|
*
|
||||||
|
* @param string $property
|
||||||
|
* @param string $propertyValue
|
||||||
|
*/
|
||||||
|
public function testSetUserSettingsSubset($property, $propertyValue) {
|
||||||
|
$controller = $this->getController(false, ['saveUserSettings']);
|
||||||
|
$user = $this->createMock(IUser::class);
|
||||||
|
|
||||||
|
$this->userSession->method('getUser')->willReturn($user);
|
||||||
|
|
||||||
|
$defaultProperties = $this->getDefaultAccountManagerUserData();
|
||||||
|
|
||||||
|
$this->accountManager->expects($this->once())
|
||||||
|
->method('getUser')
|
||||||
|
->with($user)
|
||||||
|
->willReturn($defaultProperties);
|
||||||
|
|
||||||
|
$this->appManager->expects($this->once())
|
||||||
|
->method('isEnabledForUser')
|
||||||
|
->with('federatedfilesharing')
|
||||||
|
->willReturn(true);
|
||||||
|
|
||||||
|
$avatarScope = ($property === 'avatarScope') ? $propertyValue : null;
|
||||||
|
$displayName = ($property === 'displayName') ? $propertyValue : null;
|
||||||
|
$displayNameScope = ($property === 'displayNameScope') ? $propertyValue : null;
|
||||||
|
$phone = ($property === 'phone') ? $propertyValue : null;
|
||||||
|
$phoneScope = ($property === 'phoneScope') ? $propertyValue : null;
|
||||||
|
$email = ($property === 'email') ? $propertyValue : null;
|
||||||
|
$emailScope = ($property === 'emailScope') ? $propertyValue : null;
|
||||||
|
$website = ($property === 'website') ? $propertyValue : null;
|
||||||
|
$websiteScope = ($property === 'websiteScope') ? $propertyValue : null;
|
||||||
|
$address = ($property === 'address') ? $propertyValue : null;
|
||||||
|
$addressScope = ($property === 'addressScope') ? $propertyValue : null;
|
||||||
|
$twitter = ($property === 'twitter') ? $propertyValue : null;
|
||||||
|
$twitterScope = ($property === 'twitterScope') ? $propertyValue : null;
|
||||||
|
|
||||||
|
$expectedProperties = $defaultProperties;
|
||||||
|
if ($property === 'avatarScope') {
|
||||||
|
$expectedProperties[IAccountManager::PROPERTY_AVATAR]['scope'] = $propertyValue;
|
||||||
|
}
|
||||||
|
if ($property === 'displayName') {
|
||||||
|
$expectedProperties[IAccountManager::PROPERTY_DISPLAYNAME]['value'] = $propertyValue;
|
||||||
|
}
|
||||||
|
if ($property === 'displayNameScope') {
|
||||||
|
$expectedProperties[IAccountManager::PROPERTY_DISPLAYNAME]['scope'] = $propertyValue;
|
||||||
|
}
|
||||||
|
if ($property === 'phone') {
|
||||||
|
$expectedProperties[IAccountManager::PROPERTY_PHONE]['value'] = $propertyValue;
|
||||||
|
}
|
||||||
|
if ($property === 'phoneScope') {
|
||||||
|
$expectedProperties[IAccountManager::PROPERTY_PHONE]['scope'] = $propertyValue;
|
||||||
|
}
|
||||||
|
if ($property === 'email') {
|
||||||
|
$expectedProperties[IAccountManager::PROPERTY_EMAIL]['value'] = $propertyValue;
|
||||||
|
}
|
||||||
|
if ($property === 'emailScope') {
|
||||||
|
$expectedProperties[IAccountManager::PROPERTY_EMAIL]['scope'] = $propertyValue;
|
||||||
|
}
|
||||||
|
if ($property === 'website') {
|
||||||
|
$expectedProperties[IAccountManager::PROPERTY_WEBSITE]['value'] = $propertyValue;
|
||||||
|
}
|
||||||
|
if ($property === 'websiteScope') {
|
||||||
|
$expectedProperties[IAccountManager::PROPERTY_WEBSITE]['scope'] = $propertyValue;
|
||||||
|
}
|
||||||
|
if ($property === 'address') {
|
||||||
|
$expectedProperties[IAccountManager::PROPERTY_ADDRESS]['value'] = $propertyValue;
|
||||||
|
}
|
||||||
|
if ($property === 'addressScope') {
|
||||||
|
$expectedProperties[IAccountManager::PROPERTY_ADDRESS]['scope'] = $propertyValue;
|
||||||
|
}
|
||||||
|
if ($property === 'twitter') {
|
||||||
|
$expectedProperties[IAccountManager::PROPERTY_TWITTER]['value'] = $propertyValue;
|
||||||
|
}
|
||||||
|
if ($property === 'twitterScope') {
|
||||||
|
$expectedProperties[IAccountManager::PROPERTY_TWITTER]['scope'] = $propertyValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!empty($email)) {
|
||||||
|
$this->mailer->expects($this->once())->method('validateMailAddress')
|
||||||
|
->willReturn(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
$controller->expects($this->once())
|
||||||
|
->method('saveUserSettings')
|
||||||
|
->with($user, $expectedProperties)
|
||||||
|
->willReturnArgument(1);
|
||||||
|
|
||||||
|
$result = $controller->setUserSettings(
|
||||||
|
$avatarScope,
|
||||||
|
$displayName,
|
||||||
|
$displayNameScope,
|
||||||
|
$phone,
|
||||||
|
$phoneScope,
|
||||||
|
$email,
|
||||||
|
$emailScope,
|
||||||
|
$website,
|
||||||
|
$websiteScope,
|
||||||
|
$address,
|
||||||
|
$addressScope,
|
||||||
|
$twitter,
|
||||||
|
$twitterScope
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function dataTestSetUserSettingsSubset() {
|
||||||
|
return [
|
||||||
|
['avatarScope', IAccountManager::VISIBILITY_PUBLIC],
|
||||||
|
['displayName', 'Display name'],
|
||||||
|
['displayNameScope', IAccountManager::VISIBILITY_PUBLIC],
|
||||||
|
['phone', '47658468'],
|
||||||
|
['phoneScope', IAccountManager::VISIBILITY_PUBLIC],
|
||||||
|
['email', 'john@example.com'],
|
||||||
|
['emailScope', IAccountManager::VISIBILITY_PUBLIC],
|
||||||
|
['website', 'nextcloud.com'],
|
||||||
|
['websiteScope', IAccountManager::VISIBILITY_PUBLIC],
|
||||||
|
['address', 'street and city'],
|
||||||
|
['addressScope', IAccountManager::VISIBILITY_PUBLIC],
|
||||||
|
['twitter', '@nextclouders'],
|
||||||
|
['twitterScope', IAccountManager::VISIBILITY_PUBLIC],
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @dataProvider dataTestSaveUserSettings
|
* @dataProvider dataTestSaveUserSettings
|
||||||
*
|
*
|
||||||
|
|
|
@ -307,21 +307,31 @@ trait BasicStructure {
|
||||||
* @When Sending a :method to :url with requesttoken
|
* @When Sending a :method to :url with requesttoken
|
||||||
* @param string $method
|
* @param string $method
|
||||||
* @param string $url
|
* @param string $url
|
||||||
|
* @param TableNode|array|null $body
|
||||||
*/
|
*/
|
||||||
public function sendingAToWithRequesttoken($method, $url) {
|
public function sendingAToWithRequesttoken($method, $url, $body = null) {
|
||||||
$baseUrl = substr($this->baseUrl, 0, -5);
|
$baseUrl = substr($this->baseUrl, 0, -5);
|
||||||
|
|
||||||
|
$options = [
|
||||||
|
'cookies' => $this->cookieJar,
|
||||||
|
'headers' => [
|
||||||
|
'requesttoken' => $this->requestToken
|
||||||
|
],
|
||||||
|
];
|
||||||
|
|
||||||
|
if ($body instanceof TableNode) {
|
||||||
|
$fd = $body->getRowsHash();
|
||||||
|
$options['form_params'] = $fd;
|
||||||
|
} elseif ($body) {
|
||||||
|
$options = array_merge($options, $body);
|
||||||
|
}
|
||||||
|
|
||||||
$client = new Client();
|
$client = new Client();
|
||||||
try {
|
try {
|
||||||
$this->response = $client->request(
|
$this->response = $client->request(
|
||||||
$method,
|
$method,
|
||||||
$baseUrl . $url,
|
$baseUrl . $url,
|
||||||
[
|
$options
|
||||||
'cookies' => $this->cookieJar,
|
|
||||||
'headers' => [
|
|
||||||
'requesttoken' => $this->requestToken
|
|
||||||
]
|
|
||||||
]
|
|
||||||
);
|
);
|
||||||
} catch (ClientException $e) {
|
} catch (ClientException $e) {
|
||||||
$this->response = $e->getResponse();
|
$this->response = $e->getResponse();
|
||||||
|
|
|
@ -0,0 +1,69 @@
|
||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* @copyright Copyright (c) 2021 Daniel Calviño Sánchez <danxuliu@gmail.com>
|
||||||
|
*
|
||||||
|
* @author Daniel Calviño Sánchez <danxuliu@gmail.com>
|
||||||
|
*
|
||||||
|
* @license GNU AGPL version 3 or any later version
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Affero General Public License as
|
||||||
|
* published by the Free Software Foundation, either version 3 of the
|
||||||
|
* License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Affero General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Affero General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
use PHPUnit\Framework\Assert;
|
||||||
|
|
||||||
|
trait ContactsMenu {
|
||||||
|
|
||||||
|
// BasicStructure trait is expected to be used in the class that uses this
|
||||||
|
// trait.
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @When /^searching for contacts matching with "([^"]*)"$/
|
||||||
|
*
|
||||||
|
* @param string $filter
|
||||||
|
*/
|
||||||
|
public function searchingForContactsMatchingWith(string $filter) {
|
||||||
|
$url = '/index.php/contactsmenu/contacts';
|
||||||
|
|
||||||
|
$parameters[] = 'filter=' . $filter;
|
||||||
|
|
||||||
|
$url .= '?' . implode('&', $parameters);
|
||||||
|
|
||||||
|
$this->sendingAToWithRequesttoken('POST', $url);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @Then /^the list of searched contacts has "(\d+)" contacts$/
|
||||||
|
*/
|
||||||
|
public function theListOfSearchedContactsHasContacts(int $count) {
|
||||||
|
$this->theHTTPStatusCodeShouldBe(200);
|
||||||
|
|
||||||
|
$searchedContacts = json_decode($this->response->getBody(), $asAssociativeArray = true)['contacts'];
|
||||||
|
|
||||||
|
Assert::assertEquals($count, count($searchedContacts));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @Then /^searched contact "(\d+)" is named "([^"]*)"$/
|
||||||
|
*
|
||||||
|
* @param int $index
|
||||||
|
* @param string $expectedName
|
||||||
|
*/
|
||||||
|
public function searchedContactXIsNamed(int $index, string $expectedName) {
|
||||||
|
$searchedContacts = json_decode($this->response->getBody(), $asAssociativeArray = true)['contacts'];
|
||||||
|
$searchedContact = $searchedContacts[$index];
|
||||||
|
|
||||||
|
Assert::assertEquals($expectedName, $searchedContact['fullName']);
|
||||||
|
}
|
||||||
|
}
|
|
@ -33,6 +33,7 @@ require __DIR__ . '/../../vendor/autoload.php';
|
||||||
* Features context.
|
* Features context.
|
||||||
*/
|
*/
|
||||||
class FeatureContext implements Context, SnippetAcceptingContext {
|
class FeatureContext implements Context, SnippetAcceptingContext {
|
||||||
|
use ContactsMenu;
|
||||||
use Search;
|
use Search;
|
||||||
use WebDav;
|
use WebDav;
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,188 @@
|
||||||
|
Feature: contacts-menu
|
||||||
|
|
||||||
|
Scenario: users can be searched by display name
|
||||||
|
Given user "user0" exists
|
||||||
|
And user "user1" exists
|
||||||
|
And As an "admin"
|
||||||
|
And sending "PUT" to "/cloud/users/user1" with
|
||||||
|
| key | displayname |
|
||||||
|
| value | Test name |
|
||||||
|
When Logging in using web as "user0"
|
||||||
|
And searching for contacts matching with "test"
|
||||||
|
Then the list of searched contacts has "1" contacts
|
||||||
|
And searched contact "0" is named "Test name"
|
||||||
|
|
||||||
|
Scenario: users can be searched by email
|
||||||
|
Given user "user0" exists
|
||||||
|
And user "user1" exists
|
||||||
|
And As an "admin"
|
||||||
|
And sending "PUT" to "/cloud/users/user1" with
|
||||||
|
| key | email |
|
||||||
|
| value | test@example.com |
|
||||||
|
When Logging in using web as "user0"
|
||||||
|
And searching for contacts matching with "test"
|
||||||
|
Then the list of searched contacts has "1" contacts
|
||||||
|
And searched contact "0" is named "user1"
|
||||||
|
|
||||||
|
Scenario: users can not be searched by id
|
||||||
|
Given user "user0" exists
|
||||||
|
And user "user1" exists
|
||||||
|
And As an "admin"
|
||||||
|
And sending "PUT" to "/cloud/users/user1" with
|
||||||
|
| key | displayname |
|
||||||
|
| value | Test name |
|
||||||
|
When Logging in using web as "user0"
|
||||||
|
And searching for contacts matching with "user"
|
||||||
|
Then the list of searched contacts has "0" contacts
|
||||||
|
|
||||||
|
Scenario: search several users
|
||||||
|
Given user "user0" exists
|
||||||
|
And user "user1" exists
|
||||||
|
And user "user2" exists
|
||||||
|
And user "user3" exists
|
||||||
|
And user "user4" exists
|
||||||
|
And user "user5" exists
|
||||||
|
And As an "admin"
|
||||||
|
And sending "PUT" to "/cloud/users/user1" with
|
||||||
|
| key | displayname |
|
||||||
|
| value | Test name |
|
||||||
|
And sending "PUT" to "/cloud/users/user2" with
|
||||||
|
| key | email |
|
||||||
|
| value | test@example.com |
|
||||||
|
And sending "PUT" to "/cloud/users/user3" with
|
||||||
|
| key | displayname |
|
||||||
|
| value | Unmatched name |
|
||||||
|
And sending "PUT" to "/cloud/users/user4" with
|
||||||
|
| key | email |
|
||||||
|
| value | unmatched@example.com |
|
||||||
|
And sending "PUT" to "/cloud/users/user5" with
|
||||||
|
| key | displayname |
|
||||||
|
| value | Another test name |
|
||||||
|
And sending "PUT" to "/cloud/users/user5" with
|
||||||
|
| key | email |
|
||||||
|
| value | another_test@example.com |
|
||||||
|
When Logging in using web as "user0"
|
||||||
|
And searching for contacts matching with "test"
|
||||||
|
Then the list of searched contacts has "3" contacts
|
||||||
|
# Results are sorted alphabetically
|
||||||
|
And searched contact "0" is named "Another test name"
|
||||||
|
And searched contact "1" is named "Test name"
|
||||||
|
And searched contact "2" is named "user2"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Scenario: users can not be found by display name if visibility is private
|
||||||
|
Given user "user0" exists
|
||||||
|
And user "user1" exists
|
||||||
|
And user "user2" exists
|
||||||
|
And Logging in using web as "user1"
|
||||||
|
And Sending a "PUT" to "/settings/users/user1/settings" with requesttoken
|
||||||
|
| displayname | Test name |
|
||||||
|
| displaynameScope | private |
|
||||||
|
And Logging in using web as "user2"
|
||||||
|
And Sending a "PUT" to "/settings/users/user2/settings" with requesttoken
|
||||||
|
| displayname | Another test name |
|
||||||
|
| displaynameScope | contacts |
|
||||||
|
When Logging in using web as "user0"
|
||||||
|
And searching for contacts matching with "test"
|
||||||
|
Then the list of searched contacts has "1" contacts
|
||||||
|
And searched contact "0" is named "Another test name"
|
||||||
|
|
||||||
|
Scenario: users can not be found by email if visibility is private
|
||||||
|
Given user "user0" exists
|
||||||
|
And user "user1" exists
|
||||||
|
And user "user2" exists
|
||||||
|
And Logging in using web as "user1"
|
||||||
|
And Sending a "PUT" to "/settings/users/user1/settings" with requesttoken
|
||||||
|
| email | test@example.com |
|
||||||
|
| emailScope | private |
|
||||||
|
And Logging in using web as "user2"
|
||||||
|
And Sending a "PUT" to "/settings/users/user2/settings" with requesttoken
|
||||||
|
| email | another_test@example.com |
|
||||||
|
| emailScope | contacts |
|
||||||
|
When Logging in using web as "user0"
|
||||||
|
And searching for contacts matching with "test"
|
||||||
|
Then the list of searched contacts has "1" contacts
|
||||||
|
And searched contact "0" is named "user2"
|
||||||
|
|
||||||
|
Scenario: users can be found by other properties if the visibility of one is private
|
||||||
|
Given user "user0" exists
|
||||||
|
And user "user1" exists
|
||||||
|
And user "user2" exists
|
||||||
|
And Logging in using web as "user1"
|
||||||
|
And Sending a "PUT" to "/settings/users/user1/settings" with requesttoken
|
||||||
|
| displayname | Test name |
|
||||||
|
| displaynameScope | contacts |
|
||||||
|
| email | test@example.com |
|
||||||
|
| emailScope | private |
|
||||||
|
And Logging in using web as "user2"
|
||||||
|
And Sending a "PUT" to "/settings/users/user2/settings" with requesttoken
|
||||||
|
| displayname | Another test name |
|
||||||
|
| displaynameScope | private |
|
||||||
|
| email | another_test@example.com |
|
||||||
|
| emailScope | contacts |
|
||||||
|
When Logging in using web as "user0"
|
||||||
|
And searching for contacts matching with "test"
|
||||||
|
Then the list of searched contacts has "2" contacts
|
||||||
|
And searched contact "0" is named ""
|
||||||
|
And searched contact "1" is named "Test name"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Scenario: users can be searched by display name if visibility is increased again
|
||||||
|
Given user "user0" exists
|
||||||
|
And user "user1" exists
|
||||||
|
And Logging in using web as "user1"
|
||||||
|
And Sending a "PUT" to "/settings/users/user1/settings" with requesttoken
|
||||||
|
| displayname | Test name |
|
||||||
|
| displaynameScope | private |
|
||||||
|
And Sending a "PUT" to "/settings/users/user1/settings" with requesttoken
|
||||||
|
| displaynameScope | contacts |
|
||||||
|
When Logging in using web as "user0"
|
||||||
|
And searching for contacts matching with "test"
|
||||||
|
Then the list of searched contacts has "1" contacts
|
||||||
|
And searched contact "0" is named "Test name"
|
||||||
|
|
||||||
|
Scenario: users can be searched by email if visibility is increased again
|
||||||
|
Given user "user0" exists
|
||||||
|
And user "user1" exists
|
||||||
|
And Logging in using web as "user1"
|
||||||
|
And Sending a "PUT" to "/settings/users/user1/settings" with requesttoken
|
||||||
|
| email | test@example.com |
|
||||||
|
| emailScope | private |
|
||||||
|
And Sending a "PUT" to "/settings/users/user1/settings" with requesttoken
|
||||||
|
| emailScope | contacts |
|
||||||
|
When Logging in using web as "user0"
|
||||||
|
And searching for contacts matching with "test"
|
||||||
|
Then the list of searched contacts has "1" contacts
|
||||||
|
And searched contact "0" is named "user1"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Scenario: users can not be searched by display name if visibility is private even if updated with provisioning
|
||||||
|
Given user "user0" exists
|
||||||
|
And user "user1" exists
|
||||||
|
And Logging in using web as "user1"
|
||||||
|
And Sending a "PUT" to "/settings/users/user1/settings" with requesttoken
|
||||||
|
| displaynameScope | private |
|
||||||
|
And As an "admin"
|
||||||
|
And sending "PUT" to "/cloud/users/user1" with
|
||||||
|
| key | displayname |
|
||||||
|
| value | Test name |
|
||||||
|
When Logging in using web as "user0"
|
||||||
|
And searching for contacts matching with "test"
|
||||||
|
Then the list of searched contacts has "0" contacts
|
||||||
|
|
||||||
|
Scenario: users can not be searched by email if visibility is private even if updated with provisioning
|
||||||
|
Given user "user0" exists
|
||||||
|
And user "user1" exists
|
||||||
|
And Logging in using web as "user1"
|
||||||
|
And Sending a "PUT" to "/settings/users/user1/settings" with requesttoken
|
||||||
|
| emailScope | private |
|
||||||
|
And As an "admin"
|
||||||
|
And sending "PUT" to "/cloud/users/user1" with
|
||||||
|
| key | email |
|
||||||
|
| value | test@example.com |
|
||||||
|
When Logging in using web as "user0"
|
||||||
|
And searching for contacts matching with "test"
|
||||||
|
Then the list of searched contacts has "0" contacts
|
Loading…
Reference in New Issue