/* * Copyright (c) 2008-2011 by Jan Stender, * Zuse Institute Berlin * * Licensed under the BSD License, see LICENSE file for details. * */ package org.xtreemfs.mrc.operations; import java.net.InetSocketAddress; import org.xtreemfs.common.Capability; import org.xtreemfs.common.quota.QuotaConstants; import org.xtreemfs.foundation.TimeSync; import org.xtreemfs.foundation.pbrpc.generatedinterfaces.RPC.POSIXErrno; import org.xtreemfs.mrc.MRCRequest; import org.xtreemfs.mrc.MRCRequestDispatcher; import org.xtreemfs.mrc.UserException; import org.xtreemfs.mrc.ac.FileAccessManager; import org.xtreemfs.mrc.database.StorageManager; import org.xtreemfs.mrc.database.VolumeInfo; import org.xtreemfs.mrc.database.VolumeManager; import org.xtreemfs.mrc.metadata.FileMetadata; import org.xtreemfs.mrc.utils.Converter; import org.xtreemfs.mrc.utils.MRCHelper; import org.xtreemfs.mrc.utils.MRCHelper.GlobalFileIdResolver; import org.xtreemfs.pbrpc.generatedinterfaces.GlobalTypes.FileCredentials; import org.xtreemfs.pbrpc.generatedinterfaces.GlobalTypes.SnapConfig; import org.xtreemfs.pbrpc.generatedinterfaces.GlobalTypes.XLocSet; import org.xtreemfs.pbrpc.generatedinterfaces.MRC.xtreemfs_get_file_credentialsRequest; public class GetFileCredentialsOperation extends MRCOperation { public GetFileCredentialsOperation(MRCRequestDispatcher master) { super(master); } @Override public void startRequest(MRCRequest rq) throws Throwable { final xtreemfs_get_file_credentialsRequest rqArgs = (xtreemfs_get_file_credentialsRequest) rq .getRequestArgs(); final VolumeManager vMan = master.getVolumeManager(); final FileAccessManager faMan = master.getFileAccessManager(); validateContext(rq); GlobalFileIdResolver gfr = new GlobalFileIdResolver(rqArgs.getFileId()); final String volId = gfr.getVolumeId(); final Long localFileID = gfr.getLocalFileId(); StorageManager sMan = vMan.getStorageManager(volId); VolumeInfo volume = sMan.getVolumeInfo(); // get file and check if it exist FileMetadata file = sMan.getMetadata(localFileID); if (file == null) throw new UserException(POSIXErrno.POSIX_ERROR_ENOENT, "file '" + rqArgs.getFileId() + "' does not exist"); // check whether privileged permissions are granted for starting replication faMan.checkPrivilegedPermissions(sMan, file, rq.getDetails().userId, rq.getDetails().superUser, rq.getDetails().groupIds); boolean enableTracing = volume.isTracingEnabled(); String traceTarget = volume.getTraceTarget(); String tracingPolicy = volume.getTracingPolicy(); // create FileCredentials Capability cap = new Capability(MRCHelper.createGlobalFileId(volume, file), FileAccessManager.O_RDONLY, master.getConfig().getCapabilityTimeout(), TimeSync.getGlobalTime() / 1000 + master.getConfig().getCapabilityTimeout(), ((InetSocketAddress) rq.getRPCRequest() .getSenderAddress()).getAddress().getHostAddress(), file.getEpoch(), false, !volume.isSnapshotsEnabled() ? SnapConfig.SNAP_CONFIG_SNAPS_DISABLED : volume.isSnapVolume() ? SnapConfig.SNAP_CONFIG_ACCESS_SNAP : SnapConfig.SNAP_CONFIG_ACCESS_CURRENT, volume.getCreationTime(), enableTracing, traceTarget, tracingPolicy, QuotaConstants.UNLIMITED_VOUCHER, 0L, master.getConfig().getCapabilitySecret()); // build new XlocSet with readonlyFileSize set. Necessary to check if replication is complete. XLocSet newXlocSet = null; if (file.isReadOnly()) { newXlocSet = Converter.xLocListToXLocSet(file.getXLocList()).setReadOnlyFileSize(file.getSize()) .build(); } else { newXlocSet = Converter.xLocListToXLocSet(file.getXLocList()).build(); } FileCredentials fc = FileCredentials.newBuilder().setXcap(cap.getXCap()).setXlocs(newXlocSet).build(); rq.setResponse(fc); finishRequest(rq); } }