package io.cattle.platform.docker.machine.api; import static io.cattle.platform.core.constants.MachineConstants.*; import static io.cattle.platform.docker.machine.api.MachineLinkFilter.*; import io.cattle.platform.api.link.LinkHandler; import io.cattle.platform.core.constants.HostConstants; import io.cattle.platform.core.model.Host; import io.cattle.platform.core.model.PhysicalHost; import io.cattle.platform.framework.secret.SecretsService; import io.cattle.platform.object.ObjectManager; import io.cattle.platform.object.util.DataUtils; import io.github.ibuildthecloud.gdapi.exception.ClientVisibleException; import io.github.ibuildthecloud.gdapi.request.ApiRequest; import io.github.ibuildthecloud.gdapi.util.ResponseCodes; import java.io.IOException; import javax.inject.Inject; import javax.servlet.http.HttpServletResponse; import org.apache.commons.codec.binary.Base64; import org.apache.commons.lang.StringUtils; public class MachineConfigLinkHandler implements LinkHandler { @Inject ObjectManager objectManager; @Inject SecretsService secretsService; @Override public String[] getTypes() { return new String[] { KIND_MACHINE, HostConstants.TYPE }; } @Override public boolean handles(String type, String id, String link, ApiRequest request) { return CONFIG_LINK.equalsIgnoreCase(link); } @Override public Object link(String name, Object obj, ApiRequest request) throws IOException { if (!canAccessConfig()){ throw new ClientVisibleException(ResponseCodes.UNAUTHORIZED); } if (obj instanceof Host) { Long physicalHostId = ((Host) obj).getPhysicalHostId(); obj = objectManager.loadResource(PhysicalHost.class, physicalHostId); } if (obj instanceof PhysicalHost) { PhysicalHost host = (PhysicalHost) obj; String extractedConfig = (String) DataUtils.getFields(host).get(EXTRACTED_CONFIG_FIELD); if (extractedConfig.startsWith("{")) { try { extractedConfig = secretsService.decrypt(host.getAccountId(), extractedConfig); } catch (Exception e) { throw new IOException(e); } } if (StringUtils.isNotEmpty(extractedConfig)) { byte[] content = Base64.decodeBase64(extractedConfig.getBytes()); HttpServletResponse response = request.getServletContext().getResponse(); response.setContentLength(content.length); response.setContentType("application/octet-stream"); response.setHeader("Content-Disposition", "attachment; filename=" + host.getName() + ".tar.gz"); response.setHeader("Cache-Control", "private"); response.setHeader("Pragma", "private"); response.setHeader("Expires", "Wed 24 Feb 1982 18:42:00 GMT"); response.getOutputStream().write(content); return new Object(); } } return null; } }