package org.apache.hadoop.fs.nfs.topology; import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.io.IOException; import java.util.HashMap; import java.util.LinkedList; import java.util.List; import org.apache.hadoop.conf.Configuration; import com.google.gson.Gson; import com.google.gson.GsonBuilder; import com.google.gson.JsonSyntaxException; import com.google.gson.annotations.Expose; public class SimpleUserGroupAuthentication extends UserGroupAuthentication { String nfsUserConfigFile; String nfsGroupConfigFile; HashMap<String, String> userToID; HashMap<String, String> IDToUser; HashMap<String, String> groupToID; HashMap<String, String> IDToGroup; @Override public void initialize(String userConf, String groupConf, Configuration configuration) throws IOException { nfsUserConfigFile = userConf; nfsGroupConfigFile = groupConf; if (nfsUserConfigFile != null) { File uf = new File(nfsUserConfigFile); if (uf.exists()) { createUserMap(UserMapping.loadFromFile(nfsUserConfigFile).getUserNames()); } } if (nfsGroupConfigFile != null) { File gf = new File(nfsGroupConfigFile); if (gf.exists()) { createGroupMap(GroupMapping.loadFromFile(nfsGroupConfigFile).getGroupNames()); } } } @Override public String getUserNameFromUserId(String userid) { return IDToUser.get(userid); } @Override public String getUserIdFromUserName(String username) { return userToID.get(username); } @Override public String getGroupNameFromGroupId(String groupid) { return IDToGroup.get(groupid); } @Override public String getGroupIdFromGroupName(String groupname) { return groupToID.get(groupname); } public void createUserMap(List<UserName> users) { if (users == null || users.isEmpty()) return; userToID = new HashMap<String, String> (); IDToUser = new HashMap<String, String> (); for(UserName user: users) { userToID.put(user.getUserName(), user.getUserID()); IDToUser.put(user.getUserID(), user.getUserName()); } } public void createGroupMap(List<GroupName> groups) { if (groups == null || groups.isEmpty()) return; groupToID = new HashMap<String, String> (); IDToGroup = new HashMap<String, String> (); for(GroupName group: groups) { groupToID.put(group.getGroupName(), group.getGroupID()); IDToGroup.put(group.getGroupID(), group.getGroupName()); } } public static class UserMapping { @Expose List<UserName> usernames; public UserMapping() { usernames = new LinkedList<>(); } public UserMapping(List<UserName> usernames) { this.usernames = usernames; } public List<UserName> getUserNames() { return usernames; } public static UserMapping loadFromFile(String filename) throws IOException { try { Gson gson = new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create(); UserMapping map = gson.fromJson(new BufferedReader(new FileReader(filename)), UserMapping.class); return map; } catch(JsonSyntaxException exception) { throw new IOException("Could not parse config file " + filename, exception); } catch(IOException exception) { throw new IOException("Could not open namespace config file " + filename, exception); } } } public static class GroupMapping { @Expose List<GroupName> groupnames; public List<GroupName> getGroupNames() { return groupnames; } public GroupMapping(List<GroupName> groupnames) { this.groupnames = groupnames; } public static GroupMapping loadFromFile(String filename) throws IOException { try { Gson gson = new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create(); GroupMapping map = gson.fromJson(new BufferedReader(new FileReader(filename)), GroupMapping.class); return map; } catch(JsonSyntaxException exception) { throw new IOException("Could not parse config file " + filename, exception); } catch(IOException exception) { throw new IOException("Could not open namespace config file " + filename, exception); } } } }