package org.dcache.srm.handler; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.net.URI; import org.dcache.srm.AbstractStorageElement; import org.dcache.srm.FileMetaData; import org.dcache.srm.SRM; import org.dcache.srm.SRMAuthorizationException; import org.dcache.srm.SRMException; import org.dcache.srm.SRMInternalErrorException; import org.dcache.srm.SRMInvalidPathException; import org.dcache.srm.SRMInvalidRequestException; import org.dcache.srm.SRMUser; import org.dcache.srm.v2_2.ArrayOfTGroupPermission; import org.dcache.srm.v2_2.ArrayOfTPermissionReturn; import org.dcache.srm.v2_2.SrmGetPermissionRequest; import org.dcache.srm.v2_2.SrmGetPermissionResponse; import org.dcache.srm.v2_2.TGroupPermission; import org.dcache.srm.v2_2.TPermissionMode; import org.dcache.srm.v2_2.TPermissionReturn; import org.dcache.srm.v2_2.TReturnStatus; import org.dcache.srm.v2_2.TStatusCode; import static com.google.common.base.Preconditions.checkNotNull; import static org.dcache.srm.handler.ReturnStatuses.getSummaryReturnStatus; public class SrmGetPermission { private static final Logger LOGGER = LoggerFactory.getLogger(SrmGetPermission.class); private final AbstractStorageElement storage; private final SrmGetPermissionRequest request; private final SRMUser user; private SrmGetPermissionResponse response; public SrmGetPermission(SRMUser user, SrmGetPermissionRequest request, AbstractStorageElement storage, SRM srm, String client_host) { this.request = checkNotNull(request); this.user = checkNotNull(user); this.storage = checkNotNull(storage); } public SrmGetPermissionResponse getResponse() { if (response == null) { try { response = srmGetPermission(); } catch (SRMInternalErrorException e) { LOGGER.error(e.getMessage()); return getFailedResponse(e.getMessage(), TStatusCode.SRM_INTERNAL_ERROR); } catch (SRMInvalidRequestException e) { return getFailedResponse(e.getMessage(), TStatusCode.SRM_INVALID_REQUEST); } } return response; } private SrmGetPermissionResponse srmGetPermission() throws SRMInvalidRequestException, SRMInternalErrorException { org.apache.axis.types.URI[] surls = request.getArrayOfSURLs().getUrlArray(); if (surls == null || surls.length == 0) { throw new SRMInvalidRequestException("arrayOfSURLs is empty"); } int length = surls.length; TPermissionReturn permissionsArray[] = new TPermissionReturn[length]; boolean hasFailure = false; boolean hasSuccess = false; for (int i = 0; i < length; i++) { TPermissionReturn p = new TPermissionReturn(); TReturnStatus returnStatus; try { FileMetaData fmd = storage.getFileMetaData(user, URI.create(surls[i].toString()), false); copyPermissions(fmd, p); returnStatus = new TReturnStatus(TStatusCode.SRM_SUCCESS, null); hasSuccess = true; } catch (SRMInternalErrorException e) { throw e; } catch (SRMAuthorizationException e) { returnStatus = new TReturnStatus(TStatusCode.SRM_AUTHORIZATION_FAILURE, e.getMessage()); hasFailure = true; } catch (SRMInvalidPathException e) { returnStatus = new TReturnStatus(TStatusCode.SRM_INVALID_PATH, e.getMessage()); hasFailure = true; } catch (SRMException e) { LOGGER.warn(e.toString()); returnStatus = new TReturnStatus(TStatusCode.SRM_FAILURE, e.getMessage()); hasFailure = true; } p.setSurl(surls[i]); p.setStatus(returnStatus); permissionsArray[i] = p; } return new SrmGetPermissionResponse( getSummaryReturnStatus(hasFailure, hasSuccess), new ArrayOfTPermissionReturn(permissionsArray)); } private static void copyPermissions(FileMetaData fmd, TPermissionReturn p) { String owner = fmd.owner; String group = fmd.group; int permissions = fmd.permMode; TPermissionMode upm = PermissionMaskToTPermissionMode.maskToTPermissionMode(((permissions >> 6) & 0x7)); TPermissionMode gpm = PermissionMaskToTPermissionMode.maskToTPermissionMode(((permissions >> 3) & 0x7)); TPermissionMode opm = PermissionMaskToTPermissionMode.maskToTPermissionMode((permissions & 0x7)); TGroupPermission[] groupPermissionArray = new TGroupPermission[] { new TGroupPermission(group, gpm) }; p.setArrayOfGroupPermissions(new ArrayOfTGroupPermission(groupPermissionArray)); p.setOwnerPermission(upm); p.setOtherPermission(opm); p.setOwner(owner); } public static final SrmGetPermissionResponse getFailedResponse(String error) { return getFailedResponse(error, TStatusCode.SRM_FAILURE); } public static final SrmGetPermissionResponse getFailedResponse(String error, TStatusCode statusCode) { SrmGetPermissionResponse response = new SrmGetPermissionResponse(); response.setReturnStatus(new TReturnStatus(statusCode, error)); return response; } }