Merge remote-tracking branch 'upstream/master'
This commit is contained in:
commit
d957cc4883
17 files changed
+139
-7
No files matched your search
+12
@@ -21,6 +21,7 @@ import org.keycloak.social.SocialProvider;
|
||||
public class AccountSocialBean {
|
||||
|
||||
private final List<SocialLinkEntry> socialLinks;
|
||||
private final boolean removeLinkPossible;
|
||||
|
||||
public AccountSocialBean(RealmModel realm, UserModel user, URI baseUri) {
|
||||
URI accountSocialUpdateUri = Urls.accountSocialUpdate(baseUri, realm.getName());
|
||||
@@ -29,12 +30,16 @@ public class AccountSocialBean {
|
||||
Map<String, String> socialConfig = realm.getSocialConfig();
|
||||
Set<SocialLinkModel> userSocialLinks = realm.getSocialLinks(user);
|
||||
|
||||
int availableLinks = 0;
|
||||
if (socialConfig != null && !socialConfig.isEmpty()) {
|
||||
for (SocialProvider provider : SocialLoader.load()) {
|
||||
String socialProviderId = provider.getId();
|
||||
if (socialConfig.containsKey(socialProviderId + ".key")) {
|
||||
SocialLinkModel socialLink = getSocialLink(userSocialLinks, socialProviderId);
|
||||
|
||||
if (socialLink != null) {
|
||||
availableLinks++;
|
||||
}
|
||||
String action = socialLink != null ? "remove" : "add";
|
||||
String actionUrl = UriBuilder.fromUri(accountSocialUpdateUri).queryParam("action", action).queryParam("provider_id", socialProviderId).build().toString();
|
||||
|
||||
@@ -43,6 +48,9 @@ public class AccountSocialBean {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Removing last social provider is not possible if you don't have other possibility to authenticate
|
||||
this.removeLinkPossible = availableLinks > 1 || realm.getAuthenticationLink(user) != null;
|
||||
}
|
||||
|
||||
private SocialLinkModel getSocialLink(Set<SocialLinkModel> userSocialLinks, String socialProviderId) {
|
||||
@@ -58,6 +66,10 @@ public class AccountSocialBean {
|
||||
return socialLinks;
|
||||
}
|
||||
|
||||
public boolean isRemoveLinkPossible() {
|
||||
return removeLinkPossible;
|
||||
}
|
||||
|
||||
public class SocialLinkEntry {
|
||||
|
||||
private SocialLinkModel link;
|
||||
|
||||
@@ -30,6 +30,7 @@ missingSocialProvider=Social provider not specified
|
||||
invalidSocialAction=Invalid or missing action
|
||||
socialProviderNotFound=Specified social provider not found
|
||||
socialLinkNotActive=This social link is not active anymore
|
||||
socialRemovingLastProvider=You can't remove last social provider as you don't have password
|
||||
socialRedirectError=Failed to redirect to social provider
|
||||
socialProviderRemoved=Social provider removed successfully
|
||||
|
||||
|
||||
@@ -18,7 +18,9 @@
|
||||
</div>
|
||||
<div class="col-sm-5 col-md-5">
|
||||
<#if socialLink.connected>
|
||||
<a href="${socialLink.actionUrl}" type="submit" class="btn btn-primary btn-lg">Remove ${socialLink.providerName!}</a>
|
||||
<#if social.removeLinkPossible>
|
||||
<a href="${socialLink.actionUrl}" type="submit" class="btn btn-primary btn-lg">Remove ${socialLink.providerName!}</a>
|
||||
</#if>
|
||||
<#else>
|
||||
<a href="${socialLink.actionUrl}" type="submit" class="btn btn-primary btn-lg">Add ${socialLink.providerName!}</a>
|
||||
</#if>
|
||||
|
||||
@@ -300,6 +300,21 @@ module.config([ '$routeProvider', function($routeProvider) {
|
||||
},
|
||||
controller : 'UserSessionsCtrl'
|
||||
})
|
||||
.when('/realms/:realm/users/:user/social-links', {
|
||||
templateUrl : 'partials/user-social-links.html',
|
||||
resolve : {
|
||||
realm : function(RealmLoader) {
|
||||
return RealmLoader();
|
||||
},
|
||||
user : function(UserLoader) {
|
||||
return UserLoader();
|
||||
},
|
||||
socialLinks : function(UserSocialLinksLoader) {
|
||||
return UserSocialLinksLoader();
|
||||
}
|
||||
},
|
||||
controller : 'UserSocialCtrl'
|
||||
})
|
||||
.when('/realms/:realm/users', {
|
||||
templateUrl : 'partials/user-list.html',
|
||||
resolve : {
|
||||
|
||||
+7
@@ -146,6 +146,13 @@ module.controller('UserSessionsCtrl', function($scope, realm, user, stats, UserL
|
||||
|
||||
});
|
||||
|
||||
module.controller('UserSocialCtrl', function($scope, realm, user, socialLinks) {
|
||||
$scope.realm = realm;
|
||||
$scope.user = user;
|
||||
$scope.socialLinks = socialLinks;
|
||||
console.log('showing social links of user');
|
||||
});
|
||||
|
||||
|
||||
module.controller('UserListCtrl', function($scope, realm, User) {
|
||||
$scope.realm = realm;
|
||||
|
||||
@@ -89,6 +89,15 @@ module.factory('UserSessionStatsLoader', function(Loader, UserSessionStats, $rou
|
||||
});
|
||||
});
|
||||
|
||||
module.factory('UserSocialLinksLoader', function(Loader, UserSocialLinks, $route, $q) {
|
||||
return Loader.query(UserSocialLinks, function() {
|
||||
return {
|
||||
realm : $route.current.params.realm,
|
||||
user : $route.current.params.user
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
module.factory('RoleLoader', function(Loader, Role, $route, $q) {
|
||||
return Loader.get(Role, function() {
|
||||
return {
|
||||
|
||||
@@ -189,6 +189,12 @@ module.factory('UserLogout', function($resource) {
|
||||
user : '@user'
|
||||
});
|
||||
});
|
||||
module.factory('UserSocialLinks', function($resource) {
|
||||
return $resource(authUrl + '/rest/admin/realms/:realm/users/:user/social-links', {
|
||||
realm : '@realm',
|
||||
user : '@user'
|
||||
});
|
||||
});
|
||||
|
||||
module.factory('UserCredentials', function($resource) {
|
||||
var credentials = {};
|
||||
|
||||
+1
@@ -5,6 +5,7 @@
|
||||
<li data-ng-show="access.manageUsers"><a href="#/realms/{{realm.realm}}/users/{{user.username}}/user-credentials">Credentials</a></li>
|
||||
<li class="active"><a href="#/realms/{{realm.realm}}/users/{{user.username}}/role-mappings">Role Mappings</a></li>
|
||||
<li><a href="#/realms/{{realm.realm}}/users/{{user.username}}/sessions">Sessions</a></li>
|
||||
<li data-ng-show="realm.social"><a href="#/realms/{{realm.realm}}/users/{{user.username}}/social-links">Social Links</a></li>
|
||||
</ul>
|
||||
<div id="content">
|
||||
<ol class="breadcrumb">
|
||||
|
||||
+1
@@ -6,6 +6,7 @@
|
||||
<li class="active"><a href="#/realms/{{realm.realm}}/users/{{user.username}}/user-credentials">Credentials</a></li>
|
||||
<li><a href="#/realms/{{realm.realm}}/users/{{user.username}}/role-mappings">Role Mappings</a></li>
|
||||
<li><a href="#/realms/{{realm.realm}}/users/{{user.username}}/sessions">Sessions</a></li>
|
||||
<li data-ng-show="realm.social"><a href="#/realms/{{realm.realm}}/users/{{user.username}}/social-links">Social Links</a></li>
|
||||
</ul>
|
||||
|
||||
<div id="content">
|
||||
|
||||
+1
@@ -6,6 +6,7 @@
|
||||
<li data-ng-show="access.manageUsers"><a href="#/realms/{{realm.realm}}/users/{{user.username}}/user-credentials">Credentials</a></li>
|
||||
<li><a href="#/realms/{{realm.realm}}/users/{{user.username}}/role-mappings">Role Mappings</a></li>
|
||||
<li><a href="#/realms/{{realm.realm}}/users/{{user.username}}/sessions">Sessions</a></li>
|
||||
<li data-ng-show="realm.social"><a href="#/realms/{{realm.realm}}/users/{{user.username}}/social-links">Social Links</a></li>
|
||||
</ul>
|
||||
|
||||
<div id="content">
|
||||
|
||||
+1
@@ -5,6 +5,7 @@
|
||||
<li><a href="#/realms/{{realm.realm}}/users/{{user.username}}/user-credentials">Credentials</a></li>
|
||||
<li><a href="#/realms/{{realm.realm}}/users/{{user.username}}/role-mappings">Role Mappings</a></li>
|
||||
<li class="active"><a href="#/realms/{{realm.realm}}/users/{{user.username}}/sessions">Sessions</a></li>
|
||||
<li data-ng-show="realm.social"><a href="#/realms/{{realm.realm}}/users/{{user.username}}/social-links">Social Links</a></li>
|
||||
</ul>
|
||||
<div id="content">
|
||||
<ol class="breadcrumb">
|
||||
|
||||
+33
@@ -0,0 +1,33 @@
|
||||
<div class="bs-sidebar col-md-3 clearfix" data-ng-include data-src="'partials/realm-menu.html'"></div>
|
||||
<div id="content-area" class="col-md-9" role="main">
|
||||
<ul class="nav nav-tabs nav-tabs-pf">
|
||||
<li><a href="#/realms/{{realm.realm}}/users/{{user.username}}">Attributes</a></li>
|
||||
<li><a href="#/realms/{{realm.realm}}/users/{{user.username}}/user-credentials">Credentials</a></li>
|
||||
<li><a href="#/realms/{{realm.realm}}/users/{{user.username}}/role-mappings">Role Mappings</a></li>
|
||||
<li><a href="#/realms/{{realm.realm}}/users/{{user.username}}/sessions">Sessions</a></li>
|
||||
<li class="active"><a href="#/realms/{{realm.realm}}/users/{{user.username}}/social-links">Social Links</a></li>
|
||||
</ul>
|
||||
<div id="content">
|
||||
<ol class="breadcrumb">
|
||||
<li><a href="#/realms/{{realm.realm}}">{{realm.realm}}</a></li>
|
||||
<li><a href="#/realms/{{realm.realm}}/users">Users</a></li>
|
||||
<li><a href="#/realms/{{realm.realm}}/users/{{user.username}}">{{user.username}}</a></li>
|
||||
<li class="active">Social Links</li>
|
||||
</ol>
|
||||
<h2><span>{{user.username}}</span> Social Links</h2>
|
||||
<table class="table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Provider Name</th>
|
||||
<th>Social Username</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr data-ng-repeat="socialLink in socialLinks">
|
||||
<td>{{socialLink.socialProvider}}</td>
|
||||
<td>{{socialLink.socialUsername}}</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
Reference in new issue
Block a user