diff --git a/src/net/datenwerke/rs/ReportServerServiceConfig.java b/src/net/datenwerke/rs/ReportServerServiceConfig.java index 214b9c96d..e13d25dd4 100755 --- a/src/net/datenwerke/rs/ReportServerServiceConfig.java +++ b/src/net/datenwerke/rs/ReportServerServiceConfig.java @@ -161,7 +161,6 @@ import net.datenwerke.rs.localfsdatasink.service.localfsdatasink.LocalFileSystemModule; import net.datenwerke.rs.oauth.server.oauth.OAuthRpcServiceImpl; import net.datenwerke.rs.oauth.server.oauth.OAuthServlet; -import net.datenwerke.rs.oauth.service.oauth.OAuthModule; import net.datenwerke.rs.onedrive.server.onedrive.OneDriveRpcServiceImpl; import net.datenwerke.rs.onedrive.service.onedrive.OneDriveModule; import net.datenwerke.rs.passwordpolicy.server.AccountInhibitionRpcServiceImpl; @@ -649,7 +648,6 @@ protected List getModules() { new DropboxModule(), new OneDriveModule(), new ScpModule(), - new OAuthModule(), new ReportServerPUModule(), diff --git a/src/net/datenwerke/rs/dropbox/client/dropbox/hookers/DropboxDatasinkConfigProviderHooker.java b/src/net/datenwerke/rs/dropbox/client/dropbox/hookers/DropboxDatasinkConfigProviderHooker.java index 70eba8de1..513971987 100644 --- a/src/net/datenwerke/rs/dropbox/client/dropbox/hookers/DropboxDatasinkConfigProviderHooker.java +++ b/src/net/datenwerke/rs/dropbox/client/dropbox/hookers/DropboxDatasinkConfigProviderHooker.java @@ -13,17 +13,24 @@ import net.datenwerke.rs.core.client.datasinkmanager.hooks.DatasinkDefinitionConfigProviderHook; import net.datenwerke.rs.dropbox.client.dropbox.dto.DropboxDatasinkDto; import net.datenwerke.rs.dropbox.client.dropbox.ui.DropboxDatasinkForm; +import net.datenwerke.rs.enterprise.client.EnterpriseUiService; import net.datenwerke.rs.theme.client.icon.BaseIcon; public class DropboxDatasinkConfigProviderHooker implements DatasinkDefinitionConfigProviderHook { private final Provider formProvider; + + private final Provider enterpriseServiceProvider; @Inject - public DropboxDatasinkConfigProviderHooker(Provider formProvider) { + public DropboxDatasinkConfigProviderHooker( + Provider formProvider, + Provider enterpriseServiceProvider + ) { /* store objects */ this.formProvider = formProvider; + this.enterpriseServiceProvider = enterpriseServiceProvider; } @Override @@ -58,7 +65,7 @@ public ImageResource getDatasinkIcon() { @Override public boolean isAvailable() { - return true; + return enterpriseServiceProvider.get().isEnterprise(); } } diff --git a/src/net/datenwerke/rs/dropbox/client/dropbox/hookers/ExportToDropboxHooker.java b/src/net/datenwerke/rs/dropbox/client/dropbox/hookers/ExportToDropboxHooker.java index 20b60f617..961dc238f 100644 --- a/src/net/datenwerke/rs/dropbox/client/dropbox/hookers/ExportToDropboxHooker.java +++ b/src/net/datenwerke/rs/dropbox/client/dropbox/hookers/ExportToDropboxHooker.java @@ -46,6 +46,7 @@ import net.datenwerke.rs.dropbox.client.dropbox.DropboxDao; import net.datenwerke.rs.dropbox.client.dropbox.dto.DropboxDatasinkDto; import net.datenwerke.rs.dropbox.client.dropbox.provider.annotations.DatasinkTreeDropbox; +import net.datenwerke.rs.enterprise.client.EnterpriseUiService; import net.datenwerke.rs.eximport.client.eximport.locale.ExImportMessages; import net.datenwerke.rs.scheduleasfile.client.scheduleasfile.StorageType; import net.datenwerke.rs.scheduleasfile.client.scheduleasfile.locale.ScheduleAsFileMessages; @@ -57,38 +58,49 @@ public class ExportToDropboxHooker implements ExportExternalEntryProviderHook { private final Provider treeProvider; private final DatasinkTreeManagerDao datasinkTreeManager; private final Provider datasinkDaoProvider; + + private final Provider enterpriseServiceProvider; @Inject public ExportToDropboxHooker( HookHandlerService hookHandler, @DatasinkTreeDropbox Provider treeProvider, DatasinkTreeManagerDao datasinkTreeManager, - Provider datasinkDaoProvider + Provider datasinkDaoProvider, + Provider enterpriseServiceProvider ) { this.hookHandler = hookHandler; this.treeProvider = treeProvider; this.datasinkTreeManager = datasinkTreeManager; this.datasinkDaoProvider = datasinkDaoProvider; + this.enterpriseServiceProvider = enterpriseServiceProvider; } @Override public void getMenuEntry(Menu menu, ReportDto report, ReportExecutorInformation info, ReportExecutorMainPanel mainPanel) { - datasinkDaoProvider.get().getStorageEnabledConfigs(new AsyncCallback>() { - - @Override - public void onSuccess(Map result) { - if (result.get(StorageType.DROPBOX)) { - MenuItem item = new DwMenuItem("Dropbox", BaseIcon.DROPBOX); - menu.add(item); - item.addSelectionHandler(event -> displayExportDialog(report, info, mainPanel.getViewConfigs())); + if (enterpriseServiceProvider.get().isEnterprise()) { + datasinkDaoProvider.get().getStorageEnabledConfigs(new AsyncCallback>() { + + @Override + public void onSuccess(Map result) { + if (result.get(StorageType.DROPBOX)) { + MenuItem item = new DwMenuItem("Dropbox", BaseIcon.DROPBOX); + menu.add(item); + item.addSelectionHandler(event -> displayExportDialog(report, info, mainPanel.getViewConfigs())); + } } - } - @Override - public void onFailure(Throwable caught) { - } - }); + @Override + public void onFailure(Throwable caught) { + } + }); + } else { + // we add item but disable it + MenuItem item = new DwMenuItem("Dropbox", BaseIcon.DROPBOX); + menu.add(item); + item.disable(); + } } diff --git a/src/net/datenwerke/rs/dropbox/service/dropbox/DropboxModule.java b/src/net/datenwerke/rs/dropbox/service/dropbox/DropboxModule.java index 34959041d..14243e051 100644 --- a/src/net/datenwerke/rs/dropbox/service/dropbox/DropboxModule.java +++ b/src/net/datenwerke/rs/dropbox/service/dropbox/DropboxModule.java @@ -28,8 +28,6 @@ public class DropboxModule extends AbstractModule { @Override protected void configure() { - bind(DropboxService.class).to(DropboxServiceImpl.class); - requestStaticInjection(DropboxDatasink.class); bind(DropboxStartup.class).asEagerSingleton(); diff --git a/src/net/datenwerke/rs/dropbox/service/dropbox/DropboxService.java b/src/net/datenwerke/rs/dropbox/service/dropbox/DropboxService.java index 5c5e2e5cc..ec0443ab6 100644 --- a/src/net/datenwerke/rs/dropbox/service/dropbox/DropboxService.java +++ b/src/net/datenwerke/rs/dropbox/service/dropbox/DropboxService.java @@ -5,9 +5,12 @@ import java.util.Optional; import java.util.concurrent.ExecutionException; +import com.google.inject.ImplementedBy; + import net.datenwerke.rs.dropbox.service.dropbox.definitions.DropboxDatasink; import net.datenwerke.rs.scheduleasfile.client.scheduleasfile.StorageType; +@ImplementedBy(DummyDropboxServiceImpl.class) public interface DropboxService { /** diff --git a/src/net/datenwerke/rs/dropbox/service/dropbox/DropboxServiceImpl.java b/src/net/datenwerke/rs/dropbox/service/dropbox/DropboxServiceImpl.java deleted file mode 100644 index ed066c391..000000000 --- a/src/net/datenwerke/rs/dropbox/service/dropbox/DropboxServiceImpl.java +++ /dev/null @@ -1,123 +0,0 @@ -package net.datenwerke.rs.dropbox.service.dropbox; - -import static net.datenwerke.rs.dropbox.service.dropbox.DropboxModule.PROPERTY_DROPBOX_DISABLED; -import static net.datenwerke.rs.dropbox.service.dropbox.DropboxModule.PROPERTY_DROPBOX_SCHEDULING_ENABLED; - -import java.io.IOException; -import java.io.InputStream; -import java.text.SimpleDateFormat; -import java.util.Calendar; -import java.util.Map; -import java.util.Objects; -import java.util.Optional; -import java.util.concurrent.ExecutionException; - -import javax.inject.Inject; -import javax.inject.Provider; - -import org.apache.commons.io.IOUtils; - -import com.github.scribejava.apis.DropboxApi; -import com.github.scribejava.core.builder.ServiceBuilder; -import com.github.scribejava.core.model.OAuth2AccessToken; -import com.github.scribejava.core.model.OAuthRequest; -import com.github.scribejava.core.model.Response; -import com.github.scribejava.core.model.Verb; -import com.github.scribejava.core.oauth.OAuth20Service; - -import net.datenwerke.rs.core.service.datasinkmanager.DatasinkService; -import net.datenwerke.rs.core.service.reportmanager.ReportService; -import net.datenwerke.rs.dropbox.service.dropbox.annotations.DefaultDropboxDatasink; -import net.datenwerke.rs.dropbox.service.dropbox.definitions.DropboxDatasink; -import net.datenwerke.rs.scheduleasfile.client.scheduleasfile.StorageType; - -public class DropboxServiceImpl implements DropboxService { - - private static final String UPLOAD_URL = "https://content.dropboxapi.com/2/files/upload"; - - private final Provider reportServiceProvider; - - private final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); - - private final Provider> defaultDatasinkProvider; - private final Provider datasinkServiceProvider; - - @Inject - public DropboxServiceImpl( - Provider reportServiceProvider, - Provider datasinkServiceProvider, - @DefaultDropboxDatasink Provider> defaultDatasinkProvider - ) { - this.reportServiceProvider = reportServiceProvider; - this.defaultDatasinkProvider = defaultDatasinkProvider; - this.datasinkServiceProvider = datasinkServiceProvider; - } - - @Override - public void exportIntoDropbox(Object report, DropboxDatasink dropboxDatasink, String filename, String folder) - throws IOException, InterruptedException, ExecutionException { - if (!isDropboxEnabled()) - throw new IllegalStateException("Dropbox is disabled"); - - Objects.requireNonNull(dropboxDatasink, "Datasink is null"); - - final String refreshToken = dropboxDatasink.getRefreshToken(); - - Objects.requireNonNull(refreshToken, - "Dropbox authentication not configured, please setup by using the \"Datasink OAuth2 Authentication Setup\" button."); - - final OAuth20Service oauthService = new ServiceBuilder(dropboxDatasink.getAppKey()) - .apiSecret(dropboxDatasink.getSecretKey()).build(DropboxApi.instance()); - - OAuth2AccessToken accessToken = oauthService.refreshAccessToken(refreshToken); - - try (InputStream is = reportServiceProvider.get().createInputStream(report)) { - final OAuthRequest request = new OAuthRequest(Verb.POST, UPLOAD_URL); - request.addHeader("Content-Type", "application/octet-stream"); - request.addHeader("Dropbox-API-Arg", - "{\"path\": \"" + (folder.endsWith("/") ? folder : folder + "/") + filename - + "\",\"mode\": \"overwrite\",\"autorename\": false,\"mute\": false,\"strict_conflict\": false}"); - request.setPayload(IOUtils.toByteArray(is)); - oauthService.signRequest(accessToken, request); - - try (Response response = oauthService.execute(request)) { - int responseCode = response.getCode(); - if (200 != responseCode) - throw new IOException("Could not upload to Dropbox. Response code = " + responseCode - + ", response body = ['" + response.getBody() + "']"); - } - } - } - - @Override - public Map getStorageEnabledConfigs() { - return datasinkServiceProvider.get().getEnabledConfigs(StorageType.DROPBOX, PROPERTY_DROPBOX_DISABLED, - StorageType.DROPBOX_SCHEDULING, PROPERTY_DROPBOX_SCHEDULING_ENABLED); - } - - @Override - public boolean isDropboxEnabled() { - return datasinkServiceProvider.get().isEnabled(PROPERTY_DROPBOX_DISABLED); - } - - @Override - public boolean isDropboxSchedulingEnabled() { - return datasinkServiceProvider.get().isSchedulingEnabled(PROPERTY_DROPBOX_SCHEDULING_ENABLED); - } - - @Override - public void testDropboxDatasink(DropboxDatasink dropboxDatasink) - throws IOException, InterruptedException, ExecutionException { - if (!isDropboxEnabled()) - throw new IllegalStateException("Dropbox datasink is disabled"); - exportIntoDropbox("ReportServer Dropbox Datasink Test " + dateFormat.format(Calendar.getInstance().getTime()), - dropboxDatasink, "reportserver-dropbox-test.txt", dropboxDatasink.getFolder()); - - } - - @Override - public Optional getDefaultDatasink() { - return defaultDatasinkProvider.get(); - } - -} diff --git a/src/net/datenwerke/rs/dropbox/service/dropbox/DummyDropboxServiceImpl.java b/src/net/datenwerke/rs/dropbox/service/dropbox/DummyDropboxServiceImpl.java new file mode 100644 index 000000000..04f8ef3b0 --- /dev/null +++ b/src/net/datenwerke/rs/dropbox/service/dropbox/DummyDropboxServiceImpl.java @@ -0,0 +1,43 @@ +package net.datenwerke.rs.dropbox.service.dropbox; + +import java.io.IOException; +import java.util.Collections; +import java.util.Map; +import java.util.Optional; + +import net.datenwerke.rs.dropbox.service.dropbox.definitions.DropboxDatasink; +import net.datenwerke.rs.scheduleasfile.client.scheduleasfile.StorageType; + +public class DummyDropboxServiceImpl implements DropboxService { + + @Override + public void exportIntoDropbox(Object report, DropboxDatasink dropboxDatasink, String filename, String folder) + throws IOException { + + } + + @Override + public Map getStorageEnabledConfigs() { + return Collections.emptyMap(); + } + + @Override + public boolean isDropboxEnabled() { + return false; + } + + @Override + public boolean isDropboxSchedulingEnabled() { + return false; + } + + @Override + public void testDropboxDatasink(DropboxDatasink dropboxDatasink) throws IOException { + } + + @Override + public Optional getDefaultDatasink() { + return null; + } + +} \ No newline at end of file diff --git a/src/net/datenwerke/rs/localfsdatasink/client/localfsdatasink/LocalFileSystemDao.java b/src/net/datenwerke/rs/localfsdatasink/client/localfsdatasink/LocalFileSystemDao.java index d8f7df1be..6d8a7a334 100644 --- a/src/net/datenwerke/rs/localfsdatasink/client/localfsdatasink/LocalFileSystemDao.java +++ b/src/net/datenwerke/rs/localfsdatasink/client/localfsdatasink/LocalFileSystemDao.java @@ -36,9 +36,9 @@ public void getStorageEnabledConfigs(AsyncCallback> ca rpcService.getStorageEnabledConfigs(transformAndKeepCallback(callback)); } - public Request testLocalFileSystemDataSink(LocalFileSystemDatasinkDto localFileSystemDatasinkDto, + public Request testLocalFileSystemDatasink(LocalFileSystemDatasinkDto localFileSystemDatasinkDto, AsyncCallback callback) { - return rpcService.testLocalFileSystemDataSink(localFileSystemDatasinkDto, transformAndKeepCallback(callback)); + return rpcService.testLocalFileSystemDatasink(localFileSystemDatasinkDto, transformAndKeepCallback(callback)); } @Override diff --git a/src/net/datenwerke/rs/localfsdatasink/client/localfsdatasink/LocalFileSystemUiStartup.java b/src/net/datenwerke/rs/localfsdatasink/client/localfsdatasink/LocalFileSystemUiStartup.java index 60872946f..c74b34a7b 100644 --- a/src/net/datenwerke/rs/localfsdatasink/client/localfsdatasink/LocalFileSystemUiStartup.java +++ b/src/net/datenwerke/rs/localfsdatasink/client/localfsdatasink/LocalFileSystemUiStartup.java @@ -13,7 +13,7 @@ import net.datenwerke.rs.core.client.datasinkmanager.hooks.DatasinkDefinitionConfigProviderHook; import net.datenwerke.rs.core.client.reportexporter.hooks.ExportExternalEntryProviderHook; import net.datenwerke.rs.localfsdatasink.client.localfsdatasink.hookers.ExportToLocalFileSystemHooker; -import net.datenwerke.rs.localfsdatasink.client.localfsdatasink.hookers.LocalFileSystemDataSinkTesterToolbarConfigurator; +import net.datenwerke.rs.localfsdatasink.client.localfsdatasink.hookers.LocalFileSystemDatasinkTesterToolbarConfigurator; import net.datenwerke.rs.localfsdatasink.client.localfsdatasink.hookers.LocalFileSystemDatasinkConfigProviderHooker; import net.datenwerke.rs.localfsdatasink.client.localfsdatasink.hookers.LocalFileSystemExportSnippetProvider; import net.datenwerke.rs.scheduleasfile.client.scheduleasfile.StorageType; @@ -27,7 +27,7 @@ public LocalFileSystemUiStartup(final Provider ex final Provider localFileSystemTreeConfiguratorProvider, final WaitOnEventUIService waitOnEventService, final LocalFileSystemDao dao, final Provider localFileSystemExportSnippetProvider, - final LocalFileSystemDataSinkTesterToolbarConfigurator localFileSystemTestToolbarConfigurator) { + final LocalFileSystemDatasinkTesterToolbarConfigurator localFileSystemTestToolbarConfigurator) { /* config tree */ hookHandler.attachHooker(DatasinkDefinitionConfigProviderHook.class, localFileSystemTreeConfiguratorProvider.get(), HookHandlerService.PRIORITY_MEDIUM); diff --git a/src/net/datenwerke/rs/localfsdatasink/client/localfsdatasink/hookers/ExportToLocalFileSystemHooker.java b/src/net/datenwerke/rs/localfsdatasink/client/localfsdatasink/hookers/ExportToLocalFileSystemHooker.java index d1d1e81d1..36e585975 100644 --- a/src/net/datenwerke/rs/localfsdatasink/client/localfsdatasink/hookers/ExportToLocalFileSystemHooker.java +++ b/src/net/datenwerke/rs/localfsdatasink/client/localfsdatasink/hookers/ExportToLocalFileSystemHooker.java @@ -44,6 +44,7 @@ import net.datenwerke.rs.core.client.reportexporter.hooks.ExportExternalEntryProviderHook; import net.datenwerke.rs.core.client.reportexporter.locale.ReportExporterMessages; import net.datenwerke.rs.core.client.reportmanager.dto.reports.ReportDto; +import net.datenwerke.rs.enterprise.client.EnterpriseUiService; import net.datenwerke.rs.eximport.client.eximport.locale.ExImportMessages; import net.datenwerke.rs.localfsdatasink.client.localfsdatasink.LocalFileSystemDao; import net.datenwerke.rs.localfsdatasink.client.localfsdatasink.dto.LocalFileSystemDatasinkDto; @@ -60,40 +61,50 @@ public class ExportToLocalFileSystemHooker implements ExportExternalEntryProvide private final DatasinkTreeManagerDao datasinkTreeManager; private final Provider datasinkDaoProvider; + private final Provider enterpriseServiceProvider; + @Inject public ExportToLocalFileSystemHooker( HookHandlerService hookHandler, DatasinkTreeManagerDao datasinkTreeManager, @DatasinkTreeLocalFileSystem Provider treeProvider, - Provider datasinkDaoProvider + Provider datasinkDaoProvider, + Provider enterpriseServiceProvider ) { this.hookHandler = hookHandler; this.treeProvider = treeProvider; this.datasinkTreeManager = datasinkTreeManager; this.datasinkDaoProvider = datasinkDaoProvider; + this.enterpriseServiceProvider = enterpriseServiceProvider; } @Override public void getMenuEntry(Menu menu, ReportDto report, ReportExecutorInformation info, ReportExecutorMainPanel mainPanel) { - datasinkDaoProvider.get().getStorageEnabledConfigs(new AsyncCallback>() { - - @Override - public void onSuccess(Map result) { - // item is only added if enabled in configuration - if (result.get(StorageType.LOCALFILESYSTEM)) { - MenuItem item = new DwMenuItem(DatasinksMessages.INSTANCE.localFileSystem(), BaseIcon.SERVER); - menu.add(item); - item.addSelectionHandler(event -> displayExportDialog(report, info, mainPanel.getViewConfigs())); + if (enterpriseServiceProvider.get().isEnterprise()) { + datasinkDaoProvider.get().getStorageEnabledConfigs(new AsyncCallback>() { + + @Override + public void onSuccess(Map result) { + // item is only added if enabled in configuration + if (result.get(StorageType.LOCALFILESYSTEM)) { + MenuItem item = new DwMenuItem(DatasinksMessages.INSTANCE.localFileSystem(), BaseIcon.SERVER); + menu.add(item); + item.addSelectionHandler(event -> displayExportDialog(report, info, mainPanel.getViewConfigs())); + } } - } - - @Override - public void onFailure(Throwable caught) { - } - }); - + + @Override + public void onFailure(Throwable caught) { + } + }); + } else { + // we add item but disable it + MenuItem item = new DwMenuItem(DatasinksMessages.INSTANCE.localFileSystem(), BaseIcon.SERVER); + menu.add(item); + item.disable(); + } } protected void displayExportDialog(final ReportDto report, final ReportExecutorInformation info, diff --git a/src/net/datenwerke/rs/localfsdatasink/client/localfsdatasink/hookers/LocalFileSystemDatasinkConfigProviderHooker.java b/src/net/datenwerke/rs/localfsdatasink/client/localfsdatasink/hookers/LocalFileSystemDatasinkConfigProviderHooker.java index c621b068c..0f2703cda 100644 --- a/src/net/datenwerke/rs/localfsdatasink/client/localfsdatasink/hookers/LocalFileSystemDatasinkConfigProviderHooker.java +++ b/src/net/datenwerke/rs/localfsdatasink/client/localfsdatasink/hookers/LocalFileSystemDatasinkConfigProviderHooker.java @@ -12,6 +12,7 @@ import net.datenwerke.rs.core.client.datasinkmanager.dto.DatasinkDefinitionDto; import net.datenwerke.rs.core.client.datasinkmanager.hooks.DatasinkDefinitionConfigProviderHook; import net.datenwerke.rs.core.client.datasinkmanager.locale.DatasinksMessages; +import net.datenwerke.rs.enterprise.client.EnterpriseUiService; import net.datenwerke.rs.localfsdatasink.client.localfsdatasink.dto.LocalFileSystemDatasinkDto; import net.datenwerke.rs.localfsdatasink.client.localfsdatasink.ui.LocalFileSystemDatasinkForm; import net.datenwerke.rs.theme.client.icon.BaseIcon; @@ -19,13 +20,17 @@ public class LocalFileSystemDatasinkConfigProviderHooker implements DatasinkDefinitionConfigProviderHook { private final Provider formProvider; + private final Provider enterpriseServiceProvider; @Inject public LocalFileSystemDatasinkConfigProviderHooker( - Provider formProvider) { + Provider formProvider, + Provider enterpriseServiceProvider + ) { /* store objects */ this.formProvider = formProvider; + this.enterpriseServiceProvider = enterpriseServiceProvider; } @Override @@ -60,7 +65,7 @@ public ImageResource getDatasinkIcon() { @Override public boolean isAvailable() { - return true; + return enterpriseServiceProvider.get().isEnterprise(); } } \ No newline at end of file diff --git a/src/net/datenwerke/rs/localfsdatasink/client/localfsdatasink/hookers/LocalFileSystemDataSinkTesterToolbarConfigurator.java b/src/net/datenwerke/rs/localfsdatasink/client/localfsdatasink/hookers/LocalFileSystemDatasinkTesterToolbarConfigurator.java similarity index 93% rename from src/net/datenwerke/rs/localfsdatasink/client/localfsdatasink/hookers/LocalFileSystemDataSinkTesterToolbarConfigurator.java rename to src/net/datenwerke/rs/localfsdatasink/client/localfsdatasink/hookers/LocalFileSystemDatasinkTesterToolbarConfigurator.java index 3aa7b3c61..4849d4a7a 100644 --- a/src/net/datenwerke/rs/localfsdatasink/client/localfsdatasink/hookers/LocalFileSystemDataSinkTesterToolbarConfigurator.java +++ b/src/net/datenwerke/rs/localfsdatasink/client/localfsdatasink/hookers/LocalFileSystemDatasinkTesterToolbarConfigurator.java @@ -19,7 +19,7 @@ import net.datenwerke.rs.theme.client.icon.BaseIcon; import net.datenwerke.treedb.client.treedb.dto.AbstractNodeDto; -public class LocalFileSystemDataSinkTesterToolbarConfigurator implements MainPanelViewToolbarConfiguratorHook { +public class LocalFileSystemDatasinkTesterToolbarConfigurator implements MainPanelViewToolbarConfiguratorHook { final DatasinksMessages messages = GWT.create(DatasinksMessages.class); @@ -27,7 +27,7 @@ public class LocalFileSystemDataSinkTesterToolbarConfigurator implements MainPan private final LocalFileSystemDao localFileSystemDao; @Inject - public LocalFileSystemDataSinkTesterToolbarConfigurator(ToolbarService toolbarUtils, + public LocalFileSystemDatasinkTesterToolbarConfigurator(ToolbarService toolbarUtils, LocalFileSystemDao localFileSystemDao) { this.toolbarUtils = toolbarUtils; this.localFileSystemDao = localFileSystemDao; @@ -47,7 +47,7 @@ public void mainPanelViewToolbarConfiguratorHook_addLeft(MainPanelView view, Too messages.testFailed(), messages.success(), messages.testSuccess(), messages.pleaseWait(), messages.testingTitle(), messages.testingProgressMessage()) { }; - Request request = localFileSystemDao.testLocalFileSystemDataSink((LocalFileSystemDatasinkDto) selectedNode, + Request request = localFileSystemDao.testLocalFileSystemDatasink((LocalFileSystemDatasinkDto) selectedNode, new TimeoutCallback(120000, callback)); callback.setRequest(request); }); diff --git a/src/net/datenwerke/rs/localfsdatasink/client/localfsdatasink/rpc/LocalFileSystemRpcService.java b/src/net/datenwerke/rs/localfsdatasink/client/localfsdatasink/rpc/LocalFileSystemRpcService.java index 24727edf6..a77a1cb07 100644 --- a/src/net/datenwerke/rs/localfsdatasink/client/localfsdatasink/rpc/LocalFileSystemRpcService.java +++ b/src/net/datenwerke/rs/localfsdatasink/client/localfsdatasink/rpc/LocalFileSystemRpcService.java @@ -22,7 +22,7 @@ void exportIntoLocalFileSystem(ReportDto reportDto, String executorToken, Map getStorageEnabledConfigs() throws ServerCallFailedException; - boolean testLocalFileSystemDataSink(LocalFileSystemDatasinkDto localFileSystemDatasinkDto) + boolean testLocalFileSystemDatasink(LocalFileSystemDatasinkDto localFileSystemDatasinkDto) throws ServerCallFailedException; DatasinkDefinitionDto getDefaultDatasink() throws ServerCallFailedException; diff --git a/src/net/datenwerke/rs/localfsdatasink/client/localfsdatasink/rpc/LocalFileSystemRpcServiceAsync.java b/src/net/datenwerke/rs/localfsdatasink/client/localfsdatasink/rpc/LocalFileSystemRpcServiceAsync.java index f7d2c1e30..41deaa79d 100644 --- a/src/net/datenwerke/rs/localfsdatasink/client/localfsdatasink/rpc/LocalFileSystemRpcServiceAsync.java +++ b/src/net/datenwerke/rs/localfsdatasink/client/localfsdatasink/rpc/LocalFileSystemRpcServiceAsync.java @@ -19,7 +19,7 @@ void exportIntoLocalFileSystem(ReportDto reportDto, String executorToken, void getStorageEnabledConfigs(AsyncCallback> callback); - Request testLocalFileSystemDataSink(LocalFileSystemDatasinkDto ftpDatasinkDto, AsyncCallback callback); + Request testLocalFileSystemDatasink(LocalFileSystemDatasinkDto ftpDatasinkDto, AsyncCallback callback); void getDefaultDatasink(AsyncCallback callback); } \ No newline at end of file diff --git a/src/net/datenwerke/rs/localfsdatasink/server/localfsdatasink/LocalFileSystemRpcServiceImpl.java b/src/net/datenwerke/rs/localfsdatasink/server/localfsdatasink/LocalFileSystemRpcServiceImpl.java index d5cdbd2b4..7ca71c38c 100644 --- a/src/net/datenwerke/rs/localfsdatasink/server/localfsdatasink/LocalFileSystemRpcServiceImpl.java +++ b/src/net/datenwerke/rs/localfsdatasink/server/localfsdatasink/LocalFileSystemRpcServiceImpl.java @@ -134,7 +134,7 @@ public Map getStorageEnabledConfigs() throws ServerCallFai } @Override - public boolean testLocalFileSystemDataSink(LocalFileSystemDatasinkDto localFileSystemDatasinkDto) + public boolean testLocalFileSystemDatasink(LocalFileSystemDatasinkDto localFileSystemDatasinkDto) throws ServerCallFailedException { LocalFileSystemDatasink localFileSystemDatasink = (LocalFileSystemDatasink) dtoService.loadPoso(localFileSystemDatasinkDto); @@ -142,7 +142,7 @@ public boolean testLocalFileSystemDataSink(LocalFileSystemDatasinkDto localFileS securityService.assertRights(localFileSystemDatasink, Read.class, Execute.class); try { - localFileSystemService.testLocalFileSystemDataSink(localFileSystemDatasink); + localFileSystemService.testLocalFileSystemDatasink(localFileSystemDatasink); } catch(Exception e){ DatasinkTestFailedException ex = new DatasinkTestFailedException(e.getMessage(),e); ex.setStackTraceAsString(exceptionServices.exceptionToString(e)); diff --git a/src/net/datenwerke/rs/localfsdatasink/service/localfsdatasink/DummyLocalFileSystemServiceImpl.java b/src/net/datenwerke/rs/localfsdatasink/service/localfsdatasink/DummyLocalFileSystemServiceImpl.java new file mode 100644 index 000000000..ac77eb22b --- /dev/null +++ b/src/net/datenwerke/rs/localfsdatasink/service/localfsdatasink/DummyLocalFileSystemServiceImpl.java @@ -0,0 +1,44 @@ +package net.datenwerke.rs.localfsdatasink.service.localfsdatasink; + +import java.io.IOException; +import java.util.Collections; +import java.util.Map; +import java.util.Optional; + +import net.datenwerke.rs.localfsdatasink.service.localfsdatasink.definitions.LocalFileSystemDatasink; +import net.datenwerke.rs.scheduleasfile.client.scheduleasfile.StorageType; + +public class DummyLocalFileSystemServiceImpl implements LocalFileSystemService { + + @Override + public void sendToLocalFileSystem(Object report, LocalFileSystemDatasink localFileSystemDatasink, String filename, + String folder) throws IOException { + + } + + @Override + public Map getLocalFileSystemEnabledConfigs() { + return Collections.emptyMap(); + } + + @Override + public boolean isLocalFileSystemEnabled() { + return false; + } + + @Override + public boolean isLocalFileSystemSchedulingEnabled() { + return false; + } + + @Override + public void testLocalFileSystemDatasink(LocalFileSystemDatasink localFileSystemDatasink) throws IOException { + + } + + @Override + public Optional getDefaultDatasink() { + return null; + } + +} \ No newline at end of file diff --git a/src/net/datenwerke/rs/localfsdatasink/service/localfsdatasink/LocalFileSystemModule.java b/src/net/datenwerke/rs/localfsdatasink/service/localfsdatasink/LocalFileSystemModule.java index 53b340d40..b8c127e03 100644 --- a/src/net/datenwerke/rs/localfsdatasink/service/localfsdatasink/LocalFileSystemModule.java +++ b/src/net/datenwerke/rs/localfsdatasink/service/localfsdatasink/LocalFileSystemModule.java @@ -28,7 +28,6 @@ public class LocalFileSystemModule extends AbstractModule { @Override protected void configure() { - bind(LocalFileSystemService.class).to(LocalFileSystemServiceImpl.class); requestStaticInjection(LocalFileSystemDatasink.class); bind(LocalFileSystemStartup.class).asEagerSingleton(); diff --git a/src/net/datenwerke/rs/localfsdatasink/service/localfsdatasink/LocalFileSystemService.java b/src/net/datenwerke/rs/localfsdatasink/service/localfsdatasink/LocalFileSystemService.java index 97c5513f9..d103b39a1 100644 --- a/src/net/datenwerke/rs/localfsdatasink/service/localfsdatasink/LocalFileSystemService.java +++ b/src/net/datenwerke/rs/localfsdatasink/service/localfsdatasink/LocalFileSystemService.java @@ -4,9 +4,12 @@ import java.util.Map; import java.util.Optional; +import com.google.inject.ImplementedBy; + import net.datenwerke.rs.localfsdatasink.service.localfsdatasink.definitions.LocalFileSystemDatasink; import net.datenwerke.rs.scheduleasfile.client.scheduleasfile.StorageType; +@ImplementedBy(DummyLocalFileSystemServiceImpl.class) public interface LocalFileSystemService { /** @@ -63,7 +66,7 @@ void sendToLocalFileSystem(Object report, LocalFileSystemDatasink localFileSyste * * @throws IOException if an I/O error occurs */ - void testLocalFileSystemDataSink(LocalFileSystemDatasink localFileSystemDatasink) throws IOException; + void testLocalFileSystemDatasink(LocalFileSystemDatasink localFileSystemDatasink) throws IOException; Optional getDefaultDatasink(); diff --git a/src/net/datenwerke/rs/localfsdatasink/service/localfsdatasink/LocalFileSystemServiceImpl.java b/src/net/datenwerke/rs/localfsdatasink/service/localfsdatasink/LocalFileSystemServiceImpl.java deleted file mode 100644 index 487adf941..000000000 --- a/src/net/datenwerke/rs/localfsdatasink/service/localfsdatasink/LocalFileSystemServiceImpl.java +++ /dev/null @@ -1,119 +0,0 @@ -package net.datenwerke.rs.localfsdatasink.service.localfsdatasink; - -import static net.datenwerke.rs.localfsdatasink.service.localfsdatasink.LocalFileSystemModule.PROPERTY_LOCAL_FILESYSTEM_DISABLED; -import static net.datenwerke.rs.localfsdatasink.service.localfsdatasink.LocalFileSystemModule.PROPERTY_LOCAL_FILESYSTEM_SCHEDULING_ENABLED; - -import java.io.IOException; -import java.io.InputStream; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.Paths; -import java.nio.file.StandardCopyOption; -import java.text.SimpleDateFormat; -import java.util.Calendar; -import java.util.Map; -import java.util.Objects; -import java.util.Optional; - -import javax.inject.Inject; -import javax.inject.Provider; - -import net.datenwerke.rs.core.service.datasinkmanager.DatasinkService; -import net.datenwerke.rs.core.service.reportmanager.ReportService; -import net.datenwerke.rs.localfsdatasink.service.localfsdatasink.annotations.DefaultLocalFileSystemDatasink; -import net.datenwerke.rs.localfsdatasink.service.localfsdatasink.definitions.LocalFileSystemDatasink; -import net.datenwerke.rs.scheduleasfile.client.scheduleasfile.StorageType; - -public class LocalFileSystemServiceImpl implements LocalFileSystemService { - - public static final int DEFAULT_BUFFER_SIZE = 8192; - - private final Provider reportServiceProvider; - private final Provider datasinkServiceProvider; - - private final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); - - private final Provider> defaultDatasinkProvider; - - @Inject - public LocalFileSystemServiceImpl( - Provider reportServiceProvider, - Provider datasinkServiceProvider, - @DefaultLocalFileSystemDatasink Provider> defaultDatasinkProvider - ) { - this.reportServiceProvider = reportServiceProvider; - this.defaultDatasinkProvider = defaultDatasinkProvider; - this.datasinkServiceProvider = datasinkServiceProvider; - } - - @Override - public void sendToLocalFileSystem(Object report, LocalFileSystemDatasink localFileSystemDatasink, String filename, - String folder) throws IOException { - if (!isLocalFileSystemEnabled()) - throw new IllegalStateException("Local file system datasink is disabled"); - - Objects.requireNonNull(localFileSystemDatasink, "LocalFileSystemDatasink is null!"); - Objects.requireNonNull(folder); - Objects.requireNonNull(filename); - - final String path = Objects.requireNonNull(localFileSystemDatasink.getPath()); - - if (null == path || path.trim().contentEquals("")) - throw new IllegalArgumentException("Local file system is not configured correctly"); - - Path baseDir = Paths.get(path); - Path dir = Paths.get(path, folder); - - if (!Files.exists(baseDir)) - throw new IllegalArgumentException("Specified directory does not exist"); - - if (!Files.isDirectory(baseDir)) - throw new IllegalArgumentException("You must specify a directory"); - - if (!Files.isWritable(baseDir)) - throw new IllegalArgumentException("Cannot write into specified directory"); - - if (!Files.exists(dir)) - Files.createDirectories(dir); - - try (InputStream is = reportServiceProvider.get().createInputStream(report)) { - Path file = dir.resolve(filename); - Files.copy(is, file, StandardCopyOption.REPLACE_EXISTING); - } - - } - - @Override - public Map getLocalFileSystemEnabledConfigs() { - return datasinkServiceProvider.get().getEnabledConfigs(StorageType.LOCALFILESYSTEM, PROPERTY_LOCAL_FILESYSTEM_DISABLED, - StorageType.LOCALFILESYSTEM_SCHEDULING, PROPERTY_LOCAL_FILESYSTEM_SCHEDULING_ENABLED); - } - - @Override - public boolean isLocalFileSystemEnabled() { - return datasinkServiceProvider.get().isEnabled(PROPERTY_LOCAL_FILESYSTEM_DISABLED); - } - - @Override - public boolean isLocalFileSystemSchedulingEnabled() { - return datasinkServiceProvider.get().isSchedulingEnabled(PROPERTY_LOCAL_FILESYSTEM_SCHEDULING_ENABLED); - } - - @Override - public void testLocalFileSystemDataSink(LocalFileSystemDatasink localFileSystemDatasink) throws IOException { - if (!isLocalFileSystemEnabled()) - throw new IllegalStateException("Local file system datasink is disabled"); - - sendToLocalFileSystem( - "ReportServer Local Filesystem Datasink Test " + dateFormat.format(Calendar.getInstance().getTime()), - localFileSystemDatasink, "reportserver-local-fs-test.txt", - localFileSystemDatasink.getFolder()); - - } - - @Override - public Optional getDefaultDatasink() { - return defaultDatasinkProvider.get(); - } - -} \ No newline at end of file diff --git a/src/net/datenwerke/rs/oauth/service/oauth/DummyOAuthenticationServiceImpl.java b/src/net/datenwerke/rs/oauth/service/oauth/DummyOAuthenticationServiceImpl.java new file mode 100644 index 000000000..2b1998ef8 --- /dev/null +++ b/src/net/datenwerke/rs/oauth/service/oauth/DummyOAuthenticationServiceImpl.java @@ -0,0 +1,23 @@ +package net.datenwerke.rs.oauth.service.oauth; + +import java.io.IOException; +import java.util.concurrent.ExecutionException; + +public class DummyOAuthenticationServiceImpl implements OAuthAuthenticationService { + + @Override + public void generateRefreshToken(String authenticationCode, OAuthAuthenticatable oAuthDatasink, String redirectUri) + throws IOException, InterruptedException, ExecutionException { + } + + @Override + public String generateAuthenticationUrl(OAuthAuthenticatable oAuthDatasink) { + return null; + } + + @Override + public String getRedirectUri() { + return null; + } + +} diff --git a/src/net/datenwerke/rs/oauth/service/oauth/OAuthAuthenticationService.java b/src/net/datenwerke/rs/oauth/service/oauth/OAuthAuthenticationService.java index 696602da0..20d9ca5b3 100644 --- a/src/net/datenwerke/rs/oauth/service/oauth/OAuthAuthenticationService.java +++ b/src/net/datenwerke/rs/oauth/service/oauth/OAuthAuthenticationService.java @@ -3,6 +3,9 @@ import java.io.IOException; import java.util.concurrent.ExecutionException; +import com.google.inject.ImplementedBy; + +@ImplementedBy(DummyOAuthenticationServiceImpl.class) public interface OAuthAuthenticationService { /** diff --git a/src/net/datenwerke/rs/oauth/service/oauth/OAuthAuthenticationServiceImpl.java b/src/net/datenwerke/rs/oauth/service/oauth/OAuthAuthenticationServiceImpl.java deleted file mode 100644 index 77ee81c19..000000000 --- a/src/net/datenwerke/rs/oauth/service/oauth/OAuthAuthenticationServiceImpl.java +++ /dev/null @@ -1,87 +0,0 @@ -package net.datenwerke.rs.oauth.service.oauth; - -import java.io.IOException; -import java.util.Objects; -import java.util.concurrent.ExecutionException; - -import javax.inject.Provider; - -import com.github.scribejava.core.builder.ServiceBuilder; -import com.github.scribejava.core.model.OAuth2AccessToken; -import com.github.scribejava.core.oauth.OAuth20Service; -import com.google.inject.Inject; -import com.google.inject.persist.Transactional; - -import net.datenwerke.gf.service.history.HistoryService; -import net.datenwerke.rs.core.service.datasinkmanager.DatasinkService; -import net.datenwerke.rs.core.service.datasinkmanager.entities.AbstractDatasinkManagerNode; -import net.datenwerke.rs.core.service.reportserver.ServerInfoContainer; - -public class OAuthAuthenticationServiceImpl implements OAuthAuthenticationService { - - private final Provider datasinkServiceProvider; - private final Provider serverInfoProvider; - - @Inject - public OAuthAuthenticationServiceImpl( - Provider datasinkServiceProvider, - Provider historyServiceProvider, - Provider serverInfoProvider - ) { - this.datasinkServiceProvider = datasinkServiceProvider; - this.serverInfoProvider = serverInfoProvider; - } - - @Override - @Transactional(rollbackOn = { Exception.class }) - public void generateRefreshToken(String authenticationCode, OAuthAuthenticatable oAuthDatasink, - String redirectUri) throws IOException, ExecutionException, InterruptedException { - Objects.requireNonNull(oAuthDatasink, "Datasink is null"); - Objects.requireNonNull(oAuthDatasink, "authentication code is null"); - - String appKey = oAuthDatasink.getAppKey(); - String secretKey = oAuthDatasink.getSecretKey(); - - if (null == appKey || appKey.trim().contentEquals("") || null == secretKey || secretKey.trim().contentEquals("")) - throw new IllegalArgumentException("Datasink is not configured correctly"); - - final OAuth20Service oauthService = buildOAuthService(oAuthDatasink); - - // get access token and refresh token - OAuth2AccessToken accessToken = oauthService.getAccessToken(authenticationCode); - oAuthDatasink.setRefreshToken(accessToken.getRefreshToken()); - - datasinkServiceProvider.get().merge((AbstractDatasinkManagerNode) oAuthDatasink); - - } - - @Override - public String generateAuthenticationUrl(OAuthAuthenticatable oAuthDatasink) { - final OAuth20Service oauthService = buildOAuthService(oAuthDatasink); - - final String authUrl = oAuthDatasink.buildAuthorizationUrl(oauthService - .createAuthorizationUrlBuilder() - .state("{\"datasinkId\":" + oAuthDatasink.getId() + "}") - ); - - return authUrl; - } - - private OAuth20Service buildOAuthService(OAuthAuthenticatable oAuthDatasink) { - String appKey = oAuthDatasink.getAppKey(); - String secretKey = oAuthDatasink.getSecretKey(); - - return new ServiceBuilder(appKey) - .apiSecret(secretKey) -// .debug() - .callback(getRedirectUri()) - .build(oAuthDatasink.getOAuthApi()); - } - - @Override - public String getRedirectUri() { - ServerInfoContainer serverInfo = serverInfoProvider.get(); - return serverInfo.getBaseURL() + "/oauth"; - } - -} \ No newline at end of file diff --git a/src/net/datenwerke/rs/oauth/service/oauth/OAuthModule.java b/src/net/datenwerke/rs/oauth/service/oauth/OAuthModule.java deleted file mode 100644 index 35fd09519..000000000 --- a/src/net/datenwerke/rs/oauth/service/oauth/OAuthModule.java +++ /dev/null @@ -1,12 +0,0 @@ -package net.datenwerke.rs.oauth.service.oauth; - -import com.google.inject.AbstractModule; - -public class OAuthModule extends AbstractModule { - - @Override - protected void configure() { - bind(OAuthAuthenticationService.class).to(OAuthAuthenticationServiceImpl.class); - } - -} \ No newline at end of file diff --git a/src/net/datenwerke/rs/onedrive/client/onedrive/hookers/ExportToOneDriveHooker.java b/src/net/datenwerke/rs/onedrive/client/onedrive/hookers/ExportToOneDriveHooker.java index 1f6394df6..3c234e162 100644 --- a/src/net/datenwerke/rs/onedrive/client/onedrive/hookers/ExportToOneDriveHooker.java +++ b/src/net/datenwerke/rs/onedrive/client/onedrive/hookers/ExportToOneDriveHooker.java @@ -43,53 +43,64 @@ import net.datenwerke.rs.core.client.reportexporter.hooks.ExportExternalEntryProviderHook; import net.datenwerke.rs.core.client.reportexporter.locale.ReportExporterMessages; import net.datenwerke.rs.core.client.reportmanager.dto.reports.ReportDto; +import net.datenwerke.rs.enterprise.client.EnterpriseUiService; import net.datenwerke.rs.eximport.client.eximport.locale.ExImportMessages; -import net.datenwerke.rs.scheduleasfile.client.scheduleasfile.StorageType; -import net.datenwerke.rs.scheduleasfile.client.scheduleasfile.locale.ScheduleAsFileMessages; -import net.datenwerke.rs.theme.client.icon.BaseIcon; - import net.datenwerke.rs.onedrive.client.onedrive.OneDriveDao; import net.datenwerke.rs.onedrive.client.onedrive.OneDriveUiModule; import net.datenwerke.rs.onedrive.client.onedrive.dto.OneDriveDatasinkDto; import net.datenwerke.rs.onedrive.client.onedrive.provider.annotations.DatasinkTreeOneDrive; +import net.datenwerke.rs.scheduleasfile.client.scheduleasfile.StorageType; +import net.datenwerke.rs.scheduleasfile.client.scheduleasfile.locale.ScheduleAsFileMessages; +import net.datenwerke.rs.theme.client.icon.BaseIcon; public class ExportToOneDriveHooker implements ExportExternalEntryProviderHook { private final HookHandlerService hookHandler; private final Provider treeProvider; private final DatasinkTreeManagerDao datasinkTreeManager; private final Provider datasinkDaoProvider; + + private final Provider enterpriseServiceProvider; @Inject public ExportToOneDriveHooker( HookHandlerService hookHandler, @DatasinkTreeOneDrive Provider treeProvider, DatasinkTreeManagerDao datasinkTreeManager, - Provider datasinkDaoProvider + Provider datasinkDaoProvider, + Provider enterpriseServiceProvider ) { this.hookHandler = hookHandler; this.treeProvider = treeProvider; this.datasinkTreeManager = datasinkTreeManager; this.datasinkDaoProvider = datasinkDaoProvider; + this.enterpriseServiceProvider = enterpriseServiceProvider; } @Override public void getMenuEntry(Menu menu, ReportDto report, ReportExecutorInformation info, ReportExecutorMainPanel mainPanel) { - datasinkDaoProvider.get().getStorageEnabledConfigs(new AsyncCallback>() { - - @Override - public void onSuccess(Map result) { - if (result.get(StorageType.ONEDRIVE)) { - MenuItem item = new DwMenuItem(OneDriveUiModule.ONE_DRIVE_NAME, BaseIcon.CLOUD_UPLOAD); - menu.add(item); - item.addSelectionHandler(event -> displayExportDialog(report, info, mainPanel.getViewConfigs())); + if (enterpriseServiceProvider.get().isEnterprise()) { + datasinkDaoProvider.get().getStorageEnabledConfigs(new AsyncCallback>() { + + @Override + public void onSuccess(Map result) { + if (result.get(StorageType.ONEDRIVE)) { + MenuItem item = new DwMenuItem(OneDriveUiModule.ONE_DRIVE_NAME, BaseIcon.CLOUD_UPLOAD); + menu.add(item); + item.addSelectionHandler(event -> displayExportDialog(report, info, mainPanel.getViewConfigs())); + } } - } - - @Override - public void onFailure(Throwable caught) { - } - }); + + @Override + public void onFailure(Throwable caught) { + } + }); + } else { + // we add item but disable it + MenuItem item = new DwMenuItem(OneDriveUiModule.ONE_DRIVE_NAME, BaseIcon.CLOUD_UPLOAD); + menu.add(item); + item.disable(); + } } diff --git a/src/net/datenwerke/rs/onedrive/client/onedrive/hookers/OneDriveDatasinkConfigProviderHooker.java b/src/net/datenwerke/rs/onedrive/client/onedrive/hookers/OneDriveDatasinkConfigProviderHooker.java index 0dc5a0d62..ae7f36268 100644 --- a/src/net/datenwerke/rs/onedrive/client/onedrive/hookers/OneDriveDatasinkConfigProviderHooker.java +++ b/src/net/datenwerke/rs/onedrive/client/onedrive/hookers/OneDriveDatasinkConfigProviderHooker.java @@ -11,6 +11,7 @@ import net.datenwerke.rs.core.client.datasinkmanager.dto.AbstractDatasinkManagerNodeDto; import net.datenwerke.rs.core.client.datasinkmanager.dto.DatasinkDefinitionDto; import net.datenwerke.rs.core.client.datasinkmanager.hooks.DatasinkDefinitionConfigProviderHook; +import net.datenwerke.rs.enterprise.client.EnterpriseUiService; import net.datenwerke.rs.onedrive.client.onedrive.OneDriveUiModule; import net.datenwerke.rs.onedrive.client.onedrive.dto.OneDriveDatasinkDto; import net.datenwerke.rs.onedrive.client.onedrive.ui.OneDriveDatasinkForm; @@ -18,12 +19,17 @@ public class OneDriveDatasinkConfigProviderHooker implements DatasinkDefinitionConfigProviderHook { private final Provider formProvider; + private final Provider enterpriseServiceProvider; @Inject - public OneDriveDatasinkConfigProviderHooker(Provider formProvider) { + public OneDriveDatasinkConfigProviderHooker( + Provider formProvider, + Provider enterpriseServiceProvider + ) { /* store objects */ this.formProvider = formProvider; + this.enterpriseServiceProvider = enterpriseServiceProvider; } @Override @@ -58,7 +64,7 @@ public ImageResource getDatasinkIcon() { @Override public boolean isAvailable() { - return true; + return enterpriseServiceProvider.get().isEnterprise(); } } \ No newline at end of file diff --git a/src/net/datenwerke/rs/onedrive/service/onedrive/DummyOneDriveServiceImpl.java b/src/net/datenwerke/rs/onedrive/service/onedrive/DummyOneDriveServiceImpl.java new file mode 100644 index 000000000..e7c680ba1 --- /dev/null +++ b/src/net/datenwerke/rs/onedrive/service/onedrive/DummyOneDriveServiceImpl.java @@ -0,0 +1,42 @@ +package net.datenwerke.rs.onedrive.service.onedrive; + +import java.io.IOException; +import java.util.Collections; +import java.util.Map; +import java.util.Optional; + +import net.datenwerke.rs.onedrive.service.onedrive.definitions.OneDriveDatasink; +import net.datenwerke.rs.scheduleasfile.client.scheduleasfile.StorageType; + +public class DummyOneDriveServiceImpl implements OneDriveService { + + @Override + public void exportIntoOneDrive(Object report, OneDriveDatasink oneDriveDatasink, String filename, String folder) + throws IOException { + } + + @Override + public Map getStorageEnabledConfigs() { + return Collections.emptyMap(); + } + + @Override + public boolean isOneDriveEnabled() { + return false; + } + + @Override + public boolean isOneDriveSchedulingEnabled() { + return false; + } + + @Override + public void testOneDriveDatasink(OneDriveDatasink OneDriveDatasink) throws IOException { + } + + @Override + public Optional getDefaultDatasink() { + return null; + } + +} \ No newline at end of file diff --git a/src/net/datenwerke/rs/onedrive/service/onedrive/OneDriveModule.java b/src/net/datenwerke/rs/onedrive/service/onedrive/OneDriveModule.java index 91690de70..d8d9b6bee 100644 --- a/src/net/datenwerke/rs/onedrive/service/onedrive/OneDriveModule.java +++ b/src/net/datenwerke/rs/onedrive/service/onedrive/OneDriveModule.java @@ -27,8 +27,6 @@ public class OneDriveModule extends AbstractModule { @Override protected void configure() { - bind(OneDriveService.class).to(OneDriveServiceImpl.class); - requestStaticInjection(OneDriveDatasink.class); bind(OneDriveStartup.class).asEagerSingleton(); diff --git a/src/net/datenwerke/rs/onedrive/service/onedrive/OneDriveService.java b/src/net/datenwerke/rs/onedrive/service/onedrive/OneDriveService.java index 775c4e9b6..eb2d1920f 100644 --- a/src/net/datenwerke/rs/onedrive/service/onedrive/OneDriveService.java +++ b/src/net/datenwerke/rs/onedrive/service/onedrive/OneDriveService.java @@ -1,13 +1,16 @@ package net.datenwerke.rs.onedrive.service.onedrive; -import net.datenwerke.rs.onedrive.service.onedrive.definitions.OneDriveDatasink; -import net.datenwerke.rs.scheduleasfile.client.scheduleasfile.StorageType; - import java.io.IOException; import java.util.Map; import java.util.Optional; import java.util.concurrent.ExecutionException; +import com.google.inject.ImplementedBy; + +import net.datenwerke.rs.onedrive.service.onedrive.definitions.OneDriveDatasink; +import net.datenwerke.rs.scheduleasfile.client.scheduleasfile.StorageType; + +@ImplementedBy(DummyOneDriveServiceImpl.class) public interface OneDriveService { /** * Sends a report to OneDrive, defined in a given {@link OneDriveDatasink} diff --git a/src/net/datenwerke/rs/onedrive/service/onedrive/OneDriveServiceImpl.java b/src/net/datenwerke/rs/onedrive/service/onedrive/OneDriveServiceImpl.java deleted file mode 100644 index d964954d4..000000000 --- a/src/net/datenwerke/rs/onedrive/service/onedrive/OneDriveServiceImpl.java +++ /dev/null @@ -1,188 +0,0 @@ -package net.datenwerke.rs.onedrive.service.onedrive; - -import static net.datenwerke.rs.onedrive.service.onedrive.OneDriveModule.PROPERTY_ONEDRIVE_DISABLED; -import static net.datenwerke.rs.onedrive.service.onedrive.OneDriveModule.PROPERTY_ONEDRIVE_SCHEDULING_ENABLED; - -import java.io.IOException; -import java.io.InputStream; -import java.text.SimpleDateFormat; -import java.util.Calendar; -import java.util.Map; -import java.util.Objects; -import java.util.Optional; -import java.util.concurrent.ExecutionException; - -import javax.inject.Inject; -import javax.inject.Provider; - -import org.apache.commons.io.IOUtils; -import org.json.JSONException; -import org.json.JSONObject; - -import com.github.scribejava.core.builder.ServiceBuilder; -import com.github.scribejava.core.model.OAuth2AccessToken; -import com.github.scribejava.core.model.OAuthRequest; -import com.github.scribejava.core.model.Response; -import com.github.scribejava.core.model.Verb; -import com.github.scribejava.core.oauth.OAuth20Service; -import com.google.gwt.safehtml.shared.UriUtils; - -import net.datenwerke.rs.core.service.datasinkmanager.DatasinkService; -import net.datenwerke.rs.core.service.reportmanager.ReportService; -import net.datenwerke.rs.onedrive.service.onedrive.annotations.DefaultOneDriveDatasink; -import net.datenwerke.rs.onedrive.service.onedrive.definitions.OneDriveDatasink; -import net.datenwerke.rs.scheduleasfile.client.scheduleasfile.StorageType; - -public class OneDriveServiceImpl implements OneDriveService { - private static final String UPLOAD_URL = "https://graph.microsoft.com/v1.0"; - - private final Provider reportServiceProvider; - - private final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); - - private final Provider> defaultDatasinkProvider; - private final Provider datasinkServiceProvider; - - @Inject - public OneDriveServiceImpl( - Provider reportServiceProvider, - Provider datasinkServiceProvider, - @DefaultOneDriveDatasink Provider> defaultDatasinkProvider - ) { - this.reportServiceProvider = reportServiceProvider; - this.defaultDatasinkProvider = defaultDatasinkProvider; - this.datasinkServiceProvider = datasinkServiceProvider; - } - - @Override - public void exportIntoOneDrive(Object report, OneDriveDatasink oneDriveDatasink, String filename, String folder) - throws IOException, InterruptedException, ExecutionException { - if (!isOneDriveEnabled()) - throw new IllegalStateException("OneDrive/SharePoint is disabled"); - - Objects.requireNonNull(oneDriveDatasink, "Datasink is null"); - Objects.requireNonNull(oneDriveDatasink.getTenantId(), "Tenant id is null"); - Objects.requireNonNull(oneDriveDatasink.getBaseRoot(), "Base root is null"); - - final String refreshToken = oneDriveDatasink.getRefreshToken(); - - Objects.requireNonNull(refreshToken, - "OneDrive - SharePoint (O365) authentication not configured, please setup by using the \"Datasink OAuth2 Authentication Setup\" button."); - - final OAuth20Service oauthService = new ServiceBuilder(oneDriveDatasink.getAppKey()) - .apiSecret(oneDriveDatasink.getSecretKey()) - .build(oneDriveDatasink.getOAuthApi()); - - OAuth2AccessToken accessToken = oauthService.refreshAccessToken(refreshToken); - - try (InputStream is = reportServiceProvider.get().createInputStream(report)) { - byte[] reportAsBytes = IOUtils.toByteArray(is); - int length = reportAsBytes.length; - // max = 4MB - if (length >= 4 * 1024 * 1024) - uploadLargeFile(oneDriveDatasink, folder, filename, reportAsBytes, accessToken, oauthService); - else - uploadSmallFile(oneDriveDatasink, folder, filename, reportAsBytes, accessToken, oauthService); - - } - } - - private String getUploadUrl(OneDriveDatasink datasink, String folder, String filename, String type) { - return UPLOAD_URL + datasink.getBaseRoot() - + UriUtils.encode((folder.endsWith("/") ? folder : folder + "/") + filename) + type; - } - - private void uploadSmallFile( - OneDriveDatasink datasink, String folder, String filename, byte[] reportAsBytes, OAuth2AccessToken accessToken, - OAuth20Service oauthService) throws IOException, InterruptedException, ExecutionException { - final OAuthRequest request = new OAuthRequest(Verb.PUT, getUploadUrl(datasink, folder, filename, ":/content")); - request.setPayload(reportAsBytes); - oauthService.signRequest(accessToken, request); - - try (Response response = oauthService.execute(request)) { - int responseCode = response.getCode(); - if (200 != responseCode && 201 != responseCode) - throw new IOException("Could not upload to OneDrive/SharePoint. Response code = " + responseCode - + ", response body = ['" + response.getBody() + "']"); - } - } - - private void uploadLargeFile(final OneDriveDatasink datasink, final String folder, final String filename, - final byte[] reportAsBytes, - final OAuth2AccessToken accessToken, OAuth20Service oauthService) - throws IOException, InterruptedException, ExecutionException { - // we first create an upload session and get the uploadUrl - OAuthRequest request = new OAuthRequest(Verb.PUT, getUploadUrl(datasink, folder, filename, ":/createUploadSession")); - request.setPayload( - "\"item\": {\"@odata.type\": \"microsoft.graph.driveItemUploadableProperties\", " + - "\"@microsoft.graph.conflictBehavior\": \"replace\", " + - "\"name\": \"" + filename + "\"" + - "}"); - oauthService.signRequest(accessToken, request); - - String uploadUrl = null; - - try (Response response = oauthService.execute(request)) { - int responseCode = response.getCode(); - if (200 != responseCode && 201 != responseCode) - throw new IOException("Could not upload to OneDrive/SharePoint. Response code = " + responseCode - + ", response body = ['" + response.getBody() + "']"); - String uploadUrlResponse = response.getBody(); - try { - JSONObject jsonObject = new JSONObject(uploadUrlResponse); - uploadUrl = jsonObject.getString("uploadUrl"); - - } catch (JSONException e) { - throw new IOException("Error while reading json parameter uploadUrl", e); - } - } - - Objects.requireNonNull(uploadUrl, "Upload url could not be read"); - - // we now upload the file - int uploadFileSize = reportAsBytes.length; - request = new OAuthRequest(Verb.PUT, uploadUrl); - request.addHeader("Content-Length", uploadFileSize + ""); - request.addHeader("Content-Range", "bytes 0-" + (uploadFileSize - 1) + "/" + uploadFileSize); - request.setPayload(reportAsBytes); - oauthService.signRequest(accessToken, request); - try (Response response = oauthService.execute(request)) { - int responseCode = response.getCode(); - if (200 != responseCode && 201 != responseCode) - throw new IOException("Could not upload to OneDrive/SharePoint. Response code = " + responseCode - + ", response body = ['" + response.getBody() + "']"); - } - } - - @Override - public Map getStorageEnabledConfigs() { - return datasinkServiceProvider.get().getEnabledConfigs(StorageType.ONEDRIVE, PROPERTY_ONEDRIVE_DISABLED, - StorageType.ONEDRIVE_SCHEDULING, PROPERTY_ONEDRIVE_SCHEDULING_ENABLED); - } - - @Override - public boolean isOneDriveEnabled() { - return datasinkServiceProvider.get().isEnabled(PROPERTY_ONEDRIVE_DISABLED); - } - - @Override - public boolean isOneDriveSchedulingEnabled() { - return datasinkServiceProvider.get().isSchedulingEnabled(PROPERTY_ONEDRIVE_SCHEDULING_ENABLED); - } - - @Override - public void testOneDriveDatasink(OneDriveDatasink oneDriveDatasink) - throws IOException, InterruptedException, ExecutionException { - if (!isOneDriveEnabled()) - throw new IllegalStateException("OneDrive - SharePoint (O365) datasink is disabled"); - exportIntoOneDrive("ReportServer OneDrive - SharePoint (O365) Datasink Test " + dateFormat.format(Calendar.getInstance().getTime()), - oneDriveDatasink, "reportserver-onedrive-sharepoint-test.txt", oneDriveDatasink.getFolder()); - - } - - @Override - public Optional getDefaultDatasink() { - return defaultDatasinkProvider.get(); - } - -} \ No newline at end of file diff --git a/src/net/datenwerke/rs/samba/client/samba/SambaDao.java b/src/net/datenwerke/rs/samba/client/samba/SambaDao.java index c072b6d2e..9a90c8bf0 100644 --- a/src/net/datenwerke/rs/samba/client/samba/SambaDao.java +++ b/src/net/datenwerke/rs/samba/client/samba/SambaDao.java @@ -36,8 +36,8 @@ public void getSambaEnabledConfigs(AsyncCallback> callb rpcService.getSambaEnabledConfigs(transformAndKeepCallback(callback)); } - public Request testSambaDataSink(SambaDatasinkDto sambaDatasinkDto, AsyncCallback callback) { - return rpcService.testSambaDataSink(sambaDatasinkDto, transformAndKeepCallback(callback)); + public Request testSambaDatasink(SambaDatasinkDto sambaDatasinkDto, AsyncCallback callback) { + return rpcService.testSambaDatasink(sambaDatasinkDto, transformAndKeepCallback(callback)); } @Override diff --git a/src/net/datenwerke/rs/samba/client/samba/SambaUiStartup.java b/src/net/datenwerke/rs/samba/client/samba/SambaUiStartup.java index 2a10b6a46..4949663c1 100644 --- a/src/net/datenwerke/rs/samba/client/samba/SambaUiStartup.java +++ b/src/net/datenwerke/rs/samba/client/samba/SambaUiStartup.java @@ -13,7 +13,7 @@ import net.datenwerke.rs.core.client.datasinkmanager.hooks.DatasinkDefinitionConfigProviderHook; import net.datenwerke.rs.core.client.reportexporter.hooks.ExportExternalEntryProviderHook; import net.datenwerke.rs.samba.client.samba.hookers.ExportToSambaHooker; -import net.datenwerke.rs.samba.client.samba.hookers.SambaDataSinkTesterToolbarConfigurator; +import net.datenwerke.rs.samba.client.samba.hookers.SambaDatasinkTesterToolbarConfigurator; import net.datenwerke.rs.samba.client.samba.hookers.SambaDatasinkConfigProviderHooker; import net.datenwerke.rs.samba.client.samba.hookers.SambaExportSnippetProvider; import net.datenwerke.rs.scheduleasfile.client.scheduleasfile.StorageType; @@ -29,7 +29,7 @@ public SambaUiStartup( final Provider sambaTreeConfiguratorProvider, final WaitOnEventUIService waitOnEventService, final SambaDao dao, - final SambaDataSinkTesterToolbarConfigurator sambaTestToolbarConfigurator + final SambaDatasinkTesterToolbarConfigurator sambaTestToolbarConfigurator ) { /* config tree */ diff --git a/src/net/datenwerke/rs/samba/client/samba/hookers/ExportToSambaHooker.java b/src/net/datenwerke/rs/samba/client/samba/hookers/ExportToSambaHooker.java index 27c4bb77a..02c8617c4 100644 --- a/src/net/datenwerke/rs/samba/client/samba/hookers/ExportToSambaHooker.java +++ b/src/net/datenwerke/rs/samba/client/samba/hookers/ExportToSambaHooker.java @@ -43,6 +43,7 @@ import net.datenwerke.rs.core.client.reportexporter.hooks.ExportExternalEntryProviderHook; import net.datenwerke.rs.core.client.reportexporter.locale.ReportExporterMessages; import net.datenwerke.rs.core.client.reportmanager.dto.reports.ReportDto; +import net.datenwerke.rs.enterprise.client.EnterpriseUiService; import net.datenwerke.rs.eximport.client.eximport.locale.ExImportMessages; import net.datenwerke.rs.samba.client.samba.SambaDao; import net.datenwerke.rs.samba.client.samba.dto.SambaDatasinkDto; @@ -59,39 +60,50 @@ public class ExportToSambaHooker implements ExportExternalEntryProviderHook { private final Provider datasinkDaoProvider; private final DatasinkTreeManagerDao datasinkTreeManager; + private final Provider enterpriseServiceProvider; + @Inject public ExportToSambaHooker( HookHandlerService hookHandler, DatasinkTreeManagerDao datasinkTreeManager, @DatasinkTreeSamba Provider treeProvider, - Provider datasinkDaoProvider + Provider datasinkDaoProvider, + Provider enterpriseServiceProvider ) { this.hookHandler = hookHandler; this.treeProvider = treeProvider; this.datasinkTreeManager = datasinkTreeManager; this.datasinkDaoProvider = datasinkDaoProvider; + this.enterpriseServiceProvider = enterpriseServiceProvider; } @Override public void getMenuEntry(final Menu menu, final ReportDto report, final ReportExecutorInformation info, final ReportExecutorMainPanel mainPanel) { - datasinkDaoProvider.get().getSambaEnabledConfigs(new AsyncCallback>() { - - @Override - public void onSuccess(Map result) { - // item is only added if enabled in configuration - if (result.get(StorageType.SAMBA)) { - MenuItem item = new DwMenuItem("Samba - SMB/CIFS", BaseIcon.ANGLE_DOUBLE_UP); - menu.add(item); - item.addSelectionHandler(event -> displayExportDialog(report, info, mainPanel.getViewConfigs())); + if (enterpriseServiceProvider.get().isEnterprise()) { + datasinkDaoProvider.get().getSambaEnabledConfigs(new AsyncCallback>() { + + @Override + public void onSuccess(Map result) { + // item is only added if enabled in configuration + if (result.get(StorageType.SAMBA)) { + MenuItem item = new DwMenuItem("Samba - SMB/CIFS", BaseIcon.ANGLE_DOUBLE_UP); + menu.add(item); + item.addSelectionHandler(event -> displayExportDialog(report, info, mainPanel.getViewConfigs())); + } } - } - - @Override - public void onFailure(Throwable caught) { - } - }); + + @Override + public void onFailure(Throwable caught) { + } + }); + } else { + // we add item but disable it + MenuItem item = new DwMenuItem("Samba - SMB/CIFS", BaseIcon.ANGLE_DOUBLE_UP); + menu.add(item); + item.disable(); + } } protected void displayExportDialog(final ReportDto report, final ReportExecutorInformation info, diff --git a/src/net/datenwerke/rs/samba/client/samba/hookers/SambaDatasinkConfigProviderHooker.java b/src/net/datenwerke/rs/samba/client/samba/hookers/SambaDatasinkConfigProviderHooker.java index 3188a54fd..6f9293e7b 100644 --- a/src/net/datenwerke/rs/samba/client/samba/hookers/SambaDatasinkConfigProviderHooker.java +++ b/src/net/datenwerke/rs/samba/client/samba/hookers/SambaDatasinkConfigProviderHooker.java @@ -11,6 +11,7 @@ import net.datenwerke.rs.core.client.datasinkmanager.dto.AbstractDatasinkManagerNodeDto; import net.datenwerke.rs.core.client.datasinkmanager.dto.DatasinkDefinitionDto; import net.datenwerke.rs.core.client.datasinkmanager.hooks.DatasinkDefinitionConfigProviderHook; +import net.datenwerke.rs.enterprise.client.EnterpriseUiService; import net.datenwerke.rs.samba.client.samba.dto.SambaDatasinkDto; import net.datenwerke.rs.samba.client.samba.ui.SambaDatasinkForm; import net.datenwerke.rs.theme.client.icon.BaseIcon; @@ -20,13 +21,17 @@ public class SambaDatasinkConfigProviderHooker implements private final Provider formProvider; + private final Provider enterpriseServiceProvider; + @Inject public SambaDatasinkConfigProviderHooker( - Provider formProvider + Provider formProvider, + Provider enterpriseServiceProvider ){ /* store objects */ this.formProvider = formProvider; + this.enterpriseServiceProvider = enterpriseServiceProvider; } @Override @@ -62,6 +67,6 @@ public ImageResource getDatasinkIcon() { @Override public boolean isAvailable() { - return true; + return enterpriseServiceProvider.get().isEnterprise(); } } \ No newline at end of file diff --git a/src/net/datenwerke/rs/samba/client/samba/hookers/SambaDataSinkTesterToolbarConfigurator.java b/src/net/datenwerke/rs/samba/client/samba/hookers/SambaDatasinkTesterToolbarConfigurator.java similarity index 93% rename from src/net/datenwerke/rs/samba/client/samba/hookers/SambaDataSinkTesterToolbarConfigurator.java rename to src/net/datenwerke/rs/samba/client/samba/hookers/SambaDatasinkTesterToolbarConfigurator.java index 79924520c..d0a120fa7 100644 --- a/src/net/datenwerke/rs/samba/client/samba/hookers/SambaDataSinkTesterToolbarConfigurator.java +++ b/src/net/datenwerke/rs/samba/client/samba/hookers/SambaDatasinkTesterToolbarConfigurator.java @@ -19,7 +19,7 @@ import net.datenwerke.rs.theme.client.icon.BaseIcon; import net.datenwerke.treedb.client.treedb.dto.AbstractNodeDto; -public class SambaDataSinkTesterToolbarConfigurator implements MainPanelViewToolbarConfiguratorHook { +public class SambaDatasinkTesterToolbarConfigurator implements MainPanelViewToolbarConfiguratorHook { final DatasinksMessages messages = GWT.create(DatasinksMessages.class); @@ -27,7 +27,7 @@ public class SambaDataSinkTesterToolbarConfigurator implements MainPanelViewTool private final SambaDao sambaDao; @Inject - public SambaDataSinkTesterToolbarConfigurator(ToolbarService toolbarUtils, SambaDao SambaDao) { + public SambaDatasinkTesterToolbarConfigurator(ToolbarService toolbarUtils, SambaDao SambaDao) { this.toolbarUtils = toolbarUtils; this.sambaDao = SambaDao; } @@ -46,7 +46,7 @@ public void mainPanelViewToolbarConfiguratorHook_addLeft(MainPanelView view, Too messages.testFailed(), messages.success(), messages.testSuccess(), messages.pleaseWait(), messages.testingTitle(), messages.testingProgressMessage()) { }; - Request request = sambaDao.testSambaDataSink((SambaDatasinkDto) selectedNode, + Request request = sambaDao.testSambaDatasink((SambaDatasinkDto) selectedNode, new TimeoutCallback(120000, callback)); callback.setRequest(request); }); diff --git a/src/net/datenwerke/rs/samba/client/samba/rpc/SambaRpcService.java b/src/net/datenwerke/rs/samba/client/samba/rpc/SambaRpcService.java index b0e74f2f7..2272fd67c 100644 --- a/src/net/datenwerke/rs/samba/client/samba/rpc/SambaRpcService.java +++ b/src/net/datenwerke/rs/samba/client/samba/rpc/SambaRpcService.java @@ -21,7 +21,7 @@ void exportIntoSamba(ReportDto reportDto, String executorToken, SambaDatasinkDto Map getSambaEnabledConfigs() throws ServerCallFailedException; - boolean testSambaDataSink(SambaDatasinkDto sambaDatasinkDto) throws ServerCallFailedException; + boolean testSambaDatasink(SambaDatasinkDto sambaDatasinkDto) throws ServerCallFailedException; DatasinkDefinitionDto getDefaultDatasink() throws ServerCallFailedException; diff --git a/src/net/datenwerke/rs/samba/client/samba/rpc/SambaRpcServiceAsync.java b/src/net/datenwerke/rs/samba/client/samba/rpc/SambaRpcServiceAsync.java index 476992034..0d4254b49 100644 --- a/src/net/datenwerke/rs/samba/client/samba/rpc/SambaRpcServiceAsync.java +++ b/src/net/datenwerke/rs/samba/client/samba/rpc/SambaRpcServiceAsync.java @@ -19,7 +19,7 @@ void exportIntoSamba(ReportDto reportDto, String executorToken, SambaDatasinkDto void getSambaEnabledConfigs(AsyncCallback> callback); - Request testSambaDataSink(SambaDatasinkDto sambaDatasinkDto, AsyncCallback callback); + Request testSambaDatasink(SambaDatasinkDto sambaDatasinkDto, AsyncCallback callback); void getDefaultDatasink(AsyncCallback callback); } \ No newline at end of file diff --git a/src/net/datenwerke/rs/samba/server/samba/SambaRpcServiceImpl.java b/src/net/datenwerke/rs/samba/server/samba/SambaRpcServiceImpl.java index ced269317..3cc24ffaf 100644 --- a/src/net/datenwerke/rs/samba/server/samba/SambaRpcServiceImpl.java +++ b/src/net/datenwerke/rs/samba/server/samba/SambaRpcServiceImpl.java @@ -134,7 +134,7 @@ public Map getSambaEnabledConfigs() throws ServerCallFaile } @Override - public boolean testSambaDataSink(SambaDatasinkDto sambaDatasinkDto) throws ServerCallFailedException { + public boolean testSambaDatasink(SambaDatasinkDto sambaDatasinkDto) throws ServerCallFailedException { SambaDatasink sambaDatasink = (SambaDatasink) dtoService.loadPoso(sambaDatasinkDto); /* check rights */ diff --git a/src/net/datenwerke/rs/samba/service/samba/DummySambaServiceImpl.java b/src/net/datenwerke/rs/samba/service/samba/DummySambaServiceImpl.java new file mode 100644 index 000000000..c1a695113 --- /dev/null +++ b/src/net/datenwerke/rs/samba/service/samba/DummySambaServiceImpl.java @@ -0,0 +1,44 @@ +package net.datenwerke.rs.samba.service.samba; + +import java.io.IOException; +import java.util.Collections; +import java.util.Map; +import java.util.Optional; + +import net.datenwerke.rs.samba.service.samba.definitions.SambaDatasink; +import net.datenwerke.rs.scheduleasfile.client.scheduleasfile.StorageType; + +public class DummySambaServiceImpl implements SambaService { + + @Override + public void sendToSambaServer(Object report, SambaDatasink sambaDatasink, String filename, String folder) + throws IOException { + + } + + @Override + public Map getSambaEnabledConfigs() { + return Collections.emptyMap(); + } + + @Override + public boolean isSambaEnabled() { + return false; + } + + @Override + public boolean isSambaSchedulingEnabled() { + return false; + } + + @Override + public void testSambaDatasink(SambaDatasink sambaDatasink) throws IOException { + + } + + @Override + public Optional getDefaultDatasink() { + return null; + } + +} \ No newline at end of file diff --git a/src/net/datenwerke/rs/samba/service/samba/SambaModule.java b/src/net/datenwerke/rs/samba/service/samba/SambaModule.java index a6f9a22ce..89a9d1846 100644 --- a/src/net/datenwerke/rs/samba/service/samba/SambaModule.java +++ b/src/net/datenwerke/rs/samba/service/samba/SambaModule.java @@ -28,7 +28,6 @@ public class SambaModule extends AbstractModule { @Override protected void configure() { - bind(SambaService.class).to(SambaServiceImpl.class); requestStaticInjection(SambaDatasink.class); bind(SambaStartup.class).asEagerSingleton(); diff --git a/src/net/datenwerke/rs/samba/service/samba/SambaService.java b/src/net/datenwerke/rs/samba/service/samba/SambaService.java index 23c720208..699eddd63 100644 --- a/src/net/datenwerke/rs/samba/service/samba/SambaService.java +++ b/src/net/datenwerke/rs/samba/service/samba/SambaService.java @@ -4,9 +4,12 @@ import java.util.Map; import java.util.Optional; +import com.google.inject.ImplementedBy; + import net.datenwerke.rs.samba.service.samba.definitions.SambaDatasink; import net.datenwerke.rs.scheduleasfile.client.scheduleasfile.StorageType; +@ImplementedBy(DummySambaServiceImpl.class) public interface SambaService { /** diff --git a/src/net/datenwerke/rs/samba/service/samba/SambaServiceImpl.java b/src/net/datenwerke/rs/samba/service/samba/SambaServiceImpl.java deleted file mode 100644 index 6ddf75799..000000000 --- a/src/net/datenwerke/rs/samba/service/samba/SambaServiceImpl.java +++ /dev/null @@ -1,117 +0,0 @@ -package net.datenwerke.rs.samba.service.samba; - -import static net.datenwerke.rs.samba.service.samba.SambaModule.PROPERTY_SAMBA_DISABLED; -import static net.datenwerke.rs.samba.service.samba.SambaModule.PROPERTY_SAMBA_SCHEDULING_ENABLED; - -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.text.SimpleDateFormat; -import java.util.Calendar; -import java.util.Map; -import java.util.Objects; -import java.util.Optional; - -import javax.inject.Inject; - -import org.apache.commons.io.IOUtils; - -import com.google.inject.Provider; - -import jcifs.CIFSContext; -import jcifs.context.SingletonContext; -import jcifs.smb.NtlmPasswordAuthenticator; -import jcifs.smb.SmbFile; -import net.datenwerke.rs.core.service.datasinkmanager.DatasinkService; -import net.datenwerke.rs.core.service.reportmanager.ReportService; -import net.datenwerke.rs.samba.service.samba.annotations.DefaultSambaDatasink; -import net.datenwerke.rs.samba.service.samba.definitions.SambaDatasink; -import net.datenwerke.rs.scheduleasfile.client.scheduleasfile.StorageType; - -public class SambaServiceImpl implements SambaService { - - private final Provider reportServiceProvider; - - private final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); - - private final Provider> defaultDatasinkProvider; - private final Provider datasinkServiceProvider; - - @Inject - public SambaServiceImpl( - Provider reportServiceProvider, - Provider datasinkServiceProvider, - @DefaultSambaDatasink Provider> defaultDatasinkProvider - ) { - this.reportServiceProvider = reportServiceProvider; - this.defaultDatasinkProvider = defaultDatasinkProvider; - this.datasinkServiceProvider = datasinkServiceProvider; - } - - @Override - public void sendToSambaServer(Object report, SambaDatasink sambaDatasink, String filename, String folder) - throws IOException { - if (!isSambaEnabled()) - throw new IllegalStateException("samba is disabled"); - - Objects.requireNonNull(sambaDatasink, "sambaDatasink is null!"); - Objects.requireNonNull(folder); - Objects.requireNonNull(filename); - - final String host = Objects.requireNonNull(sambaDatasink.getHost()); - final int port = sambaDatasink.getPort(); - final String domain = (null == sambaDatasink.getDomain() ? "" : sambaDatasink.getDomain()); - final String username = sambaDatasink.getUsername(); - - if (null == host || host.trim().contentEquals("") || null == username || username.trim().contentEquals("")) - throw new IllegalArgumentException("Samba server is not configured correctly"); - - try (InputStream bis = reportServiceProvider.get().createInputStream(report)) { - - NtlmPasswordAuthenticator ntlmPasswordAuthenticator = new NtlmPasswordAuthenticator(domain, username, - sambaDatasink.getPassword()); - CIFSContext context = SingletonContext.getInstance().withCredentials(ntlmPasswordAuthenticator); - String path = host + ":" + port + "/" + folder + "/" + filename; - SmbFile resource = (SmbFile) context.get(path); - - try (OutputStream ostream = resource.getOutputStream()) { - IOUtils.copy(bis, ostream); - } - - if (!resource.exists()) - throw new IOException("Samba file was not uploaded successfully"); - } - - } - - @Override - public boolean isSambaEnabled() { - return datasinkServiceProvider.get().isEnabled(PROPERTY_SAMBA_DISABLED); - } - - @Override - public boolean isSambaSchedulingEnabled() { - return datasinkServiceProvider.get().isSchedulingEnabled(PROPERTY_SAMBA_SCHEDULING_ENABLED); - } - - @Override - public void testSambaDatasink(SambaDatasink sambaDatasink) throws IOException { - if (!isSambaEnabled()) - throw new IllegalStateException("samba is disabled"); - - sendToSambaServer("ReportServer Samba Datasink Test " + dateFormat.format(Calendar.getInstance().getTime()), - sambaDatasink, "reportserver-samba-test.txt", sambaDatasink.getFolder()); - } - - @Override - public Map getSambaEnabledConfigs() { - return datasinkServiceProvider.get().getEnabledConfigs(StorageType.SAMBA, PROPERTY_SAMBA_DISABLED, - StorageType.SAMBA_SCHEDULING, PROPERTY_SAMBA_SCHEDULING_ENABLED); - } - - @Override - public Optional getDefaultDatasink() { - return defaultDatasinkProvider.get(); - } - -} \ No newline at end of file diff --git a/src/net/datenwerke/rs/scp/client/scp/hookers/ExportToScpHooker.java b/src/net/datenwerke/rs/scp/client/scp/hookers/ExportToScpHooker.java index 085ccee02..b48f02877 100644 --- a/src/net/datenwerke/rs/scp/client/scp/hookers/ExportToScpHooker.java +++ b/src/net/datenwerke/rs/scp/client/scp/hookers/ExportToScpHooker.java @@ -43,6 +43,7 @@ import net.datenwerke.rs.core.client.reportexporter.hooks.ExportExternalEntryProviderHook; import net.datenwerke.rs.core.client.reportexporter.locale.ReportExporterMessages; import net.datenwerke.rs.core.client.reportmanager.dto.reports.ReportDto; +import net.datenwerke.rs.enterprise.client.EnterpriseUiService; import net.datenwerke.rs.eximport.client.eximport.locale.ExImportMessages; import net.datenwerke.rs.scheduleasfile.client.scheduleasfile.StorageType; import net.datenwerke.rs.scheduleasfile.client.scheduleasfile.locale.ScheduleAsFileMessages; @@ -58,40 +59,51 @@ public class ExportToScpHooker implements ExportExternalEntryProviderHook { private final Provider treeProvider; private final Provider datasinkDaoProvider; private final DatasinkTreeManagerDao datasinkTreeManager; + + private final Provider enterpriseServiceProvider; @Inject public ExportToScpHooker( HookHandlerService hookHandler, DatasinkTreeManagerDao datasinkTreeManager, @DatasinkTreeScp Provider treeProvider, - Provider datasinkDaoProvider + Provider datasinkDaoProvider, + Provider enterpriseServiceProvider ) { this.hookHandler = hookHandler; this.treeProvider = treeProvider; this.datasinkTreeManager = datasinkTreeManager; this.datasinkDaoProvider = datasinkDaoProvider; + + this.enterpriseServiceProvider = enterpriseServiceProvider; } @Override public void getMenuEntry(Menu menu, ReportDto report, ReportExecutorInformation info, ReportExecutorMainPanel mainPanel) { - datasinkDaoProvider.get().getScpEnabledConfigs(new AsyncCallback>() { - - @Override - public void onSuccess(Map result) { - // item is only added if enabled in configuration - if (result.get(StorageType.SCP)) { - MenuItem item = new DwMenuItem("SCP", BaseIcon.ARROW_UP); - menu.add(item); - item.addSelectionHandler( - event -> displayExportDialog(report, info, mainPanel.getViewConfigs())); - } - } - - @Override - public void onFailure(Throwable caught) { - } - }); + + if (enterpriseServiceProvider.get().isEnterprise()) { + datasinkDaoProvider.get().getScpEnabledConfigs(new AsyncCallback>() { + @Override + public void onSuccess(Map result) { + // item is only added if enabled in configuration + if (result.get(StorageType.SCP)) { + MenuItem item = new DwMenuItem("SCP", BaseIcon.ARROW_UP); + menu.add(item); + item.addSelectionHandler(event -> displayExportDialog(report, info, mainPanel.getViewConfigs())); + } + } + + @Override + public void onFailure(Throwable caught) { + } + }); + } else { + // we add item but disable it + MenuItem item = new DwMenuItem("SCP", BaseIcon.ARROW_UP); + menu.add(item); + item.disable(); + } } protected void displayExportDialog(final ReportDto report, final ReportExecutorInformation info, diff --git a/src/net/datenwerke/rs/scp/client/scp/hookers/ScpDatasinkConfigProviderHooker.java b/src/net/datenwerke/rs/scp/client/scp/hookers/ScpDatasinkConfigProviderHooker.java index 2f44d5e8e..07ab0c538 100644 --- a/src/net/datenwerke/rs/scp/client/scp/hookers/ScpDatasinkConfigProviderHooker.java +++ b/src/net/datenwerke/rs/scp/client/scp/hookers/ScpDatasinkConfigProviderHooker.java @@ -11,54 +11,61 @@ import net.datenwerke.rs.core.client.datasinkmanager.dto.AbstractDatasinkManagerNodeDto; import net.datenwerke.rs.core.client.datasinkmanager.dto.DatasinkDefinitionDto; import net.datenwerke.rs.core.client.datasinkmanager.hooks.DatasinkDefinitionConfigProviderHook; +import net.datenwerke.rs.enterprise.client.EnterpriseUiService; import net.datenwerke.rs.scp.client.scp.dto.ScpDatasinkDto; import net.datenwerke.rs.scp.client.scp.ui.ScpDatasinkForm; import net.datenwerke.rs.theme.client.icon.BaseIcon; public class ScpDatasinkConfigProviderHooker implements DatasinkDefinitionConfigProviderHook { - private final Provider formProvider; - - @Inject - public ScpDatasinkConfigProviderHooker(Provider formProvider) { - - /* store objects */ - this.formProvider = formProvider; - } - - @Override - public boolean consumes(DatasinkDefinitionDto datasinkDefinition) { - return ScpDatasinkDto.class.equals(datasinkDefinition.getClass()); - } - - @Override - public Collection getAdminViews(DatasinkDefinitionDto datasinkDefinition) { - return Collections.singleton(formProvider.get()); - } - - @Override - public Class getDatasinkClass() { - return ScpDatasinkDto.class; - } - - @Override - public String getDatasinkName() { - return "SCP"; - } - - @Override - public AbstractDatasinkManagerNodeDto instantiateDatasink() { - return new ScpDatasinkDto(); - } - - @Override - public ImageResource getDatasinkIcon() { - return BaseIcon.ARROW_UP.toImageResource(); - } - - @Override - public boolean isAvailable() { - return true; - } + private final Provider formProvider; + + private final Provider enterpriseServiceProvider; + + @Inject + public ScpDatasinkConfigProviderHooker( + Provider formProvider, + Provider enterpriseServiceProvider + ) { + + /* store objects */ + this.formProvider = formProvider; + this.enterpriseServiceProvider = enterpriseServiceProvider; + } + + @Override + public boolean consumes(DatasinkDefinitionDto datasinkDefinition) { + return ScpDatasinkDto.class.equals(datasinkDefinition.getClass()); + } + + @Override + public Collection getAdminViews(DatasinkDefinitionDto datasinkDefinition) { + return Collections.singleton(formProvider.get()); + } + + @Override + public Class getDatasinkClass() { + return ScpDatasinkDto.class; + } + + @Override + public String getDatasinkName() { + return "SCP"; + } + + @Override + public AbstractDatasinkManagerNodeDto instantiateDatasink() { + return new ScpDatasinkDto(); + } + + @Override + public ImageResource getDatasinkIcon() { + return BaseIcon.ARROW_UP.toImageResource(); + } + + @Override + public boolean isAvailable() { + return enterpriseServiceProvider.get().isEnterprise(); + } } diff --git a/src/net/datenwerke/rs/scp/service/scp/DummyScpServiceImpl.java b/src/net/datenwerke/rs/scp/service/scp/DummyScpServiceImpl.java new file mode 100644 index 000000000..52004eeb8 --- /dev/null +++ b/src/net/datenwerke/rs/scp/service/scp/DummyScpServiceImpl.java @@ -0,0 +1,44 @@ +package net.datenwerke.rs.scp.service.scp; + +import java.io.IOException; +import java.util.Collections; +import java.util.Map; +import java.util.Optional; + +import net.datenwerke.rs.scheduleasfile.client.scheduleasfile.StorageType; +import net.datenwerke.rs.scp.service.scp.definitions.ScpDatasink; + +public class DummyScpServiceImpl implements ScpService { + + @Override + public void sendToScpServer(Object report, ScpDatasink scpDatasink, String filename, String folder) + throws IOException { + + } + + @Override + public Map getScpEnabledConfigs() { + return Collections.emptyMap(); + } + + @Override + public boolean isScpEnabled() { + return false; + } + + @Override + public boolean isScpSchedulingEnabled() { + return false; + } + + @Override + public void testScpDatasink(ScpDatasink scpDatasink) throws IOException { + + } + + @Override + public Optional getDefaultDatasink() { + return null; + } + +} \ No newline at end of file diff --git a/src/net/datenwerke/rs/scp/service/scp/ScpModule.java b/src/net/datenwerke/rs/scp/service/scp/ScpModule.java index f2b22425f..581e0a8ab 100644 --- a/src/net/datenwerke/rs/scp/service/scp/ScpModule.java +++ b/src/net/datenwerke/rs/scp/service/scp/ScpModule.java @@ -28,7 +28,6 @@ public class ScpModule extends AbstractModule { @Override protected void configure() { - bind(ScpService.class).to(ScpServiceImpl.class); requestStaticInjection(ScpDatasink.class); bind(ScpStartup.class).asEagerSingleton(); diff --git a/src/net/datenwerke/rs/scp/service/scp/ScpService.java b/src/net/datenwerke/rs/scp/service/scp/ScpService.java index b9b5bf0f2..797bbed1d 100644 --- a/src/net/datenwerke/rs/scp/service/scp/ScpService.java +++ b/src/net/datenwerke/rs/scp/service/scp/ScpService.java @@ -4,11 +4,13 @@ import java.util.Map; import java.util.Optional; +import com.google.inject.ImplementedBy; import com.jcraft.jsch.JSchException; import net.datenwerke.rs.scheduleasfile.client.scheduleasfile.StorageType; import net.datenwerke.rs.scp.service.scp.definitions.ScpDatasink; +@ImplementedBy(DummyScpServiceImpl.class) public interface ScpService { /** diff --git a/src/net/datenwerke/rs/scp/service/scp/ScpServiceImpl.java b/src/net/datenwerke/rs/scp/service/scp/ScpServiceImpl.java deleted file mode 100644 index 2907dad70..000000000 --- a/src/net/datenwerke/rs/scp/service/scp/ScpServiceImpl.java +++ /dev/null @@ -1,239 +0,0 @@ -/* -*-mode:java; c-basic-offset:2; indent-tabs-mode:nil -*- */ -/* -Copyright (c) 2002-2018 ymnk, JCraft,Inc. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the distribution. - - 3. The names of the authors may not be used to endorse or promote products - derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, -INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND -FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT, -INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, -INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, -OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, -EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -package net.datenwerke.rs.scp.service.scp; - -import static net.datenwerke.rs.scp.service.scp.ScpModule.PROPERTY_SCP_DISABLED; -import static net.datenwerke.rs.scp.service.scp.ScpModule.PROPERTY_SCP_SCHEDULING_ENABLED; - -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.nio.charset.StandardCharsets; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.Paths; -import java.text.SimpleDateFormat; -import java.util.Calendar; -import java.util.Map; -import java.util.Objects; -import java.util.Optional; - -import javax.inject.Inject; - -import org.apache.commons.io.IOUtils; - -import com.google.inject.Provider; -import com.jcraft.jsch.Channel; -import com.jcraft.jsch.ChannelExec; -import com.jcraft.jsch.JSch; -import com.jcraft.jsch.JSchException; -import com.jcraft.jsch.Session; - -import net.datenwerke.rs.core.service.datasinkmanager.DatasinkService; -import net.datenwerke.rs.core.service.reportmanager.ReportService; -import net.datenwerke.rs.scheduleasfile.client.scheduleasfile.StorageType; -import net.datenwerke.rs.scp.client.scp.hookers.ScpPublicKeyAuthenticatorHooker; -import net.datenwerke.rs.scp.service.scp.annotations.DefaultScpDatasink; -import net.datenwerke.rs.scp.service.scp.definitions.ScpDatasink; -import net.datenwerke.rs.utils.config.ConfigService; - -public class ScpServiceImpl implements ScpService { - - private final Provider configServiceProvider; - private final Provider reportServiceProvider; - private final Provider datasinkServiceProvider; - - private final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); - - private final Provider> defaultDatasinkProvider; - - @Inject - public ScpServiceImpl( - Provider configServiceProvider, - Provider reportServiceProvider, - Provider datasinkServiceProvider, - @DefaultScpDatasink Provider> defaultDatasinkProvider - ) { - this.configServiceProvider = configServiceProvider; - this.reportServiceProvider = reportServiceProvider; - this.defaultDatasinkProvider = defaultDatasinkProvider; - this.datasinkServiceProvider = datasinkServiceProvider; - } - - // adapted from ScpTo.java (jsch-0.1.55) - @Override - public void sendToScpServer(Object report, ScpDatasink scpDatasink, String filename, String folder) - throws IOException, JSchException { - if (!isScpEnabled()) - throw new IllegalStateException("scp is disabled"); - - Objects.requireNonNull(scpDatasink, "scpDatasink is null!"); - Objects.requireNonNull(folder); - Objects.requireNonNull(scpDatasink.getAuthenticationType()); - - final String host = Objects.requireNonNull(scpDatasink.getHost()).replace("scp://", ""); - final int port = scpDatasink.getPort(); - final String username = scpDatasink.getUsername(); - - if (null == host || host.trim().contentEquals("") || null == username || username.trim().contentEquals("")) - throw new IllegalArgumentException("SCP server is not configured correctly"); - - Path knownHostsFile = Paths.get(configServiceProvider.get().getConfigFailsafe("security/misc.cf") - .getString("knownHosts", System.getProperty("user.home") + "/.ssh/known_hosts")); - if (!Files.exists(knownHostsFile)) - throw new IllegalArgumentException("known_hosts file does not exist"); - - // remote folder must exist - Path to = Paths.get(folder, filename); - - Channel channel = null; - Session session = null; - - try (InputStream bis = reportServiceProvider.get().createInputStream(report)) { - - byte[] data = IOUtils.toByteArray(bis); - - JSch jsch = new JSch(); - jsch.setKnownHosts(knownHostsFile.toAbsolutePath().toString()); - session = jsch.getSession(username, host, port); - if (ScpPublicKeyAuthenticatorHooker.AUTHENTICATION_TYPE.equals(scpDatasink.getAuthenticationType())) { - jsch.addIdentity("scpIdentityKey", scpDatasink.getPrivateKey(), (byte[]) null, - (null != scpDatasink.getPrivateKeyPassphrase() - ? scpDatasink.getPrivateKeyPassphrase().getBytes(StandardCharsets.UTF_8) - : null)); - } else { - session.setPassword(scpDatasink.getPassword()); - } - - session.setConfig("StrictHostKeyChecking", "yes"); - - session.connect(); - - // exec 'scp -t rfile' remotely - String rfile = to.toAbsolutePath().toString().replace("'", "'\"'\"'"); - rfile = "'" + rfile + "'"; - String command = "scp " + " -t " + rfile; - channel = session.openChannel("exec"); - ((ChannelExec) channel).setCommand(command); - - // get I/O streams for remote scp - try (OutputStream out = channel.getOutputStream(); InputStream in = channel.getInputStream()) { - - channel.connect(); - - checkAck(in); - - // send "C0644 filesize filename", where filename should not include '/' - long filesize = data.length; - command = "C0644 " + filesize + " "; - command += filename; - - command += "\n"; - out.write(command.getBytes()); - out.flush(); - checkAck(in); - - // send the data - out.write(data, 0, data.length); // out.flush(); - // send '\0' - out.write(0); - out.flush(); - checkAck(in); - - } - } finally { - if (null != channel) - channel.disconnect(); - if (null != session) - session.disconnect(); - } - } - - // adapted from ScpTo.java (jsch-0.1.55) - private void checkAck(InputStream in) throws IOException { - StringBuffer sb = new StringBuffer(); - int b = in.read(); - // b may be 0 for success, - // 1 for error, - // 2 for fatal error, - // -1 - if (b == 0) { - // OK - } - if (b == -1) - throw new IOException("Ack: -1"); - - if (b == 1 || b == 2) { - int c; - do { - c = in.read(); - sb.append((char) c); - } while (c != '\n'); - if (b == 1) { // error - throw new IOException(sb.toString()); - } - if (b == 2) { // fatal error - throw new IOException(sb.toString()); - } - } - } - - @Override - public Map getScpEnabledConfigs() { - return datasinkServiceProvider.get().getEnabledConfigs(StorageType.SCP, PROPERTY_SCP_DISABLED, - StorageType.SCP_SCHEDULING, PROPERTY_SCP_SCHEDULING_ENABLED); - } - - @Override - public boolean isScpEnabled() { - return datasinkServiceProvider.get().isEnabled(PROPERTY_SCP_DISABLED); - } - - @Override - public boolean isScpSchedulingEnabled() { - return datasinkServiceProvider.get().isSchedulingEnabled(PROPERTY_SCP_SCHEDULING_ENABLED); - } - - @Override - public void testScpDatasink(ScpDatasink scpDatasink) throws IOException, JSchException { - if (!isScpEnabled()) - throw new IllegalStateException("scp is disabled"); - - sendToScpServer("ReportServer SCP Datasink Test " + dateFormat.format(Calendar.getInstance().getTime()), - scpDatasink, "reportserver-scp-test.txt", scpDatasink.getFolder()); - - } - - @Override - public Optional getDefaultDatasink() { - return defaultDatasinkProvider.get(); - } - -}