This is an automated email from the git hooks/post-receive script. New commit to branch feature/1_socialauth in repository pollen. See https://gitlab.nuiton.org/chorem/pollen.git commit 9ec9ff65a8a5d82fdf67bfd5742704c49f913d1d Author: Kevin Morin <morin@codelutin.com> Date: Thu Aug 24 17:35:35 2017 +0200 refs #1 ajout de la conf des providers dans la base (plus simple à modifier) + début de l'admin --- .../migration/h2/V3_0_0_9__add_loginproviders.sql | 13 +++ .../postgresql/V3_0_0_9__add_loginproviders.sql | 12 +++ pollen-persistence/src/main/xmi/pollen.properties | 2 +- pollen-persistence/src/main/xmi/pollen.zargo | Bin 27595 -> 28069 bytes .../org/chorem/pollen/rest/api/v1/AuthApi.java | 28 +++++++ .../pollen/services/bean/LoginProviderBean.java | 82 ++++++++++++++++++ .../services/service/PollenServiceSupport.java | 5 ++ .../pollen/services/service/SocialAuthService.java | 63 ++++++++++++++ .../src/main/resources/oauth_consumer.properties | 56 ++++++------- pollen-ui-riot-js/src/main/web/js/AuthService.js | 15 +++- pollen-ui-riot-js/src/main/web/tag/Pollen.tag.html | 8 +- .../src/main/web/tag/PollenHeader.tag.html | 1 + pollen-ui-riot-js/src/main/web/tag/SignIn.tag.html | 12 ++- .../src/main/web/tag/admin/LoginProviders.tag.html | 92 +++++++++++++++++++++ .../src/main/web/tag/{ => admin}/UserCard.tag.html | 6 +- .../web/tag/{ => admin}/UserEditModal.tag.html | 8 +- .../src/main/web/tag/{ => admin}/Users.tag.html | 10 +-- 17 files changed, 367 insertions(+), 46 deletions(-) diff --git a/pollen-persistence/src/main/resources/db/migration/h2/V3_0_0_9__add_loginproviders.sql b/pollen-persistence/src/main/resources/db/migration/h2/V3_0_0_9__add_loginproviders.sql new file mode 100644 index 00000000..1a3adce2 --- /dev/null +++ b/pollen-persistence/src/main/resources/db/migration/h2/V3_0_0_9__add_loginproviders.sql @@ -0,0 +1,13 @@ +-- LOGINPROVIDER + +CREATE TABLE LOGINPROVIDER ( + TOPIAID VARCHAR(255) NOT NULL PRIMARY KEY, + TOPIAVERSION BIGINT NOT NULL, + TOPIACREATEDATE TIMESTAMP, + NAME VARCHAR(255), + KEY VARCHAR(255), + SECRET VARCHAR(255), + PERMISSIONS VARCHAR(255), + ACTIVE BOOLEAN +); + diff --git a/pollen-persistence/src/main/resources/db/migration/postgresql/V3_0_0_9__add_loginproviders.sql b/pollen-persistence/src/main/resources/db/migration/postgresql/V3_0_0_9__add_loginproviders.sql new file mode 100644 index 00000000..75a094ea --- /dev/null +++ b/pollen-persistence/src/main/resources/db/migration/postgresql/V3_0_0_9__add_loginproviders.sql @@ -0,0 +1,12 @@ +-- LOGINPROVIDER + +CREATE TABLE LOGINPROVIDER ( + TOPIAID VARCHAR(255) NOT NULL PRIMARY KEY, + TOPIAVERSION BIGINT NOT NULL, + TOPIACREATEDATE TIMESTAMP, + NAME VARCHAR(255), + KEY VARCHAR(255), + SECRET VARCHAR(255), + PERMISSIONS VARCHAR(255), + ACTIVE BOOLEAN +); diff --git a/pollen-persistence/src/main/xmi/pollen.properties b/pollen-persistence/src/main/xmi/pollen.properties index 16d95ab4..d172fe4c 100644 --- a/pollen-persistence/src/main/xmi/pollen.properties +++ b/pollen-persistence/src/main/xmi/pollen.properties @@ -18,7 +18,7 @@ # along with this program. If not, see <http://www.gnu.org/licenses/>. # #L% ###m -model.tagvalue.version=3.0.0.8 +model.tagvalue.version=3.0.0.9 #model.tagValue.notGenerateToString=true #model.tagValue.constantPrefix=PROPERTY_ #model.tagValue.useEnumerationName=true diff --git a/pollen-persistence/src/main/xmi/pollen.zargo b/pollen-persistence/src/main/xmi/pollen.zargo index 72886764..0f29e782 100644 Binary files a/pollen-persistence/src/main/xmi/pollen.zargo and b/pollen-persistence/src/main/xmi/pollen.zargo differ diff --git a/pollen-rest-api/src/main/java/org/chorem/pollen/rest/api/v1/AuthApi.java b/pollen-rest-api/src/main/java/org/chorem/pollen/rest/api/v1/AuthApi.java index 7a7b74bb..748dc894 100644 --- a/pollen-rest-api/src/main/java/org/chorem/pollen/rest/api/v1/AuthApi.java +++ b/pollen-rest-api/src/main/java/org/chorem/pollen/rest/api/v1/AuthApi.java @@ -29,6 +29,7 @@ import org.apache.shiro.codec.Base64; import org.chorem.pollen.persistence.entity.PollenUser; import org.chorem.pollen.persistence.entity.SessionToken; import org.chorem.pollen.services.PollenServiceContext; +import org.chorem.pollen.services.bean.LoginProviderBean; import org.chorem.pollen.services.bean.PollenEntityRef; import org.chorem.pollen.services.service.PollenUserService; import org.chorem.pollen.services.service.SocialAuthService; @@ -55,6 +56,7 @@ import javax.ws.rs.core.MediaType; import javax.ws.rs.core.NewCookie; import javax.ws.rs.core.Response; import java.net.URI; +import java.util.List; import java.util.Map; /** @@ -248,4 +250,30 @@ public class AuthApi { } + @Path("/loginproviders") + @GET + public List<LoginProviderBean> getAllLoginProviders(@Context SocialAuthService socialAuthService) { + return socialAuthService.getAllLoginProviders(); + } + + @Path("/loginproviders") + @POST + public LoginProviderBean addLoginProvider(@Context SocialAuthService socialAuthService, + LoginProviderBean loginProvider) { + return socialAuthService.saveLoginProvider(loginProvider, false); + } + + @Path("/loginproviders/{providerId}") + @POST @PUT + public LoginProviderBean saveLoginProvider(@Context SocialAuthService socialAuthService, + LoginProviderBean loginProvider) { + return socialAuthService.saveLoginProvider(loginProvider, true); + } + + @Path("/loginproviders/active") + @GET + public List<String> getAvailableLoginProviders(@Context SocialAuthService socialAuthService) { + return socialAuthService.getAvailableLoginProviders(); + } + } diff --git a/pollen-services/src/main/java/org/chorem/pollen/services/bean/LoginProviderBean.java b/pollen-services/src/main/java/org/chorem/pollen/services/bean/LoginProviderBean.java new file mode 100644 index 00000000..e24d2d19 --- /dev/null +++ b/pollen-services/src/main/java/org/chorem/pollen/services/bean/LoginProviderBean.java @@ -0,0 +1,82 @@ +package org.chorem.pollen.services.bean; + +import org.chorem.pollen.persistence.entity.LoginProvider; +import org.chorem.pollen.persistence.entity.LoginProviderImpl; + +/** + * @author Kevin Morin (Code Lutin) + */ +public class LoginProviderBean extends PollenBean<LoginProvider> { + + protected String name; + protected String key; + protected String secret; + protected String permissions; + protected boolean active; + + public LoginProviderBean() { + super(LoginProvider.class); + } + + @Override + public void fromEntity(LoginProvider entity) { + setEntityId(entity.getTopiaId()); + setName(entity.getName()); + setKey(entity.getKey()); + setSecret(entity.getSecret()); + setPermissions(entity.getPermissions()); + setActive(entity.isActive()); + } + + @Override + public LoginProvider toEntity() { + LoginProvider entity = new LoginProviderImpl(); + entity.setTopiaId(getEntityId()); + entity.setName(getName()); + entity.setKey(getKey()); + entity.setSecret(getSecret()); + entity.setPermissions(getPermissions()); + entity.setActive(isActive()); + return entity; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getKey() { + return key; + } + + public void setKey(String key) { + this.key = key; + } + + public String getSecret() { + return secret; + } + + public void setSecret(String secret) { + this.secret = secret; + } + + public String getPermissions() { + return permissions; + } + + public void setPermissions(String permissions) { + this.permissions = permissions; + } + + public boolean isActive() { + return active; + } + + public void setActive(boolean active) { + this.active = active; + } +} diff --git a/pollen-services/src/main/java/org/chorem/pollen/services/service/PollenServiceSupport.java b/pollen-services/src/main/java/org/chorem/pollen/services/service/PollenServiceSupport.java index c26c5f50..860e0266 100644 --- a/pollen-services/src/main/java/org/chorem/pollen/services/service/PollenServiceSupport.java +++ b/pollen-services/src/main/java/org/chorem/pollen/services/service/PollenServiceSupport.java @@ -33,6 +33,7 @@ import org.chorem.pollen.persistence.entity.ChoiceTopiaDao; import org.chorem.pollen.persistence.entity.CommentTopiaDao; import org.chorem.pollen.persistence.entity.FavoriteListMemberTopiaDao; import org.chorem.pollen.persistence.entity.FavoriteListTopiaDao; +import org.chorem.pollen.persistence.entity.LoginProviderTopiaDao; import org.chorem.pollen.persistence.entity.Poll; import org.chorem.pollen.persistence.entity.PollTopiaDao; import org.chorem.pollen.persistence.entity.PollenPrincipalTopiaDao; @@ -242,6 +243,10 @@ public abstract class PollenServiceSupport implements PollenService { return getPersistenceContext().getVoterListMemberDao(); } + protected LoginProviderTopiaDao getLoginProviderDao() { + return getPersistenceContext().getLoginProviderDao(); + } + public void commit() { getPersistenceContext().commit(); } diff --git a/pollen-services/src/main/java/org/chorem/pollen/services/service/SocialAuthService.java b/pollen-services/src/main/java/org/chorem/pollen/services/service/SocialAuthService.java index 6866b3b5..2d4aa50f 100644 --- a/pollen-services/src/main/java/org/chorem/pollen/services/service/SocialAuthService.java +++ b/pollen-services/src/main/java/org/chorem/pollen/services/service/SocialAuthService.java @@ -1,5 +1,6 @@ package org.chorem.pollen.services.service; +import org.apache.commons.lang3.StringUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.brickred.socialauth.AuthProvider; @@ -7,15 +8,22 @@ import org.brickred.socialauth.Profile; import org.brickred.socialauth.SocialAuthConfig; import org.brickred.socialauth.SocialAuthManager; import org.brickred.socialauth.util.Constants; +import org.brickred.socialauth.util.OAuthConfig; +import org.chorem.pollen.persistence.entity.LoginProvider; +import org.chorem.pollen.persistence.entity.LoginProviderTopiaDao; import org.chorem.pollen.persistence.entity.PollenUser; import org.chorem.pollen.persistence.entity.PollenUserImpl; import org.chorem.pollen.persistence.entity.PollenUserTopiaDao; import org.chorem.pollen.persistence.entity.UserCredential; import org.chorem.pollen.persistence.entity.UserCredentialImpl; +import org.chorem.pollen.services.bean.LoginProviderBean; import org.chorem.pollen.services.bean.PollenEntityRef; +import java.util.Comparator; +import java.util.List; import java.util.Map; import java.util.Optional; +import java.util.stream.Collectors; /** * @author Kevin Morin (Code Lutin) @@ -90,6 +98,22 @@ public class SocialAuthService extends PollenServiceSupport { //Create an instance of SocialAuthConfgi object SocialAuthConfig config = SocialAuthConfig.getDefault(); + List<LoginProvider> allActiveProviders = getLoginProviderDao().forActiveEquals(true).findAll(); + allActiveProviders.forEach(provider -> { + try { + OAuthConfig providerConfig = new OAuthConfig(provider.getKey(), provider.getSecret()); + if (StringUtils.isNotBlank(provider.getPermissions())) { + providerConfig.setCustomPermissions(provider.getPermissions()); + } + config.addProviderConfig(provider.getName(), providerConfig); + + } catch (Exception e) { + if (log.isErrorEnabled()) { + log.error("Error while adding config for provider " + provider.getName(), e); + } + } + }); + //load configuration. By default load the configuration from oauth_consumer.properties. //You can also pass input stream, properties object or properties file name. config.load(); @@ -100,4 +124,43 @@ public class SocialAuthService extends PollenServiceSupport { return manager; } + + public List<LoginProviderBean> getAllLoginProviders() { + checkIsAdmin(); + LoginProviderTopiaDao dao = getLoginProviderDao(); + List<LoginProvider> loginProviders = dao.findAll().stream() + .sorted(Comparator.comparing(LoginProvider::getName)) + .collect(Collectors.toList()); + return toBeanList(LoginProviderBean.class, loginProviders); + } + + public List<String> getAvailableLoginProviders() { + LoginProviderTopiaDao dao = getLoginProviderDao(); + return dao.forActiveEquals(true).findAll().stream() + .map(LoginProvider::getName) + .sorted() + .collect(Collectors.toList()); + } + + public LoginProviderBean saveLoginProvider(LoginProviderBean loginProvider, boolean loginProviderExists) { + checkIsAdmin(); + checkNotNull(loginProvider); + LoginProviderTopiaDao dao = getLoginProviderDao(); + + LoginProvider toSave; + + if (loginProviderExists) { + toSave = dao.forTopiaIdEquals(loginProvider.getEntityId()).findUnique(); + } else { + toSave = dao.create(); + } + toSave.setName(loginProvider.getName()); + toSave.setKey(loginProvider.getKey()); + toSave.setSecret(loginProvider.getSecret()); + toSave.setPermissions(loginProvider.getPermissions()); + toSave.setActive(loginProvider.isActive()); + + commit(); + return toBean(LoginProviderBean.class, toSave); + } } diff --git a/pollen-services/src/main/resources/oauth_consumer.properties b/pollen-services/src/main/resources/oauth_consumer.properties index 6f015cc3..02f55921 100644 --- a/pollen-services/src/main/resources/oauth_consumer.properties +++ b/pollen-services/src/main/resources/oauth_consumer.properties @@ -1,6 +1,6 @@ #google -www.google.com.consumer_key = opensource.brickred.com -www.google.com.consumer_secret = YC06FqhmCLWvtBg/O4W/aJfj +#www.google.com.consumer_key = opensource.brickred.com +#www.google.com.consumer_secret = YC06FqhmCLWvtBg/O4W/aJfj #you can set custom permission by using custom_permissions with provider prefix. #www.google.com.custom_permissions = http://www.google.com/m8/feeds/,http://picasaweb.google.com/data/ @@ -13,44 +13,44 @@ www.google.com.consumer_secret = YC06FqhmCLWvtBg/O4W/aJfj #New registration on google will always provide OAuth2 keys which is supported by GooglePlus provider #google plus -googleapis.com.consumer_key = XXXXXXX -googleapis.com.consumer_secret = XXXXXXXX +#googleapis.com.consumer_key = XXXXXXX +#googleapis.com.consumer_secret = XXXXXXXX #yahoo -api.login.yahoo.com.consumer_key = dj0yJmk9VTdaSUVTU3RrWlRzJmQ9WVdrOWNtSjZNMFpITm1VbWNHbzlNQS0tJnM9Y29uc3VtZXJzZWNyZXQmeD1iMA-- -api.login.yahoo.com.consumer_secret = 1db3d0b897dac60e151aa9e2499fcb2a6b474546 +#api.login.yahoo.com.consumer_key = dj0yJmk9VTdaSUVTU3RrWlRzJmQ9WVdrOWNtSjZNMFpITm1VbWNHbzlNQS0tJnM9Y29uc3VtZXJzZWNyZXQmeD1iMA-- +#api.login.yahoo.com.consumer_secret = 1db3d0b897dac60e151aa9e2499fcb2a6b474546 #twitter -twitter.com.consumer_key = E3hm7J9IQbWLijpiQG7W8Q -twitter.com.consumer_secret = SGKNuXyybt0iDdgsuzVbFHOaemV7V6pr0wKwbaT2MH0 +#twitter.com.consumer_key = E3hm7J9IQbWLijpiQG7W8Q +#twitter.com.consumer_secret = SGKNuXyybt0iDdgsuzVbFHOaemV7V6pr0wKwbaT2MH0 #facebook -graph.facebook.com.consumer_key = 152190004803645 -graph.facebook.com.consumer_secret = 64c94bd02180b0ade85889b44b2ba7c4 +#graph.facebook.com.consumer_key = 152190004803645 +#graph.facebook.com.consumer_secret = 64c94bd02180b0ade85889b44b2ba7c4 #you can set custom permission by using custom_permissions with provider prefix. #graph.facebook.com.custom_permissions = publish_stream,email,user_birthday,user_location,offline_access #hotmail -consent.live.com.consumer_key = 000000004403D60E -consent.live.com.consumer_secret = cYqlii67pTvgPD4pdB7NUVC7L4MIHCcs +#consent.live.com.consumer_key = 000000004403D60E +#consent.live.com.consumer_secret = cYqlii67pTvgPD4pdB7NUVC7L4MIHCcs #Same keys will work for Linkedin OAuth2 provider #LinkedIn -api.linkedin.com.consumer_key = 9-mmqg28fpMocVuAg87exH-RXKs70yms52GSFIqkZN25S3m96kdPGBbuSxdSBIyL -api.linkedin.com.consumer_secret = e6NBqhDYE1fX17RwYGW5vMp25Cvh7Sbw9t-zMYTIW_T5LytY5OwJ12snh_YftgE4 +#api.linkedin.com.consumer_key = 9-mmqg28fpMocVuAg87exH-RXKs70yms52GSFIqkZN25S3m96kdPGBbuSxdSBIyL +#api.linkedin.com.consumer_secret = e6NBqhDYE1fX17RwYGW5vMp25Cvh7Sbw9t-zMYTIW_T5LytY5OwJ12snh_YftgE4 #MySpace -api.myspace.com.consumer_key = 29db395f5ee8426bb90b1db65c91c956 -api.myspace.com.consumer_secret = 0fdccc829c474e42867e16b68cda37a4c4b7b08eda574fe6a959943e3e9be709 +#api.myspace.com.consumer_key = 29db395f5ee8426bb90b1db65c91c956 +#api.myspace.com.consumer_secret = 0fdccc829c474e42867e16b68cda37a4c4b7b08eda574fe6a959943e3e9be709 #FourSquare -foursquare.com.consumer_key = JQKEM1PHWFW4YF2YPEQBRRESXE3SBGNCYJWWDTZKF3IZNJ3V -foursquare.com.consumer_secret = 4IILLDFDVPP2LC554S4KXKETQNTDKPDSEVCKVHA2QEHKYBEQ +#foursquare.com.consumer_key = JQKEM1PHWFW4YF2YPEQBRRESXE3SBGNCYJWWDTZKF3IZNJ3V +#foursquare.com.consumer_secret = 4IILLDFDVPP2LC554S4KXKETQNTDKPDSEVCKVHA2QEHKYBEQ #Yammer -www.yammer.com.consumer_key=5zyIkp12TrkulSRbSegQ -www.yammer.com.consumer_secret=zUcCB9kqWhI1IiTAJbl9QdG2AWcUJMDWp3Qyv5VJJw +#www.yammer.com.consumer_key=5zyIkp12TrkulSRbSegQ +#www.yammer.com.consumer_secret=zUcCB9kqWhI1IiTAJbl9QdG2AWcUJMDWp3Qyv5VJJw #Please use your own keys for mendeley #Mendeley @@ -58,20 +58,20 @@ www.yammer.com.consumer_secret=zUcCB9kqWhI1IiTAJbl9QdG2AWcUJMDWp3Qyv5VJJw #api.mendeley.com.consumer_secret= #Salesforce -login.salesforce.com.consumer_key = 3MVG9Y6d_Btp4xp4yFMR0tPSndkAVu4OBejuYcL2iGFC68tA49PknWKX20XdPl5s1iwWldyuAbSINWHbB2Jcu -login.salesforce.com.consumer_secret = 1993703471433041656 +#login.salesforce.com.consumer_key = 3MVG9Y6d_Btp4xp4yFMR0tPSndkAVu4OBejuYcL2iGFC68tA49PknWKX20XdPl5s1iwWldyuAbSINWHbB2Jcu +#login.salesforce.com.consumer_secret = 1993703471433041656 #Instagram -api.instagram.com.consumer_key=f1e23002a9da49f696d439368624c9fc -api.instagram.com.consumer_secret=f274614621f64d498cb3458b3736827a +#api.instagram.com.consumer_key=f1e23002a9da49f696d439368624c9fc +#api.instagram.com.consumer_secret=f274614621f64d498cb3458b3736827a #Flickr -www.flickr.com.consumer_key=942a1a394b866a30dc9b4ad8db5cb8f8 -www.flickr.com.consumer_secret=f90c5bee8a8de964 +#www.flickr.com.consumer_key=942a1a394b866a30dc9b4ad8db5cb8f8 +#www.flickr.com.consumer_secret=f90c5bee8a8de964 #GITHub -api.github.com.consumer_key=4ffc69764a59dd3ce347 -api.github.com.consumer_secret=dc62937c1d7bb9ce30cb654a26d4a575858f5e1f +#api.github.com.consumer_key=4ffc69764a59dd3ce347 +#api.github.com.consumer_secret=dc62937c1d7bb9ce30cb654a26d4a575858f5e1f #Implementations #you can provide your custom provider here e.g 'myprovider' is your provider id diff --git a/pollen-ui-riot-js/src/main/web/js/AuthService.js b/pollen-ui-riot-js/src/main/web/js/AuthService.js index 42052f20..5aa63a94 100644 --- a/pollen-ui-riot-js/src/main/web/js/AuthService.js +++ b/pollen-ui-riot-js/src/main/web/js/AuthService.js @@ -69,14 +69,25 @@ class AuthService extends FetchService { } signInProvider(query, providerRedirection) { - console.log(query) - console.log(providerRedirection) return this.fetch( "/v1/login/" + query.loginProvider, "POST", {Authorization: JSON.stringify(query)}, providerRedirection); } + + getAllLoginProviders() { + return this.get("/v1/loginproviders"); + } + + getAvailableLoginProviders() { + console.log("getAvailableLoginProviders") + return this.get("/v1/loginproviders/active"); + } + + saveLoginProvider(loginProvider) { + return this.post("/v1/loginproviders/" + (loginProvider.id || ""), loginProvider); + } } module.exports = singleton(AuthService); diff --git a/pollen-ui-riot-js/src/main/web/tag/Pollen.tag.html b/pollen-ui-riot-js/src/main/web/tag/Pollen.tag.html index 36ca5983..5a4114b6 100644 --- a/pollen-ui-riot-js/src/main/web/tag/Pollen.tag.html +++ b/pollen-ui-riot-js/src/main/web/tag/Pollen.tag.html @@ -30,8 +30,9 @@ require("./poll/EditPoll.tag.html"); require("./poll/Poll.tag.html"); require("./poll/Summary.tag.html"); require("./poll/Polls.tag.html"); -require("./Users.tag.html"); require("./UserProfile.tag.html"); +require("./admin/Users.tag.html"); +require("./admin/LoginProviders.tag.html"); require("./favoriteList/FavoriteLists.tag.html"); require("./favoriteList/FavoriteList.tag.html"); require("./popup/ConfirmPopup.tag.html"); @@ -217,6 +218,11 @@ require("./popup/InformationPopup.tag.html"); riot.mount(this.refs.content, "favoritelist", {favoriteListId: favoriteListId}); }); + route("/loginProviders", () => { + this.bus.trigger("pageChanged", "loginProviders"); + riot.mount(this.refs.content, "loginproviders"); + }); + route(() => { var q = route.query(); if (q.loginProvider != null) { diff --git a/pollen-ui-riot-js/src/main/web/tag/PollenHeader.tag.html b/pollen-ui-riot-js/src/main/web/tag/PollenHeader.tag.html index 9e540e82..7974eccb 100644 --- a/pollen-ui-riot-js/src/main/web/tag/PollenHeader.tag.html +++ b/pollen-ui-riot-js/src/main/web/tag/PollenHeader.tag.html @@ -37,6 +37,7 @@ require("./popup/FeedbackModal.tag.html"); <div class="dropdown-content right"> <a href="#user">{__.users}</a> <a href="#poll">{__.polls}</a> + <a href="#loginProviders">{__.loginProviders}</a> </div> </div> diff --git a/pollen-ui-riot-js/src/main/web/tag/SignIn.tag.html b/pollen-ui-riot-js/src/main/web/tag/SignIn.tag.html index 2ce478c5..c571e63a 100644 --- a/pollen-ui-riot-js/src/main/web/tag/SignIn.tag.html +++ b/pollen-ui-riot-js/src/main/web/tag/SignIn.tag.html @@ -58,8 +58,7 @@ require("./components/HumanInput.tag.html"); <a onclick="{newPassword}">{__.lostpassword}</a> </form> <p>Ou connectez vous avec votre compte : - <a onclick="{signinWithProvider('facebook')}"><i class="fa fa-facebook-official"></i></a> - <a onclick="{signinWithProvider('googleplus')}"><i class="fa fa-google"></i></a> + <a each="{loginProvider in loginProviders}" onclick="{signinWithProvider(loginProvider)}">{loginProvider}</a> </p> </div> @@ -79,6 +78,15 @@ require("./components/HumanInput.tag.html"); this.message = ""; this.openSignIn = false; + let authService = require("../js/AuthService"); + this.loginProviders = []; + this.on("mount", () => { + authService.getAvailableLoginProviders().then((result) => { + this.loginProviders = result; + this.update(); + }); + }); + this.newPassword = () => { this.refs.newPassword.open(this.refs.login.value || ""); }; diff --git a/pollen-ui-riot-js/src/main/web/tag/admin/LoginProviders.tag.html b/pollen-ui-riot-js/src/main/web/tag/admin/LoginProviders.tag.html new file mode 100644 index 00000000..5e23f89e --- /dev/null +++ b/pollen-ui-riot-js/src/main/web/tag/admin/LoginProviders.tag.html @@ -0,0 +1,92 @@ +<LoginProviders> + <div class="container" show="{loaded}"> + <h1>{__.title}</h1> + + <div class="main-content"> + + <table> + <thead> + <tr> + <th>{__.name}</th> + <th>{__.key}</th> + <th>{__.secret}</th> + <th>{__.permission}</th> + <th>{__.active}</th> + </tr> + </thead> + <tbody> + <tr each="{loginprovider, index in loginProviders}"> + <td><input type="text" ref="name{index}" value="{loginprovider.name}" required/></td> + <td><input type="text" ref="key{index}" value="{loginprovider.key}" required/></td> + <td><input type="text" ref="secret{index}" value="{loginprovider.secret}" required/></td> + <td><input type="text" ref="permissions{index}" value="{loginprovider.permissions}"/></td> + <td><input type="checkbox" ref="active{index}" checked="{loginprovider.active}"/></td> + <td> + <button class="c-button" onclick="{saveLoginProvider(index)}"><i class="fa fa-check"></i></button> + <button class="c-button" onclick="{cancelEdition(index)}"><i class="fa fa-remove"></i></button> + </td> + </tr> + </tbody> + </table> + + <button class="c-button" onclick="{addProvider}"><i class="fa fa-plus"></i></button> + </div> + </div> + + <script type="es6"> + this.loaded = false; + let session = require("../../js/Session"); + this.installBundle(session, "loginProviders"); + + let authService = require("../../js/AuthService"); + this.loginProviders = []; + authService.getAllLoginProviders().then((result) => { + if (!this.loaded) { + this.loginProviders = result; + this.loaded = true; + this.update(); + } + return result; + }); + + this.addProvider = (e) => { + e.preventDefault(); + e.stopPropagation(); + this.loginProviders.push({}); + }; + + this.saveLoginProvider = (index) => (e) => { + e.preventDefault(); + e.stopPropagation(); + let loginProvider = this.loginProviders[index]; + loginProvider.name = this.refs["name" + index].value; + loginProvider.key = this.refs["key" + index].value; + loginProvider.secret = this.refs["secret" + index].value; + loginProvider.permissions = this.refs["permissions" + index].value; + loginProvider.active = this.refs["active" + index].checked; + + authService.saveLoginProvider(loginProvider).then((result) => { + loginProvider.id = result.id; + loginProvider.name = result.name; + loginProvider.key = result.key; + loginProvider.secret = result.secret; + loginProvider.permissions = result.permissions; + loginProvider.active = result.active; + }); + }; + + this.cancelEdition = (index) => (e) => { + e.preventDefault(); + e.stopPropagation(); + let loginProvider = this.loginProviders[index]; + this.refs["name" + index].value = loginProvider.name || ""; + this.refs["key" + index].value = loginProvider.key || ""; + this.refs["secret" + index].value = loginProvider.secret || ""; + this.refs["permissions" + index].value = loginProvider.permissions || ""; + this.refs["active" + index].checked = loginProvider.active || false; + }; + + </script> + <style> + </style> +</LoginProviders> diff --git a/pollen-ui-riot-js/src/main/web/tag/UserCard.tag.html b/pollen-ui-riot-js/src/main/web/tag/admin/UserCard.tag.html similarity index 95% rename from pollen-ui-riot-js/src/main/web/tag/UserCard.tag.html rename to pollen-ui-riot-js/src/main/web/tag/admin/UserCard.tag.html index 33ffec79..b2599ea7 100644 --- a/pollen-ui-riot-js/src/main/web/tag/UserCard.tag.html +++ b/pollen-ui-riot-js/src/main/web/tag/admin/UserCard.tag.html @@ -1,4 +1,4 @@ -require("./components/Card.tag.html"); +require("../components/Card.tag.html"); require("./UserEditModal.tag.html"); <UserCard> @@ -50,9 +50,9 @@ require("./UserEditModal.tag.html"); </form> <script type="es6"> - let session = require("../js/Session"); + let session = require("../../js/Session"); this.installBundle(session, "user"); - let userService = require("../js/UserService"); + let userService = require("../../js/UserService"); this.editing = false; this.errors = {}; diff --git a/pollen-ui-riot-js/src/main/web/tag/UserEditModal.tag.html b/pollen-ui-riot-js/src/main/web/tag/admin/UserEditModal.tag.html similarity index 94% rename from pollen-ui-riot-js/src/main/web/tag/UserEditModal.tag.html rename to pollen-ui-riot-js/src/main/web/tag/admin/UserEditModal.tag.html index 5a89e692..a41f5350 100644 --- a/pollen-ui-riot-js/src/main/web/tag/UserEditModal.tag.html +++ b/pollen-ui-riot-js/src/main/web/tag/admin/UserEditModal.tag.html @@ -1,4 +1,4 @@ -require("./popup/Modal.tag.html"); +require("../popup/Modal.tag.html"); <UserEditModal> <Modal ref="modal" @@ -67,10 +67,10 @@ require("./popup/Modal.tag.html"); </Modal> <script type="es6"> - let session = require("../js/Session"); - let Message = require("../js/Message"); + let session = require("../../js/Session"); + let Message = require("../../js/Message"); this.installBundle(session, "user"); - let userService = require("../js/UserService"); + let userService = require("../../js/UserService"); this.errors = {}; diff --git a/pollen-ui-riot-js/src/main/web/tag/Users.tag.html b/pollen-ui-riot-js/src/main/web/tag/admin/Users.tag.html similarity index 88% rename from pollen-ui-riot-js/src/main/web/tag/Users.tag.html rename to pollen-ui-riot-js/src/main/web/tag/admin/Users.tag.html index bb2d4351..286538ad 100644 --- a/pollen-ui-riot-js/src/main/web/tag/Users.tag.html +++ b/pollen-ui-riot-js/src/main/web/tag/admin/Users.tag.html @@ -1,6 +1,6 @@ -require("./components/LazyLoad.tag.html"); -require("./components/LoadingCard.tag.html"); -require("./components/Search.tag.html"); +require("../components/LazyLoad.tag.html"); +require("../components/LoadingCard.tag.html"); +require("../components/Search.tag.html"); require("./UserCard.tag.html"); <Users> <div class="container" show="{loaded}"> @@ -28,7 +28,7 @@ require("./UserCard.tag.html"); <script type="es6"> this.loaded = false; - let session = require("../js/Session"); + let session = require("../../js/Session"); this.installBundle(session, "users"); this.pagination = { @@ -39,7 +39,7 @@ require("./UserCard.tag.html"); }; this.search = {value: ""}; - let userService = require("../js/UserService"); + let userService = require("../../js/UserService"); this.refresh = () => { this.refs.lazyLoad.reload(); -- To stop receiving notification emails like this one, please contact chorem.org SCM administrator <admin+scm@chorem.org>.