package railo.commons.io.res.type.s3; import java.io.IOException; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import railo.commons.lang.Md5; import railo.commons.lang.StringUtil; import railo.runtime.exp.PageException; import railo.runtime.functions.s3.StoreGetACL; import railo.runtime.op.Caster; import railo.runtime.type.Array; import railo.runtime.type.Struct; import railo.runtime.type.util.KeyConstants; public class AccessControl { public static final short TYPE_GROUP=1; public static final short TYPE_EMAIL=2; public static final short TYPE_CANONICAL_USER=4; private String id; private String displayName; private String permission; private String uri; private short type; private String email; /** * @return the type */ public short getType() { return type; } /** * @param type the type to set */ public void setType(short type) { this.type = type; } /** * @return the id */ public String getId() { return id; } /** * @param id the id to set */ public void setId(String id) { this.id = id; } /** * @return the displayName */ public String getDisplayName() { return displayName; } /** * @param displayName the displayName to set */ public void setDisplayName(String displayName) { this.displayName = displayName; } /** * @return the permission */ public String getPermission() { return permission; } public void setPermission(String permission) { this.permission=permission; } /** * @return the uri */ public String getUri() { return uri; } /** * @param uri the uri to set */ public void setUri(String uri) { this.uri = uri; } /** * @return the email */ public String getEmail() { return email; } /** * @param email the email to set */ public void setEmail(String email) { this.email = email; } @Override public String toString(){ return "displayName:"+displayName+";email:"+email+";id:"+id+";permission:"+permission+";type:"+type+";uri:"+uri; } public String hash() { try { return Md5.getDigestAsString(toString()); } catch (IOException e) { return null; } } @Override public int hashCode() { return hash().hashCode(); } public static List<AccessControl> toAccessControlList(Object objACL) throws S3Exception, PageException{ Array arr = Caster.toArray(objACL,null); if(arr==null) throw new S3Exception("ACL Object must be a Array of Structs"); Struct sct; Iterator<Object> it = arr.valueIterator(); List<AccessControl> acl=new ArrayList<AccessControl>(); while(it.hasNext()){ sct=Caster.toStruct(it.next(), null); if(sct==null) throw new S3Exception("ACL Object must be a Array of Structs"); acl.add(toAccessControl(sct)); } return acl; } public static AccessControl toAccessControl(Struct sct) throws S3Exception, PageException{ AccessControl ac=new AccessControl(); ac.setPermission(AccessControl.toPermission(sct.get(StoreGetACL.PERMISSION,null))); // Email String email = Caster.toString(sct.get(KeyConstants._email,null),null); if(!StringUtil.isEmpty(email)){ ac.setType(AccessControl.TYPE_EMAIL); ac.setEmail(email); return ac; } // Group String uri=AccessControl.groupToURI(sct.get(KeyConstants._group,null)); if(!StringUtil.isEmpty(uri)) { ac.setType(AccessControl.TYPE_GROUP); ac.setUri(uri); return ac; } // Canonical String id = Caster.toString(sct.get(KeyConstants._id),null); String displayName = Caster.toString(sct.get(StoreGetACL.DISPLAY_NAME),null); if(StringUtil.isEmpty(id)) throw new S3Exception("missing id for Canonical User defintion"); ac.setType(AccessControl.TYPE_CANONICAL_USER); ac.setId(id); ac.setDisplayName(displayName); return ac; } public static String toPermission(Object oPermission) throws S3Exception { String permission=Caster.toString(oPermission,null); if(StringUtil.isEmpty(permission,true)) throw new S3Exception("missing permission definition"); permission=permission.toUpperCase().trim(); permission=AccessControl.removeWordDelimter(permission); if("FULLCONTROL".equals(permission)) return "FULL_CONTROL"; else if("WRITEACP".equals(permission)) return "WRITE_ACP"; else if("READACP".equals(permission)) return "READ_ACP"; else if("WRITE".equals(permission)) return "WRITE"; else if("READ".equals(permission)) return "READ"; else throw new S3Exception("invalid permission definition ["+permission+"], valid permissions are [FULL_CONTROL, WRITE, WRITE_ACP, READ, READ_ACP]"); } public static String groupToURI(Object oGroup) throws S3Exception { if(!StringUtil.isEmpty(oGroup)) { String group=Caster.toString(oGroup,null); if(group==null) throw new S3Exception("invalid object type for group definition"); group=removeWordDelimter(group); if("all".equalsIgnoreCase(group)) return "http://acs.amazonaws.com/groups/global/AllUsers"; if("authenticated".equalsIgnoreCase(group) || "AuthenticatedUser".equalsIgnoreCase(group) || "AuthenticatedUsers".equalsIgnoreCase(group)) return "http://acs.amazonaws.com/groups/global/AuthenticatedUsers"; if("logdelivery".equalsIgnoreCase(group)) return "http://acs.amazonaws.com/groups/s3/LogDelivery"; throw new S3Exception("invalid group definition ["+group+"], valid group defintions are are [all,authenticated,log_delivery]"); } return null; } public static String toType(short type) throws S3Exception { String rtn = toType(type, null); if(rtn!=null) return rtn; throw new S3Exception("invalid type defintion"); } public static String toType(short type, String defaultValue) { switch(type){ case TYPE_EMAIL: return "AmazonCustomerByEmail"; case TYPE_GROUP: return "Group"; case TYPE_CANONICAL_USER: return "CanonicalUser"; } return defaultValue; } public static short toType(String type) throws S3Exception { short rtn = toType(type, (short)-1); if(rtn!=-1) return rtn; throw new S3Exception("invalid type defintion ["+type+"], valid types are [Email,Group,CanonicalUser]"); } public static short toType(String type, short defaultValue) { type=removeWordDelimter(type); if("Email".equalsIgnoreCase(type)) return TYPE_EMAIL; if("AmazonCustomerByEmail".equalsIgnoreCase(type)) return TYPE_EMAIL; if("CanonicalUser".equalsIgnoreCase(type)) return TYPE_CANONICAL_USER; if("Group".equalsIgnoreCase(type)) return TYPE_GROUP; return defaultValue; } private static String removeWordDelimter(String str) { str=StringUtil.replace(str,"_", "", false); str=StringUtil.replace(str,"-", "", false); str=StringUtil.replace(str," ", "", false); return str; } }