From 9ae47335a5be89528d145e76346d86adb2feec41 Mon Sep 17 00:00:00 2001 From: Mauro Mugnaini Date: Tue, 6 Oct 2020 13:05:38 +0200 Subject: [PATCH] Added avatar export in local folder support. Resolves issue #19891 --- CHANGELOG.md | 2 +- .../d4science/ClientsCreatorFromExport.java | 84 +- .../oidc/keycloak/d4science/ExportParser.java | 6 +- src/test/resources/UserRolesOutput.json | 716 ++++++++++++++++++ 4 files changed, 793 insertions(+), 15 deletions(-) create mode 100644 src/test/resources/UserRolesOutput.json diff --git a/CHANGELOG.md b/CHANGELOG.md index 1e11e3e..ef85ac6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,7 +1,7 @@ # Changelog for "oidc-keycloak-library" ## [v1.0.0-SNAPSHOT] -- First release (#19143) +- First release (#19143, #19891) This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). \ No newline at end of file diff --git a/src/main/java/org/gcube/oidc/keycloak/d4science/ClientsCreatorFromExport.java b/src/main/java/org/gcube/oidc/keycloak/d4science/ClientsCreatorFromExport.java index 2ca7585..491f4c8 100644 --- a/src/main/java/org/gcube/oidc/keycloak/d4science/ClientsCreatorFromExport.java +++ b/src/main/java/org/gcube/oidc/keycloak/d4science/ClientsCreatorFromExport.java @@ -1,8 +1,13 @@ package org.gcube.oidc.keycloak.d4science; +import java.io.File; import java.io.FileInputStream; +import java.io.FileOutputStream; import java.io.IOException; +import java.io.InputStream; import java.io.UnsupportedEncodingException; +import java.net.MalformedURLException; +import java.net.URL; import java.security.KeyManagementException; import java.security.NoSuchAlgorithmException; import java.util.Collections; @@ -14,6 +19,7 @@ import java.util.Set; import javax.xml.parsers.ParserConfigurationException; +import org.apache.commons.io.IOUtils; import org.gcube.oidc.D4ScienceMappings.Role; import org.gcube.oidc.D4ScienceMappings.Scope; import org.gcube.oidc.keycloak.KeycloakHelper; @@ -53,7 +59,7 @@ public class ClientsCreatorFromExport { public void createClients() throws KeycloakResourceCreationException, UnsupportedEncodingException { RealmResource realmResource = keycloak.realm(realm); - for (String contextClient : exportParser.getAllContexts()) { + for (String contextClient : getExportParser().getAllContexts()) { System.out.println("adding client: " + contextClient); ClientResource client = kh.addClient(realmResource, contextClient, contextClient, @@ -142,7 +148,7 @@ public class ClientsCreatorFromExport { public void deleteClients() { RealmResource realmResource = keycloak.realm(realm); - for (String contextClient : exportParser.getAllContexts()) { + for (String contextClient : getExportParser().getAllContexts()) { System.out.println("- deleting: " + contextClient); try { kh.removeClient(realmResource, contextClient); @@ -154,7 +160,7 @@ public class ClientsCreatorFromExport { public void mapUsersWithRolesToClients() throws UnsupportedEncodingException { RealmResource realmResource = keycloak.realm(realm); - Map>> usersToContextsAndRoles = exportParser.getAllUserContextsAndRoles(); + Map>> usersToContextsAndRoles = getExportParser().getAllUserContextsAndRoles(); for (String userName : usersToContextsAndRoles.keySet()) { System.out.println("- user: " + userName); UserResource userResource = kh.findUser(realmResource, userName); @@ -182,31 +188,82 @@ public class ClientsCreatorFromExport { } } + public void saveAvatarsLocally(String avatarBaseURL, String destinationFolder) { + URL baseURL; + try { + baseURL = new URL(avatarBaseURL); + } catch (MalformedURLException e) { + System.err.println("Bad avatar base URL provided: " + e.getMessage()); + return; + } + Map usersAndAvatars = getExportParser().getAllUsersAndAvatars(); + File destinationFolderFile = null; + if (destinationFolder != null) { + destinationFolderFile = new File(destinationFolder); + } else { + destinationFolderFile = new File("."); + } + if (!destinationFolderFile.exists()) { + System.out.println("- Creating destination folder: " + destinationFolderFile.getAbsolutePath()); + destinationFolderFile.mkdir(); + } else if (!destinationFolderFile.isDirectory()) { + System.err.println("Provided destination is not a folder: " + destinationFolderFile.getAbsolutePath()); + } + for (String username : usersAndAvatars.keySet()) { + String avatarURLSuffix = usersAndAvatars.get(username); + if (avatarURLSuffix != null) { + System.out.println("- Saving avatar of user: " + username); + try { + URL avatarURL = new URL(baseURL, avatarURLSuffix); + InputStream avatarIS = avatarURL.openStream(); + File destinationFile = new File(destinationFolder, username); + FileOutputStream destinationFOS = new FileOutputStream(destinationFile); + IOUtils.copy(avatarIS, destinationFOS); + destinationFOS.close(); + if (destinationFile.exists() && destinationFile.length() == 0) { + System.out.println(" -- Deleting zero bytes length avatar for user: " + username); + destinationFile.delete(); + } + } catch (IOException e) { + e.printStackTrace(); + } + } else { + System.out.println("--- Avatar URL not provided for user: " + username); + } + } + } + public ExportParser getExportParser() { return exportParser; } - - public static void main(String[] args) throws Exception { - String serverURL = null; + String kcServerURL = null; String username = null; String password = null; String realm = null; FileInputStream exportFileFIS = null; + String avatarBaseURL = null; + String avatarExportFolder = null; if (args.length < 5) { System.err.println("Missing params.\n\nUsage: " + ClientsCreatorFromExport.class.getName() - + " [serverURL] [username] [password] [realm] [export_file]"); + + " [keycloak_serverURL] [username] [password] [realm] [export_file] [[avatar_base_url] [avatar_export_folder]]"); return; } else { - serverURL = args[0]; + kcServerURL = args[0]; username = args[1]; password = args[2]; realm = args[3]; exportFileFIS = new FileInputStream(args[4]); + if (args.length > 5) { + avatarBaseURL = args[5]; + } + if (args.length == 7) { + avatarExportFolder = args[6]; + } } - ClientsCreatorFromExport creator = new ClientsCreatorFromExport(serverURL, username, password, realm, + ClientsCreatorFromExport creator = new ClientsCreatorFromExport(kcServerURL, username, password, realm, exportFileFIS); Date start = new Date(); @@ -217,10 +274,14 @@ public class ClientsCreatorFromExport { creator.createClients(); System.out.println("\n\n * * * Mapping users to client's roles * * *"); creator.mapUsersWithRolesToClients(); + if (avatarBaseURL != null) { + System.out.println("\n\n * * * Exporting user's avatar * * *"); + creator.saveAvatarsLocally(avatarBaseURL, avatarExportFolder); + } Date end = new Date(); System.out.println("Elapsed seconds: " + new Long(end.getTime() - start.getTime()).floatValue() / 1000); System.out.println("\nClients: " + creator.getExportParser().getAllContexts().size()); - System.out.println("Users: " + creator.getExportParser().getAllUsers().size()); + System.out.println("Users: " + creator.getExportParser().getAllUsersAndAvatars().size()); Map>> ucar = creator.getExportParser().getAllUserContextsAndRoles(); float rolesPerUserMean = 0; for (String user : ucar.keySet()) { @@ -228,6 +289,7 @@ public class ClientsCreatorFromExport { rolesPerUserMean += ucar.get(user).get(context).size() + 1; } } - System.out.println("Roles per user mean: " + rolesPerUserMean / creator.getExportParser().getAllUsers().size()); + System.out.println( + "Roles per user mean: " + rolesPerUserMean / creator.getExportParser().getAllUsersAndAvatars().size()); } } diff --git a/src/main/java/org/gcube/oidc/keycloak/d4science/ExportParser.java b/src/main/java/org/gcube/oidc/keycloak/d4science/ExportParser.java index ffae6ca..fc2a833 100644 --- a/src/main/java/org/gcube/oidc/keycloak/d4science/ExportParser.java +++ b/src/main/java/org/gcube/oidc/keycloak/d4science/ExportParser.java @@ -27,12 +27,12 @@ public class ExportParser { rootNode = (ArrayNode) objectMapper.readTree(exportFileFIS); } - public Set getAllUsers() { - Set users = new TreeSet<>(); + public Map getAllUsersAndAvatars() { + Map users = new TreeMap<>(); Iterator arrayIterator = rootNode.elements(); while (arrayIterator.hasNext()) { JsonNode entry = arrayIterator.next(); - users.add(entry.get("username").asText()); + users.put(entry.get("username").asText(), entry.get("avatarURL").asText()); } return users; } diff --git a/src/test/resources/UserRolesOutput.json b/src/test/resources/UserRolesOutput.json new file mode 100644 index 0000000..51ab6c5 --- /dev/null +++ b/src/test/resources/UserRolesOutput.json @@ -0,0 +1,716 @@ +[ + { + "username": "20158", + "avatarURL": "/image/user_male_portrait?img_id=0&img_id_token=GVAKASx5ucYDY6dM4baHyzjSDd4%3D&t=1601290149069", + "contexts": { + + } + }, + { + "username": "nikolaos.drakopoulos", + "avatarURL": "/image/user_male_portrait?img_id=0&img_id_token=gc9vDHJhL%2F5BNmQ4dq2iQ8ZJTlU%3D&t=1601290149069", + "contexts": { + "/gcube": [], + "/gcube/devsec": [] + } + }, + { + "username": "roberto.cirillo", + "avatarURL": "/image/user_male_portrait?img_id=0&img_id_token=8iuD%2B6QNL9RGtvmP1nas%2Fp1ZAG4%3D&t=1601290149069", + "contexts": { + "/gcube": [ + "VO-Admin" + ], + "/gcube/devsec/devVRE": [ + "VRE-Manager", + "DataMiner-Manager" + ], + "/gcube/devsec": [ + "VO-Admin" + ], + "/gcube/devNext/NextNext": [], + "/gcube/devNext": [ + "VO-Admin" + ] + } + }, + { + "username": "alessia.bardi", + "avatarURL": "/image/user_female_portrait?img_id=0&img_id_token=21xFZ3FJ25JGakekjYR%2F10PbKmA%3D&t=1601290149069", + "contexts": { + "/gcube": [], + "/gcube/devsec": [] + } + }, + { + "username": "aureliano.gentile", + "avatarURL": "/image/user_male_portrait?img_id=0&img_id_token=S2oqdVxZH9Bz5eqjQqjniVRBId0%3D&t=1601290149069", + "contexts": { + "/gcube": [], + "/gcube/devsec": [], + "/gcube/devNext": [] + } + }, + { + "username": "ngalante", + "avatarURL": "/image/user_male_portrait?img_id=0&img_id_token=1SSKciv1WOE9PwogK2jCgCVyzo8%3D&t=1601290149069", + "contexts": { + "/gcube": [], + "/gcube/devsec": [], + "/gcube/devNext": [] + } + }, + { + "username": "nicolas.bailly", + "avatarURL": "/image/user_male_portrait?img_id=0&img_id_token=GFTwsmfU%2BAHJK47RuFU4BELipvY%3D&t=1601290149069", + "contexts": { + "/gcube": [], + "/gcube/devsec": [] + } + }, + { + "username": "taha.imzilen", + "avatarURL": "/image/user_male_portrait?img_id=0&img_id_token=ukplcF%2B7pSktjCHiIiEbTctAiho%3D&t=1601290149069", + "contexts": { + "/gcube": [], + "/gcube/devsec": [] + } + }, + { + "username": "lucio.lelii", + "avatarURL": "/image/user_male_portrait?img_id=0&img_id_token=jBlUJmNkNJdSyeYwMyzfY8Om5iY%3D&t=1601290149069", + "contexts": { + "/gcube": [ + "Infrastructure-Manager" + ], + "/gcube/devsec/Mon20July1612": [ + "VRE-Manager" + ], + "/gcube/devsec/devVRE": [ + "VRE-Manager", + "DataMiner-Manager" + ], + "/gcube/devsec": [ + "VRE-Manager", + "VO-Admin" + ], + "/gcube/devNext/NextNext": [ + "DataMiner-Manager" + ], + "/gcube/devNext": [ + "VRE-Designer", + "VRE-Manager", + "VO-Admin" + ] + } + }, + { + "username": "paul.taconet", + "avatarURL": "/image/user_male_portrait?img_id=0&img_id_token=JEUwZOo2DHobPqAnKqmpsZOEoxs%3D&t=1601290149069", + "contexts": { + "/gcube": [], + "/gcube/devsec/devVRE": [], + "/gcube/devsec": [], + "/gcube/devNext": [] + } + }, + { + "username": "gianpaolo.coro", + "avatarURL": "/image/user_male_portrait?img_id=0&img_id_token=HwYlOTPpwzCNdt5OajuCpTK%2FNEY%3D&t=1601290149069", + "contexts": { + "/gcube": [], + "/gcube/devsec/devVRE": [], + "/gcube/devsec": [ + "VO-Admin" + ], + "/gcube/devNext": [], + "/gcube/devNext/NextNext": [ + "Data-Manager", + "Catalogue-Admin", + "DataMiner-Manager" + ] + } + }, + { + "username": "ciro.formisano", + "avatarURL": "/image/user_male_portrait?img_id=0&img_id_token=lch2BNnJMQ1LoyIoflynr0PTzjs%3D&t=1601290149069", + "contexts": { + "/gcube": [], + "/gcube/devsec": [], + "/gcube/devNext": [] + } + }, + { + "username": "valentina.marioli", + "avatarURL": "/image/user_male_portrait?img_id=30175726&img_id_token=OWgCtyZGGumk1lExq3%2BY1a2OYsY%3D&t=1601546256284", + "contexts": { + "/gcube": [], + "/gcube/devsec": [ + "VO-Admin" + ], + "/gcube/devNext": [] + } + }, + { + "username": "andrea.dellamico", + "avatarURL": "/image/user_male_portrait?img_id=0&img_id_token=deHZlJ%2BaL6rODb2mnPt%2FyRPewGo%3D&t=1601290149069", + "contexts": { + "/gcube": [], + "/gcube/devsec": [], + "/gcube/devNext/NextNext": [], + "/gcube/devNext": [] + } + }, + { + "username": "panagiota.koltsida", + "avatarURL": "/image/user_male_portrait?img_id=0&img_id_token=6e38INmp5qj6fkmicQ5mlYdKBaY%3D&t=1601290149069", + "contexts": { + "/gcube": [], + "/gcube/devsec/devVRE": [], + "/gcube/devsec": [ + "Data-Manager", + "VRE-Designer" + ], + "/gcube/devNext": [] + } + }, + { + "username": "konstantinos.giannousis", + "avatarURL": "/image/user_male_portrait?img_id=0&img_id_token=%2BcLoGMO%2BW7Y8SBqrFP3l6erqUpk%3D&t=1601290149069", + "contexts": { + "/gcube": [] + } + }, + { + "username": "tommaso.piccioli", + "avatarURL": "/image/user_male_portrait?img_id=0&img_id_token=wj5tj3LVRYfyeXDwopaT1bXxxuc%3D&t=1601290149069", + "contexts": { + "/gcube": [], + "/gcube/devsec/devVRE": [], + "/gcube/devsec": [], + "/gcube/devNext": [] + } + }, + { + "username": "paolo.manghi", + "avatarURL": "/image/user_male_portrait?img_id=0&img_id_token=sPbxHcTNi1tSv4YMcnj%2FZ7rK60c%3D&t=1601290149069", + "contexts": { + "/gcube": [] + } + }, + { + "username": "emmanuel.blondel", + "avatarURL": "/image/user_male_portrait?img_id=0&img_id_token=Zc7O0B4L7V49mTzTgQLh%2FoVr580%3D&t=1601290149069", + "contexts": { + "/gcube": [], + "/gcube/devsec": [], + "/gcube/devNext": [] + } + }, + { + "username": "francesco.mangiacrapa", + "avatarURL": "/image/user_male_portrait?img_id=0&img_id_token=9MfQjjk3%2FIzIVQtsMah83E1z4vs%3D&t=1601290149069", + "contexts": { + "/gcube": [], + "/gcube/devsec/devVRE": [ + "Catalogue-Admin" + ], + "/gcube/devsec": [], + "/gcube/devNext/NextNext": [ + "Catalogue-Admin" + ], + "/gcube/devNext": [] + } + }, + { + "username": "ashtoash", + "avatarURL": "/image/user_male_portrait?img_id=0&img_id_token=IjjGs6OZycGOAwrv4W%2FxzyrmmRQ%3D&t=1601290149069", + "contexts": { + "/gcube": [], + "/gcube/devsec": [] + } + }, + { + "username": "anton.ellenbroek", + "avatarURL": "/image/user_male_portrait?img_id=0&img_id_token=qtIE5HN%2BAE23bmg7Ox9gTfvAyF4%3D&t=1601290149069", + "contexts": { + "/gcube": [], + "/gcube/devsec": [], + "/gcube/devNext": [] + } + }, + { + "username": "pasquale.pagano", + "avatarURL": "/image/user_male_portrait?img_id=0&img_id_token=JO2uil%2BuyGlAUh27tzFHwPS1jcU%3D&t=1601290149069", + "contexts": { + "/gcube": [ + "VO-Admin" + ], + "/gcube/devsec/devVRE": [], + "/gcube/devsec": [ + "VRE-Manager", + "VO-Admin" + ], + "/gcube/devNext/NextNext": [ + "Data-Manager", + "Catalogue-Admin" + ], + "/gcube/devNext": [ + "VO-Admin" + ] + } + }, + { + "username": "leonardo.candela", + "avatarURL": "/image/user_male_portrait?img_id=0&img_id_token=xu2bKoUrhElmR%2FceOxVnTbBaQEQ%3D&t=1601290149069", + "contexts": { + "/gcube": [], + "/gcube/devsec/devVRE": [ + "VRE-Designer", + "VRE-Manager", + "Catalogue-Admin" + ], + "/gcube/devsec": [ + "VRE-Manager", + "VO-Admin" + ], + "/gcube/devNext": [], + "/gcube/devNext/NextNext": [ + "VRE-Manager", + "Catalogue-Admin" + ] + } + }, + { + "username": "donatella.castelli", + "avatarURL": "/image/user_male_portrait?img_id=0&img_id_token=l5pzxpmxa98uH0RDoJcYiEd9OYs%3D&t=1601290149069", + "contexts": { + "/gcube": [], + "/gcube/devsec": [] + } + }, + { + "username": "julien.barde", + "avatarURL": "/image/user_male_portrait?img_id=0&img_id_token=Eouucnhg7yD%2F6cg%2FpeEHD%2FIQa%2Bo%3D&t=1601290149069", + "contexts": { + "/gcube": [], + "/gcube/devsec": [], + "/gcube/devNext": [] + } + }, + { + "username": "giancarlo.panichi", + "avatarURL": "/image/user_male_portrait?img_id=0&img_id_token=4Xwy%2B61I3rSZ7Qt018DOW4TH%2Fjo%3D&t=1601290149069", + "contexts": { + "/gcube": [ + "Infrastructure-Manager" + ], + "/gcube/devsec/devVRE": [ + "DataMiner-Manager" + ], + "/gcube/devsec": [], + "/gcube/devNext/NextNext": [ + "Data-Manager", + "VRE-Manager", + "Catalogue-Editor", + "DataMiner-Manager" + ], + "/gcube/devNext": [] + } + }, + { + "username": "luca.frosini", + "avatarURL": "/image/user_male_portrait?img_id=0&img_id_token=%2BFIqz%2FIogZCjrbfmSuo%2FHBp4Pso%3D&t=1601290149069", + "contexts": { + "/gcube": [ + "VRE-Manager", + "VO-Admin" + ], + "/gcube/devsec/devVRE": [ + "Catalogue-Admin" + ], + "/gcube/devsec": [], + "/gcube/devNext": [], + "/gcube/devNext/NextNext": [ + "Catalogue-Admin", + "Accounting-Manager" + ] + } + }, + { + "username": "fabio.sinibaldi", + "avatarURL": "/image/user_male_portrait?img_id=0&img_id_token=LR2wXrHdP3qSXMX8fLr6NQNlQGc%3D&t=1601290149069", + "contexts": { + "/gcube": [], + "/gcube/devsec/devVRE": [ + "Catalogue-Admin" + ], + "/gcube/devsec": [ + "VO-Admin", + "Catalogue-Admin" + ], + "/gcube/devNext": [ + "VRE-Designer", + "VRE-Manager", + "VO-Admin" + ], + "/gcube/devNext/NextNext": [ + "Catalogue-Admin" + ] + } + }, + { + "username": "yannis.marketakis", + "avatarURL": "/image/user_male_portrait?img_id=0&img_id_token=4gAiTy2YF6ABHuSYiagvr6Ku%2FhI%3D&t=1601290149069", + "contexts": { + "/gcube": [], + "/gcube/devsec/devVRE": [], + "/gcube/devsec": [], + "/gcube/devNext": [], + "/gcube/devNext/NextNext": [] + } + }, + { + "username": "paolo.fabriani", + "avatarURL": "/image/user_male_portrait?img_id=0&img_id_token=Ysyc1VD6Srsf8UK2GSX6pHL1Ik0%3D&t=1601290149069", + "contexts": { + "/gcube": [], + "/gcube/devsec": [], + "/gcube/devNext": [] + } + }, + { + "username": "nikolas.laskaris", + "avatarURL": "/image/user_male_portrait?img_id=0&img_id_token=n9QaEgg6H4PlPbWhoD6lxvKR3SY%3D&t=1601290149069", + "contexts": { + "/gcube": [], + "/gcube/devsec": [], + "/gcube/devNext": [] + } + }, + { + "username": "massimiliano.assante", + "avatarURL": "/image/user_male_portrait?img_id=39185507&img_id_token=51%2BzKsVudKPCTFBxV%2FEgNGG6D7M%3D&t=1601545765713", + "contexts": { + "/gcube": [ + "Infrastructure-Manager", + "VO-Admin" + ], + "/gcube/devsec/devVRE": [ + "VRE-Manager" + ], + "/gcube/devsec/Mon20July1612": [ + "VRE-Manager", + "Catalogue-Editor" + ], + "/gcube/devsec": [ + "VRE-Manager", + "VO-Admin" + ], + "/gcube/devNext/NextNext": [ + "VRE-Manager" + ], + "/gcube/devNext": [ + "Infrastructure-Manager", + "VRE-Manager", + "VO-Admin" + ] + } + }, + { + "username": "gkakas", + "avatarURL": "/image/user_female_portrait?img_id=0&img_id_token=6e3KM5BiPinMkJsAosAMujtb0YQ%3D&t=1601290149069", + "contexts": { + "/gcube": [] + } + }, + { + "username": "gantzoulatos", + "avatarURL": "/image/user_male_portrait?img_id=0&img_id_token=PSQTz6tY9hgoeIaam8tiDojQV5w%3D&t=1601290149069", + "contexts": { + "/gcube": [], + "/gcube/devsec": [] + } + }, + { + "username": "enrico.anello", + "avatarURL": "/image/user_male_portrait?img_id=0&img_id_token=lNQ8%2FL8Rf5zQNxEC5t%2FWU1xnsiY%3D&t=1601290149069", + "contexts": { + "/gcube": [], + "/gcube/devsec": [] + } + }, + { + "username": "mister.orange", + "avatarURL": "/image/user_male_portrait?img_id=0&img_id_token=G8CostRyxLg9Jfw5xuzWYXebigc%3D&t=1601290149069", + "contexts": { + "/gcube": [] + } + }, + { + "username": "mister.blue", + "avatarURL": "/image/user_male_portrait?img_id=0&img_id_token=4dk76aMw%2FzCHIOh1d7VjxRkVLLU%3D&t=1601290149069", + "contexts": { + "/gcube": [] + } + }, + { + "username": "kostas.kakaletris", + "avatarURL": "/image/user_female_portrait?img_id=0&img_id_token=CmX36QiuYR0XMgkdzXDyZbun0h8%3D&t=1601290149069", + "contexts": { + "/gcube": [], + "/gcube/devsec/devVRE": [ + "Infrastructure-Manager" + ], + "/gcube/devsec": [], + "/gcube/devNext": [] + } + }, + { + "username": "leviwesterveld", + "avatarURL": "/image/user_male_portrait?img_id=0&img_id_token=nfTI78XqYjxCaJ43Hub0YQVDqgc%3D&t=1601290149069", + "contexts": { + "/gcube": [] + } + }, + { + "username": "dataminer", + "avatarURL": "/image/user_male_portrait?img_id=0&img_id_token=apVwzKiExbkgLQ1V5eUvkDIQLAA%3D&t=1601290149069", + "contexts": { + + } + }, + { + "username": "andrea.rossi", + "avatarURL": "/image/user_male_portrait?img_id=30110057&img_id_token=gAJ4uVWTA74xwQ6%2FCA72RRinysY%3D&t=1601545799059", + "contexts": { + "/gcube": [], + "/gcube/devsec/devVRE": [ + "VRE-Manager", + "Catalogue-Editor" + ], + "/gcube/devsec/Mon20July1612": [ + "VRE-Designer", + "Catalogue-Editor" + ], + "/gcube/devsec": [ + "VRE-Designer" + ], + "/gcube/devNext": [], + "/gcube/devNext/NextNext": [] + } + }, + { + "username": "efthymios", + "avatarURL": "/image/user_male_portrait?img_id=0&img_id_token=MY02p044ame0ejhM8dHdeKaprlg%3D&t=1601290149069", + "contexts": { + "/gcube": [], + "/gcube/devsec": [] + } + }, + { + "username": "miles", + "avatarURL": "/image/user_male_portrait?img_id=0&img_id_token=yzg255CrF36xGieEz5IWD54qalM%3D&t=1601290149069", + "contexts": { + "/gcube": [], + "/gcube/devNext": [] + } + }, + { + "username": "kgiannakelos", + "avatarURL": "/image/user_male_portrait?img_id=0&img_id_token=1TyGvJOiGOVkdtgRNdowT5XKu1w%3D&t=1601290149069", + "contexts": { + "/gcube": [], + "/gcube/devNext": [] + } + }, + { + "username": "grsf.publisher", + "avatarURL": "/image/user_male_portrait?img_id=0&img_id_token=CkQQapbhbcFel5qiLHTg1aCx4%2Fo%3D&t=1601290149069", + "contexts": { + "/gcube": [], + "/gcube/devNext": [], + "/gcube/devNext/NextNext": [ + "Catalogue-Admin" + ] + } + }, + { + "username": "jsonws.user", + "avatarURL": "/image/user_male_portrait?img_id=25603407&img_id_token=WDv6qtAFEFbm%2FvzrRoAmgCx3iwU%3D&t=1601546256419", + "contexts": { + "/gcube": [] + } + }, + { + "username": "ay", + "avatarURL": "/image/user_male_portrait?img_id=0&img_id_token=x4pAA%2BKtkVNr8VayfKsbMha0XFc%3D&t=1601290149069", + "contexts": { + "/gcube": [], + "/gcube/devNext": [] + } + }, + { + "username": "salvam", + "avatarURL": "/image/user_male_portrait?img_id=0&img_id_token=GlygbuzwA6tbfnCF5UjvoHhpuhw%3D&t=1601290149069", + "contexts": { + "/gcube": [], + "/gcube/devsec": [], + "/gcube/devNext": [] + } + }, + { + "username": "nikos", + "avatarURL": "/image/user_male_portrait?img_id=0&img_id_token=nJIyOwnlx7KuQy7Tmv1WiM%2BPLu0%3D&t=1601290149069", + "contexts": { + "/gcube": [], + "/gcube/devNext": [] + } + }, + { + "username": "statistical.manager", + "avatarURL": "/image/user_male_portrait?img_id=0&img_id_token=tsAwwpZRPUiFm72s51ymLazpOfU%3D&t=1601290149069", + "contexts": { + "/gcube": [], + "/gcube/devsec/devVRE": [], + "/gcube/devsec": [], + "/gcube/devNext/NextNext": [ + "Data-Manager" + ], + "/gcube/devNext": [] + } + }, + { + "username": "manuele.simi", + "avatarURL": "/image/user_male_portrait?img_id=31248083&img_id_token=TwIodQXO8q%2Bg3%2BPM8ftbdCwFUiI%3D&t=1601546256438", + "contexts": { + "/gcube": [], + "/gcube/devsec/devVRE": [], + "/gcube/devNext/NextNext": [] + } + }, + { + "username": "vfloros", + "avatarURL": "/image/user_male_portrait?img_id=0&img_id_token=fX1fd9w4f4pcJ0V6%2F8m6cv0GQ14%3D&t=1601290149069", + "contexts": { + "/gcube": [], + "/gcube/devsec/devVRE": [ + "Catalogue-Editor" + ], + "/gcube/devsec": [], + "/gcube/devNext": [] + } + }, + { + "username": "rob.knapen", + "avatarURL": "/image/user_male_portrait?img_id=0&img_id_token=LcOEVy85EAy8P5MVf%2Bj8CJFemHY%3D&t=1601290149069", + "contexts": { + "/gcube": [] + } + }, + { + "username": "mister.white", + "avatarURL": "/image/user_male_portrait?img_id=0&img_id_token=CBG%2BYgIMvWXE5M1KdNR6qrAqjRY%3D&t=1601290149069", + "contexts": { + "/gcube": [], + "/gcube/devNext/NextNext": [] + } + }, + { + "username": "chiamag", + "avatarURL": "/image/user_male_portrait?img_id=0&img_id_token=3SRUpAosZFPDtV0yNsN3uAGcd%2Fw%3D&t=1601290149069", + "contexts": { + "/gcube": [], + "/gcube/devsec/devVRE": [], + "/gcube/devsec": [] + } + }, + { + "username": "mauro.mugnaini", + "avatarURL": "/image/user_male_portrait?img_id=39131064&img_id_token=3hw14Gvh724icS9X8KOpGQ%2BbOUk%3D&t=1601546256457", + "contexts": { + "/gcube": [], + "/gcube/devsec/Mon20July1612": [ + "VRE-Manager" + ], + "/gcube/devsec/devVRE": [], + "/gcube/devsec": [], + "/gcube/devNext": [], + "/gcube/devNext/NextNext": [] + } + }, + { + "username": "pino", + "avatarURL": "/image/user_male_portrait?img_id=0&img_id_token=yoymRDXOhQOX6vc6cORHcs%2BHpfo%3D&t=1601290149069", + "contexts": { + "/gcube": [], + "/gcube/devsec/devVRE": [ + "Data-Manager", + "DataMiner-Manager" + ], + "/gcube/devsec": [] + } + }, + { + "username": "marco.lettere", + "avatarURL": "/image/user_male_portrait?img_id=39131005&img_id_token=4TrJGGgbzLAKZ1KT5khri31hB3Q%3D&t=1601546256464", + "contexts": { + "/gcube": [], + "/gcube/devsec/devVRE": [], + "/gcube/devsec": [] + } + }, + { + "username": "mauro.mugnaini.altro", + "avatarURL": "/image/user_male_portrait?img_id=0&img_id_token=RhM1gdNIzW20YmKJSSRs36aejvY%3D&t=1601290149069", + "contexts": { + + } + }, + { + "username": "mugna.inimauro", + "avatarURL": "/image/user_male_portrait?img_id=0&img_id_token=3EQb2wggDMC%2BwzPfPR5tT7ixhCc%3D&t=1601290149069", + "contexts": { + + } + }, + { + "username": "ginone.stillone", + "avatarURL": "/image/user_male_portrait?img_id=0&img_id_token=Y%2F76Ld%2F0auCkf8vGm0YX3JLjkds%3D&t=1601290149069", + "contexts": { + "/gcube": [], + "/gcube/devNext": [], + "/gcube/devNext/NextNext": [] + } + }, + { + "username": "vincenzo.cestone", + "avatarURL": "/image/user_male_portrait?img_id=0&img_id_token=yvmt3fUAfqVZmeqZCb9mTwa9hxk%3D&t=1601290149069", + "contexts": { + + } + }, + { + "username": "dicondina.tiziano", + "avatarURL": "/image/user_male_portrait?img_id=0&img_id_token=EnDGhzwqlemN%2BG3c1v%2B5a5SExtE%3D&t=1601290149069", + "contexts": { + + } + }, + { + "username": "vietnam", + "avatarURL": "/image/user_male_portrait?img_id=0&img_id_token=LiCO1c%2FDdD4ehe%2FZYNr2gAvFb40%3D&t=1601290149069", + "contexts": { + + } + }, + { + "username": "massimiliano.assante.1", + "avatarURL": "/image/user_male_portrait?img_id=0&img_id_token=xQ0GKEA%2Fiu1I3PeGSpWRHZ7OK%2Bk%3D&t=1601290149069", + "contexts": { + "/gcube": [], + "/gcube/devsec/devVRE": [], + "/gcube/devsec": [] + } + } +] \ No newline at end of file