Search in sources :

Example 41 with Connector

use of com.twinsoft.convertigo.beans.core.Connector in project convertigo by convertigo.

the class GetTestPlatform method getServiceResult.

protected void getServiceResult(HttpServletRequest request, Document document) throws Exception {
    Element root = document.getDocumentElement();
    String projectName = request.getParameter("projectName");
    Project project = Engine.theApp.databaseObjectsManager.getOriginalProjectByName(projectName);
    Element e_project = createDatabaseObjectElement(document, project);
    Connector defaultConnector = project.getDefaultConnector();
    e_project.setAttribute("defaultConnector", defaultConnector.getName());
    e_project.setAttribute("defaultTransaction", defaultConnector.getDefaultTransaction().getName());
    boolean bTpHiddenRole = Engine.authenticatedSessionManager.hasRole(request.getSession(), Role.TEST_PLATFORM_HIDDEN);
    boolean bTpPrivateRole = Engine.authenticatedSessionManager.hasRole(request.getSession(), Role.TEST_PLATFORM_PRIVATE);
    for (Connector connector : project.getConnectorsList()) {
        Element e_connector = createDatabaseObjectElement(document, connector);
        for (Transaction transaction : connector.getTransactionsList()) {
            // WEB_ADMIN role is allowed to execute all requestables
            if (transaction.isPublicAccessibility() || (transaction.isHiddenAccessibility() && bTpHiddenRole) || bTpPrivateRole) {
                e_connector.appendChild(createRequestableElement(document, transaction));
            }
        }
        e_project.appendChild(e_connector);
    }
    for (Sequence sequence : project.getSequencesList()) {
        // WEB_ADMIN role is allowed to execute all requestables
        if (sequence.isPublicAccessibility() || (sequence.isHiddenAccessibility() && bTpHiddenRole) || bTpPrivateRole) {
            e_project.appendChild(createRequestableElement(document, sequence));
        }
    }
    MobileApplication mobileApplication = project.getMobileApplication();
    if (mobileApplication != null && (mobileApplication.getAccessibility() == Accessibility.Public || (mobileApplication.getAccessibility() == Accessibility.Hidden && bTpHiddenRole) || bTpPrivateRole)) {
        Element e_mobileApplication = createDatabaseObjectElement(document, mobileApplication);
        String applicationID = mobileApplication.getComputedApplicationId();
        e_mobileApplication.setAttribute("applicationID", applicationID);
        String endpoint = mobileApplication.getComputedEndpoint(request);
        e_mobileApplication.setAttribute("endpoint", endpoint);
        String version = mobileApplication.getComputedApplicationVersion();
        e_mobileApplication.setAttribute("applicationVersion", version);
        e_project.appendChild(e_mobileApplication);
        for (MobilePlatform platform : mobileApplication.getMobilePlatformList()) {
            Element e_device = createDatabaseObjectElement(document, platform);
            e_device.setAttribute("classname", platform.getClass().getSimpleName());
            e_device.setAttribute("displayName", CachedIntrospector.getBeanInfo(platform.getClass()).getBeanDescriptor().getDisplayName());
            e_device.setAttribute("packageType", platform.getPackageType());
            e_device.setAttribute("revision", "computing...");
            e_mobileApplication.appendChild(e_device);
        }
        try {
            String mobileProjectName = mobileApplication.getComputedApplicationName();
            e_mobileApplication.setAttribute("mobileProjectName", mobileProjectName);
        } catch (Exception e) {
            Engine.logAdmin.error("Failed to retrieve the application mobile name", e);
        }
        IApplicationComponent app = mobileApplication.getApplicationComponent();
        String msg = app != null ? app.getUnbuiltMessage() : null;
        if (msg != null) {
            e_mobileApplication.setAttribute("unbuiltMessage", msg);
        }
    }
    root.appendChild(e_project);
}
Also used : Project(com.twinsoft.convertigo.beans.core.Project) Connector(com.twinsoft.convertigo.beans.core.Connector) MobilePlatform(com.twinsoft.convertigo.beans.core.MobilePlatform) Transaction(com.twinsoft.convertigo.beans.core.Transaction) MobileApplication(com.twinsoft.convertigo.beans.core.MobileApplication) Element(org.w3c.dom.Element) Sequence(com.twinsoft.convertigo.beans.core.Sequence) IApplicationComponent(com.twinsoft.convertigo.beans.core.IApplicationComponent)

Example 42 with Connector

use of com.twinsoft.convertigo.beans.core.Connector in project convertigo by convertigo.

the class CreateDbo method getServiceResult.

@Override
protected void getServiceResult(HttpServletRequest request, Document document) throws Exception {
    String qname = request.getParameter("qname");
    String folderType = request.getParameter("folderType");
    String beanClassNameToCreate = request.getParameter("beanClass");
    DatabaseObject parentDbo = Engine.theApp.databaseObjectsManager.getDatabaseObjectByQName(qname);
    Class<? extends DatabaseObject> beanClassToCreate = GenericUtils.cast(Class.forName(beanClassNameToCreate));
    Class<? extends DatabaseObject> databaseObjectClass = Get.folderNameToBeanClass.get(folderType);
    Element root = document.getDocumentElement();
    // Before add, we musht check if we can add it
    boolean canCreate = DatabaseObjectsManager.acceptDatabaseObjects(parentDbo, beanClassToCreate, databaseObjectClass);
    if (canCreate) {
        DatabaseObject newBean = (DatabaseObject) Class.forName(beanClassNameToCreate).getConstructor().newInstance();
        try {
            String beanName = newBean.getName();
            // The name of the FullSyncConnector needs to in be lower case
            if (newBean instanceof FullSyncConnector) {
                beanName = beanName.toLowerCase();
            }
            // Compute new name
            newBean.setName(newBean.getChildBeanName(parentDbo.getDatabaseObjectChildren(), beanName, true));
            // If the new bean has to be inserted at a specific position
            if (parentDbo instanceof IContainerOrdered) {
                String afterPriority = request.getParameter("afterPriority");
                Long after = null;
                try {
                    after = Long.valueOf(afterPriority);
                } catch (NumberFormatException e) {
                    after = null;
                }
                IContainerOrdered containerOrdered = (IContainerOrdered) parentDbo;
                containerOrdered.add(newBean, after);
            } else {
                // Need to create more things in case of Connectors
                if (newBean instanceof Connector) {
                    Connector.setupConnector(newBean);
                }
                parentDbo.add(newBean);
            }
            // Get new bean info
            Element response = document.createElement("response");
            GetChildren.getChildren(newBean.getQName(), response, 0);
            response.setAttribute("state", "success");
            root.appendChild(response);
        } catch (EngineException e) {
            throw e;
        }
    } else {
        throw new EngineException("You cannot create a " + beanClassNameToCreate + " object here.");
    }
}
Also used : Connector(com.twinsoft.convertigo.beans.core.Connector) FullSyncConnector(com.twinsoft.convertigo.beans.connectors.FullSyncConnector) Element(org.w3c.dom.Element) IContainerOrdered(com.twinsoft.convertigo.beans.core.IContainerOrdered) EngineException(com.twinsoft.convertigo.engine.EngineException) DatabaseObject(com.twinsoft.convertigo.beans.core.DatabaseObject) FullSyncConnector(com.twinsoft.convertigo.beans.connectors.FullSyncConnector)

Example 43 with Connector

use of com.twinsoft.convertigo.beans.core.Connector in project convertigo by convertigo.

the class FullSyncServlet method service.

@Override
protected void service(final HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    StringBuffer debug = new StringBuffer();
    HttpMethodType method;
    try {
        HttpUtils.checkCV(request);
        String corsOrigin = HttpUtils.applyCorsHeaders(request, response);
        if (corsOrigin != null) {
            debug.append("Added CORS header for: " + corsOrigin + "\n");
        }
        method = HttpMethodType.valueOf(request.getMethod());
        if (method == HttpMethodType.OPTIONS) {
            response.setStatus(HttpServletResponse.SC_NO_CONTENT);
            return;
        }
        if (method != HttpMethodType.HEAD) {
            HttpSessionListener.checkSession(request);
        }
    } catch (Throwable e) {
        throw new ServletException(e);
    }
    HttpSession httpSession = request.getSession();
    try {
        FullSyncClient fsClient = Engine.theApp.couchDbManager.getFullSyncClient();
        RequestParser requestParser = new RequestParser(request, fsClient.getPrefix());
        boolean isUtilsSession = "true".equals(httpSession.getAttribute("__isUtilsSession"));
        boolean isUtilsRequest = false;
        String referer = request.getHeader("Referer");
        if (isUtilsSession || (referer != null && referer.endsWith("/admin/_utils/"))) {
            Engine.authenticatedSessionManager.checkRoles(httpSession, Role.WEB_ADMIN, Role.FULLSYNC_CONFIG, Role.FULLSYNC_VIEW);
            httpSession.setAttribute("__isUtilsSession", "true");
            isUtilsRequest = !"_all_dbs".equals(requestParser.getSpecial());
        } else {
            Engine.theApp.couchDbManager.checkRequest(requestParser.getPath(), requestParser.getSpecial(), requestParser.getDocId());
        }
        synchronized (httpSession) {
            Set<HttpServletRequest> set = SessionAttribute.fullSyncRequests.get(httpSession);
            if (set == null) {
                SessionAttribute.fullSyncRequests.set(httpSession, set = new HashSet<HttpServletRequest>());
            }
            set.add(request);
        }
        LogParameters logParameters = GenericUtils.cast(httpSession.getAttribute(FullSyncServlet.class.getCanonicalName()));
        if (logParameters == null) {
            httpSession.setAttribute(FullSyncServlet.class.getCanonicalName(), logParameters = new LogParameters());
            logParameters.put(mdcKeys.ContextID.toString().toLowerCase(), httpSession.getId());
        }
        Log4jHelper.mdcSet(logParameters);
        logParameters.put(mdcKeys.ClientIP.toString().toLowerCase(), request.getRemoteAddr());
        if (EnginePropertiesManager.getProperty(PropertyName.NET_REVERSE_DNS).equalsIgnoreCase("true")) {
            Log4jHelper.mdcPut(mdcKeys.ClientHostName, request.getRemoteHost());
        }
        String dbName = requestParser.getDbName();
        FullSyncAuthentication fsAuth = Engine.theApp.couchDbManager.getFullSyncAuthentication(request.getSession());
        if (fsAuth == null) {
            Log4jHelper.mdcPut(mdcKeys.User, "(anonymous)");
            debug.append("Anonymous user\n");
            Boolean allowAnonymous = null;
            for (String projectName : Engine.theApp.databaseObjectsManager.getAllProjectNamesList()) {
                try {
                    Project project = Engine.theApp.databaseObjectsManager.getOriginalProjectByName(projectName);
                    for (Connector connector : project.getConnectorsList()) {
                        if (connector instanceof FullSyncConnector) {
                            FullSyncConnector fullSyncConnector = (FullSyncConnector) connector;
                            if (fullSyncConnector.getDatabaseName().equals(dbName)) {
                                allowAnonymous = fullSyncConnector.getAnonymousReplication() == FullSyncAnonymousReplication.allow;
                                break;
                            }
                        }
                    }
                    if (allowAnonymous != null) {
                        break;
                    }
                } catch (Exception e) {
                // TODO: handle exception
                }
            }
            if (allowAnonymous == Boolean.FALSE) {
                throw new SecurityException("The '" + dbName + "' database deny pull synchronization for an anonymous session");
            }
        } else {
            Log4jHelper.mdcPut(mdcKeys.User, "'" + fsAuth.getAuthenticatedUser() + "'");
            debug.append("Authenticated user: ").append(fsAuth.getAuthenticatedUser()).append('\n').append("Authenticated groups: ").append(fsAuth.getGroups()).append('\n');
        }
        String url = Engine.theApp.couchDbManager.getFullSyncUrl() + requestParser.getPath();
        URIBuilder builder = new URIBuilder(url);
        String query = request.getQueryString();
        if (query != null) {
            try {
                // needed for PouchDB replication
                URI uri = URI.create(url + "?" + request.getQueryString());
                query = uri.getQuery();
            } catch (Exception e) {
                debug.append("parse query failed (" + e.getMessage() + "), use as it; query=" + query + "\n");
            }
            builder.setCustomQuery(query);
        }
        String special = requestParser.getSpecial();
        boolean isChanges = "_changes".equals(special);
        String version = fsClient.getServerVersion();
        boolean isCouchDB = "CouchDB".equals(fsClient.getServerName());
        if (isChanges && version.compareTo("2.") >= 0 && isCouchDB) {
            method = HttpMethodType.POST;
        }
        debug.append("dbName=" + dbName + " special=" + special + " couchdb=" + version + (requestParser.hasAttachment() ? " attachment=true" : "") + "\n");
        HttpRequestBase newRequest;
        switch(method) {
            case DELETE:
                if (isUtilsRequest) {
                    Engine.authenticatedSessionManager.checkRoles(httpSession, Role.WEB_ADMIN, Role.FULLSYNC_CONFIG);
                    if (requestParser.getDocId() == null && StringUtils.isNotBlank(requestParser.getDbName()) && DelegateServlet.canDelegate()) {
                        JSONObject instruction = new JSONObject();
                        JSONObject variables = new JSONObject();
                        try {
                            instruction.put("action", "deleteDatabase");
                            variables.put("db", fsClient.getPrefix() + requestParser.getDbName());
                            instruction.put("variables", variables);
                            JSONObject deleteResponse = DelegateServlet.delegate(instruction);
                            if (deleteResponse != null) {
                                JSONObject meta = CouchKey._c8oMeta.JSONObject(deleteResponse);
                                CouchKey._c8oMeta.remove(deleteResponse);
                                response.setStatus(meta.getInt("statusCode"));
                                JSONObject headers = meta.getJSONObject("headers");
                                for (java.util.Iterator<?> i = headers.keys(); i.hasNext(); ) {
                                    String key = (String) i.next();
                                    response.addHeader(key, headers.getString(key));
                                }
                                response.setCharacterEncoding("UTF-8");
                                try (Writer w = response.getWriter()) {
                                    w.write(deleteResponse.toString());
                                }
                                return;
                            }
                        } catch (Exception e) {
                        }
                    }
                    newRequest = new HttpDelete();
                } else {
                    // disabled to prevent db delete
                    throw new ServletException("Invalid HTTP method");
                }
                break;
            case GET:
                newRequest = new HttpGet();
                break;
            case HEAD:
                newRequest = new HttpHead();
                break;
            case OPTIONS:
                newRequest = new HttpOptions();
                break;
            case POST:
                if (isUtilsRequest) {
                    Engine.authenticatedSessionManager.checkRoles(httpSession, Role.WEB_ADMIN, Role.FULLSYNC_CONFIG);
                }
                newRequest = new HttpPost();
                break;
            case PUT:
                if (isUtilsRequest) {
                    Engine.authenticatedSessionManager.checkRoles(httpSession, Role.WEB_ADMIN, Role.FULLSYNC_CONFIG);
                }
                newRequest = new HttpPut();
                break;
            case TRACE:
                newRequest = new HttpTrace();
                break;
            default:
                throw new ServletException("Invalid HTTP method");
        }
        if (method.equals(HttpMethodType.POST) && "_bulk_docs".equals(special)) {
            int n = fsClient.getN();
            if (n > 1) {
                for (NameValuePair kv : builder.getQueryParams()) {
                    if ("w".equals(kv.getName())) {
                        n = 0;
                        break;
                    }
                }
                if (n > 1) {
                    builder.addParameter("w", Integer.toString(n));
                }
            }
        }
        URI uri = builder.build();
        newRequest.setURI(uri);
        debug.append(method.name() + " URI: " + uri.toString() + "\n");
        String requestStringEntity = null;
        HttpEntity httpEntity = null;
        JSONObject bulkDocsRequest = null;
        boolean isCBL = false;
        boolean isCBLiOS = false;
        {
            String agent = HeaderName.UserAgent.getHeader(request);
            isCBL = agent != null && agent.startsWith("CouchbaseLite/1.");
            if (isCBL) {
                isCBLiOS = agent.contains("iOS");
                isCBL = version != null && version.compareTo("1.7") >= 0;
            }
        }
        for (String headerName : Collections.list(request.getHeaderNames())) {
            if (!(HeaderName.TransferEncoding.is(headerName) || HeaderName.ContentLength.is(headerName) || HeaderName.UserAgent.is(headerName) || HeaderName.Expect.is(headerName) || HeaderName.Connection.is(headerName) || HeaderName.Host.is(headerName) || HeaderName.Cookie.is(headerName) || HeaderName.ContentEncoding.is(headerName) || HeaderName.Origin.is(headerName) || (isChanges && (HeaderName.IfNoneMatch.is(headerName) || HeaderName.IfModifiedSince.is(headerName) || HeaderName.CacheControl.is(headerName) || HeaderName.AcceptEncoding.is(headerName))))) {
                for (String headerValue : Collections.list(request.getHeaders(headerName))) {
                    debug.append("request Header: " + headerName + "=" + headerValue + "\n");
                    newRequest.addHeader(headerName, headerValue);
                }
            } else {
                debug.append("skip request Header: " + headerName + "=" + request.getHeader(headerName) + "\n");
            }
        }
        {
            Header authBasicHeader = fsClient.getAuthBasicHeader();
            if (authBasicHeader != null) {
                debug.append("request add BasicHeader");
                newRequest.addHeader(authBasicHeader);
            }
        }
        if (request.getInputStream() != null) {
            String reqContentType = request.getContentType();
            if (reqContentType != null && reqContentType.startsWith("multipart/related;")) {
                final MimeMultipart mp = new MimeMultipart(new ByteArrayDataSource(request.getInputStream(), reqContentType));
                final long[] size = { request.getIntHeader(HeaderName.ContentLength.value()) };
                final boolean chunked = size[0] == -1;
                int count = mp.getCount();
                debug.append("handle multipart/related: " + reqContentType + "; " + count + " parts; original size of " + size[0]);
                final File mpTmp;
                if (chunked) {
                    mpTmp = File.createTempFile("c8o", "mpTmp");
                    mpTmp.deleteOnExit();
                } else {
                    mpTmp = null;
                }
                try {
                    bulkDocsRequest = new JSONObject();
                    JSONArray bulkDocsArray = new JSONArray();
                    CouchKey.docs.put(bulkDocsRequest, bulkDocsArray);
                    for (int i = 0; i < count; i++) {
                        BodyPart part = mp.getBodyPart(i);
                        ContentTypeDecoder contentType = new ContentTypeDecoder(part.getContentType());
                        if (contentType.mimeType() == MimeType.Json) {
                            String charset = contentType.getCharset("UTF-8");
                            List<javax.mail.Header> headers = Collections.list(GenericUtils.<Enumeration<javax.mail.Header>>cast(part.getAllHeaders()));
                            byte[] buf = IOUtils.toByteArray(part.getInputStream());
                            if (!chunked) {
                                size[0] -= buf.length;
                            }
                            String json = new String(buf, charset);
                            try {
                                JSONObject docRequest = new JSONObject(json);
                                Engine.theApp.couchDbManager.handleDocRequest(dbName, docRequest, fsAuth);
                                bulkDocsArray.put(docRequest);
                                json = docRequest.toString();
                            } catch (JSONException e) {
                                debug.append("failed to parse [ " + e.getMessage() + "]: " + json);
                            }
                            part.setContent(buf = json.getBytes(charset), part.getContentType());
                            if (!chunked) {
                                size[0] += buf.length;
                            }
                            for (javax.mail.Header header : headers) {
                                String name = header.getName();
                                if (HeaderName.ContentLength.is(name)) {
                                    part.setHeader(name, Integer.toString(buf.length));
                                } else {
                                    part.setHeader(name, header.getValue());
                                }
                            }
                        }
                    }
                    if (chunked) {
                        try (FileOutputStream fos = new FileOutputStream(mpTmp)) {
                            mp.writeTo(fos);
                        }
                        size[0] = mpTmp.length();
                    }
                    debug.append("; new size of " + size[0] + "\n");
                    httpEntity = new AbstractHttpEntity() {

                        @Override
                        public void writeTo(OutputStream output) throws IOException {
                            if (chunked) {
                                try (FileInputStream fis = new FileInputStream(mpTmp)) {
                                    IOUtils.copyLarge(fis, output);
                                }
                            } else {
                                try {
                                    mp.writeTo(output);
                                } catch (MessagingException e) {
                                    new IOException(e);
                                }
                            }
                        }

                        @Override
                        public boolean isStreaming() {
                            return false;
                        }

                        @Override
                        public boolean isRepeatable() {
                            return true;
                        }

                        @Override
                        public long getContentLength() {
                            return size[0];
                        }

                        @Override
                        public InputStream getContent() throws IOException, IllegalStateException {
                            return null;
                        }
                    };
                } finally {
                    if (mpTmp != null) {
                        mpTmp.delete();
                    }
                }
            } else {
                InputStream is = null;
                try {
                    if ("gzip".equals(HeaderName.ContentEncoding.getHeader(request))) {
                        is = new GZIPInputStream(request.getInputStream());
                    } else {
                        is = request.getInputStream();
                    }
                    requestStringEntity = IOUtils.toString(is, "UTF-8");
                    debug.append("request Entity:\n" + requestStringEntity + "\n");
                } finally {
                    if (is != null) {
                        is.close();
                    }
                }
            }
        }
        boolean isNewStringEntity = false;
        if (method == HttpMethodType.POST && "_bulk_docs".equals(special)) {
            try {
                bulkDocsRequest = new JSONObject(requestStringEntity);
                Engine.theApp.couchDbManager.handleBulkDocsRequest(dbName, bulkDocsRequest, fsAuth);
                String newEntity = bulkDocsRequest.toString();
                if (!newEntity.equals(requestStringEntity)) {
                    requestStringEntity = newEntity;
                    isNewStringEntity = true;
                }
            } catch (JSONException e) {
                debug.append("failed to parse [ " + e.getMessage() + "]: " + requestStringEntity);
            }
        } else if (isChanges && newRequest instanceof HttpEntityEnclosingRequest) {
            requestStringEntity = Engine.theApp.couchDbManager.handleChangesUri(dbName, newRequest, requestStringEntity, fsAuth);
            if (requestStringEntity != null) {
                debug.append("request new Entity:\n" + requestStringEntity + "\n");
            }
            uri = newRequest.getURI();
            debug.append("Changed to " + newRequest.getMethod() + " URI: " + uri + "\n");
        }
        if (!isChanges && newRequest instanceof HttpEntityEnclosingRequest) {
            HttpEntityEnclosingRequest entityRequest = ((HttpEntityEnclosingRequest) newRequest);
            if (entityRequest.getEntity() == null) {
                if (httpEntity != null) {
                // already exists
                } else if (requestStringEntity != null) {
                    if (isNewStringEntity) {
                        debug.append("request new Entity:\n" + requestStringEntity + "\n");
                    }
                    httpEntity = new StringEntity(requestStringEntity, "UTF-8");
                } else {
                    httpEntity = new InputStreamEntity(request.getInputStream());
                }
                entityRequest.setEntity(httpEntity);
            }
        }
        Map<AbstractFullSyncListener, JSONArray> listeners = Engine.theApp.couchDbManager.handleBulkDocsRequest(dbName, bulkDocsRequest);
        long requestTime = System.currentTimeMillis();
        CloseableHttpResponse newResponse = null;
        try {
            newResponse = httpClient.get().execute(newRequest);
        } catch (IOException e) {
            debug.append("retry request because: " + e.getMessage());
            newResponse = httpClient.get().execute(newRequest);
        }
        requestTime = System.currentTimeMillis() - requestTime;
        int code = newResponse.getStatusLine().getStatusCode();
        debug.append("response Code: " + code + " in " + requestTime + " ms\n");
        if (isCBLiOS && code == 400) {
            code = 500;
            debug.append("response changed Code to: " + code + " (for iOS CBL)\n");
        }
        response.setStatus(code);
        boolean isCblBulkGet = isCBL && version.compareTo("2.3.") < 0 && isCouchDB && "_bulk_get".equals(special);
        if (!isCblBulkGet) {
            for (Header header : newResponse.getAllHeaders()) {
                if (isCBL && HeaderName.Server.is(header)) {
                    response.addHeader("Server", "Couchbase Sync Gateway/0.81");
                    debug.append("response Header: Server=Couchbase Sync Gateway/0.81\n");
                } else if (!(HeaderName.TransferEncoding.is(header) || HeaderName.ContentLength.is(header) || HeaderName.AccessControlAllowOrigin.is(header) || (isChanges && (HeaderName.ETag.is(header) || HeaderName.LastModified.is(header) || HeaderName.CacheControl.is(header))))) {
                    response.addHeader(header.getName(), header.getValue());
                    debug.append("response Header: " + header.getName() + "=" + header.getValue() + "\n");
                } else {
                    debug.append("skip response Header: " + header.getName() + "=" + header.getValue() + "\n");
                }
            }
            ServletUtils.applyCustomHeaders(request, response);
        }
        HttpEntity responseEntity = newResponse.getEntity();
        ContentTypeDecoder contentType = new ContentTypeDecoder(responseEntity == null || responseEntity.getContentType() == null ? "" : responseEntity.getContentType().getValue());
        debug.append("response ContentType charset=" + contentType.getCharset("n/a") + " mime=" + contentType.getMimeType() + "\n");
        OutputStream os = response.getOutputStream();
        String responseStringEntity = null;
        if (responseEntity != null) {
            // InputStream is = null;
            try (InputStream is = responseEntity.getContent()) {
                if (code >= 200 && code < 300 && !isUtilsRequest && contentType.mimeType().in(MimeType.Plain, MimeType.Json) && !"_design".equals(special) && !requestParser.hasAttachment() && ((isChanges && ((version.compareTo("2.") < 0 && isCouchDB) || !isCouchDB)) || "_bulk_get".equals(special) || "_all_docs".equals(special) || "_all_dbs".equals(special) || StringUtils.isNotEmpty(requestParser.getDocId()) || (bulkDocsRequest != null && listeners != null))) {
                    String charset = contentType.getCharset("UTF-8");
                    try (OutputStreamWriter writer = new OutputStreamWriter(os, charset);
                        BufferedInputStream bis = new BufferedInputStream(is)) {
                        if (isChanges) {
                            Engine.logCouchDbManager.info("(FullSyncServlet) Entering in continuous loop:\n" + debug);
                            try (BufferedReader br = new BufferedReader(new InputStreamReader(bis, charset))) {
                                Engine.theApp.couchDbManager.filterChanges(httpSession.getId(), dbName, uri, fsAuth, br, writer);
                            }
                        } else if (bulkDocsRequest != null) {
                            Engine.logCouchDbManager.info("(FullSyncServlet) Handle bulkDocsRequest:\n" + debug);
                            responseStringEntity = IOUtils.toString(bis, charset);
                            writer.write(responseStringEntity);
                            writer.flush();
                            if (listeners != null) {
                                Engine.theApp.couchDbManager.handleBulkDocsResponse(request, listeners, bulkDocsRequest, responseStringEntity);
                            }
                        } else if (isCblBulkGet) {
                            Engine.logCouchDbManager.info("(FullSyncServlet) Checking text response documents for CBL BulkGet:\n" + debug);
                            Engine.theApp.couchDbManager.checkCblBulkGetResponse(special, fsAuth, bis, charset, response);
                        } else {
                            Engine.logCouchDbManager.info("(FullSyncServlet) Checking response documents:\n" + debug);
                            Engine.theApp.couchDbManager.checkResponse(special, fsAuth, bis, charset, writer);
                        }
                    }
                } else if (code >= 200 && code < 300 && contentType.mimeType() == MimeType.MultiPartRelated && "_bulk_get".equals(special)) {
                    Engine.logCouchDbManager.info("(FullSyncServlet) Checking multipart response documents for CBL BulkGet:\n" + debug);
                    Engine.theApp.couchDbManager.checkCblBulkGetResponse(fsAuth, is, response);
                } else if (Pattern.matches(".*/bundle\\..*?\\.js", uri.getPath())) {
                    StringBuilder sb = new StringBuilder();
                    sb.append(IOUtils.toString(is, "UTF-8").replace("json=function(e){var t", "json=function(e){e=e.replace('../../','../');var t"));
                    sb.append("\n$(\"#primary-navbar\").remove();");
                    byte[] b = sb.toString().getBytes("UTF-8");
                    HeaderName.ContentLength.addHeader(response, Integer.toString(b.length));
                    os.write(b);
                } else if (Pattern.matches(".*/bundle-.*?\\.js", uri.getPath())) {
                    StringBuilder sb = new StringBuilder();
                    sb.append(IOUtils.toString(is, "UTF-8").replace("ajax:function(e,t){", "ajax:function(e,t){console.log('> ' + e.url);if(e.url.startsWith('/')){e.url='..'+e.url}else{e.url=e.url.replace('../..','..')}console.log('< ' + e.url);"));
                    // sb.append("\n$(\"#primary-navbar\").remove();");
                    byte[] b = sb.toString().getBytes("UTF-8");
                    HeaderName.ContentLength.addHeader(response, Integer.toString(b.length));
                    os.write(b);
                } else if (Pattern.matches(".*/styles\\..*?\\.css", uri.getPath())) {
                    StringBuilder sb = new StringBuilder();
                    sb.append(IOUtils.toString(is, "UTF-8"));
                    sb.append("\n.closeMenu #dashboard { left: 0px; }");
                    sb.append("\n.closeMenu .pusher { padding-right: 0px; }");
                    sb.append("\nbutton.add-new-database-btn { display: none; }");
                    sb.append("\n#notification-center-btn { display: none; }");
                    sb.append("\na.fonticon-replicate { display: none; }");
                    sb.append("\n.faux-header__doc-header-dropdown-itemwrapper a.faux-header__doc-header-dropdown-item[href*=\"replication\"] { display: none; }\n");
                    byte[] b = sb.toString().getBytes("UTF-8");
                    HeaderName.ContentLength.addHeader(response, Integer.toString(b.length));
                    os.write(b);
                } else if (requestParser.docId == null && requestParser.special == null && !fsClient.getPrefix().isEmpty()) {
                    String content = IOUtils.toString(is, "UTF-8");
                    content = content.replace("\"db_name\":\"" + fsClient.getPrefix(), "\"db_name\":\"");
                    byte[] bytes = content.getBytes("UTF-8");
                    HeaderName.ContentLength.addHeader(response, Integer.toString(bytes.length));
                    debug.append("response Header: " + HeaderName.ContentLength.value() + "=" + bytes.length + "\n");
                    Engine.logCouchDbManager.info("(FullSyncServlet) Remove prefix from response:\n" + debug);
                    os.write(bytes);
                } else {
                    String contentLength = HeaderName.ContentLength.getHeader(newResponse);
                    if (contentLength != null) {
                        HeaderName.ContentLength.addHeader(response, contentLength);
                        debug.append("response Header: " + HeaderName.ContentLength.value() + "=" + contentLength + "\n");
                    }
                    Engine.logCouchDbManager.info("(FullSyncServlet) Copying response stream:\n" + debug);
                    StreamUtils.copyAutoFlush(is, os);
                }
            } finally {
                newResponse.close();
            }
        }
    } catch (SecurityException e) {
        Engine.logCouchDbManager.warn("(FullSyncServlet) Failed to process request due to a security exception:\n" + e.getMessage() + "\n" + debug);
        response.setStatus(HttpServletResponse.SC_FORBIDDEN);
        HttpUtils.terminateNewSession(httpSession);
    } catch (EngineException e) {
        String message = e.getMessage();
        if (message != null && message.contains("anonymous user")) {
            Engine.logCouchDbManager.warn("(FullSyncServlet) Failed to process request: " + message + "\n" + debug);
        } else {
            Engine.logCouchDbManager.error("(FullSyncServlet) Failed to process request:\n" + debug, e);
        }
        HttpUtils.terminateNewSession(httpSession);
    } catch (Exception e) {
        if ("ClientAbortException".equals(e.getClass().getSimpleName())) {
            Engine.logCouchDbManager.info("(FullSyncServlet) Client disconnected:\n" + debug);
        } else {
            Engine.logCouchDbManager.error("(FullSyncServlet) Failed to process request:\n" + debug, e);
        }
        HttpUtils.terminateNewSession(httpSession);
    } finally {
        Log4jHelper.mdcClear();
        synchronized (httpSession) {
            Set<HttpServletRequest> set = SessionAttribute.fullSyncRequests.get(httpSession);
            if (set != null) {
                set.remove(request);
            }
        }
    }
}
Also used : HttpPost(org.apache.http.client.methods.HttpPost) BodyPart(javax.mail.BodyPart) HttpRequestBase(org.apache.http.client.methods.HttpRequestBase) HttpMethodType(com.twinsoft.convertigo.engine.enums.HttpMethodType) OutputStream(java.io.OutputStream) FileOutputStream(java.io.FileOutputStream) HttpOptions(org.apache.http.client.methods.HttpOptions) EngineException(com.twinsoft.convertigo.engine.EngineException) FullSyncClient(com.twinsoft.convertigo.engine.providers.couchdb.FullSyncClient) HttpPut(org.apache.http.client.methods.HttpPut) ServletException(javax.servlet.ServletException) HttpServletRequest(javax.servlet.http.HttpServletRequest) StringEntity(org.apache.http.entity.StringEntity) MimeMultipart(javax.mail.internet.MimeMultipart) BufferedInputStream(java.io.BufferedInputStream) HttpEntityEnclosingRequest(org.apache.http.HttpEntityEnclosingRequest) AbstractFullSyncListener(com.twinsoft.convertigo.beans.couchdb.AbstractFullSyncListener) CloseableHttpResponse(org.apache.http.client.methods.CloseableHttpResponse) ByteArrayDataSource(javax.mail.util.ByteArrayDataSource) HashSet(java.util.HashSet) FileInputStream(java.io.FileInputStream) FullSyncAuthentication(com.twinsoft.convertigo.engine.providers.couchdb.CouchDbManager.FullSyncAuthentication) URIBuilder(org.apache.http.client.utils.URIBuilder) Project(com.twinsoft.convertigo.beans.core.Project) LogParameters(com.twinsoft.convertigo.engine.LogParameters) JSONObject(org.codehaus.jettison.json.JSONObject) Header(org.apache.http.Header) FileOutputStream(java.io.FileOutputStream) File(java.io.File) Connector(com.twinsoft.convertigo.beans.core.Connector) FullSyncConnector(com.twinsoft.convertigo.beans.connectors.FullSyncConnector) HttpDelete(org.apache.http.client.methods.HttpDelete) HttpEntity(org.apache.http.HttpEntity) AbstractHttpEntity(org.apache.http.entity.AbstractHttpEntity) HttpGet(org.apache.http.client.methods.HttpGet) FullSyncConnector(com.twinsoft.convertigo.beans.connectors.FullSyncConnector) URI(java.net.URI) HttpHead(org.apache.http.client.methods.HttpHead) GZIPInputStream(java.util.zip.GZIPInputStream) AbstractHttpEntity(org.apache.http.entity.AbstractHttpEntity) NameValuePair(org.apache.http.NameValuePair) InputStreamReader(java.io.InputStreamReader) MessagingException(javax.mail.MessagingException) HttpSession(javax.servlet.http.HttpSession) GZIPInputStream(java.util.zip.GZIPInputStream) BufferedInputStream(java.io.BufferedInputStream) FileInputStream(java.io.FileInputStream) InputStream(java.io.InputStream) JSONArray(org.codehaus.jettison.json.JSONArray) JSONException(org.codehaus.jettison.json.JSONException) IOException(java.io.IOException) ServletException(javax.servlet.ServletException) MessagingException(javax.mail.MessagingException) EngineException(com.twinsoft.convertigo.engine.EngineException) UnsupportedEncodingException(java.io.UnsupportedEncodingException) IOException(java.io.IOException) JSONException(org.codehaus.jettison.json.JSONException) InputStreamEntity(org.apache.http.entity.InputStreamEntity) HttpTrace(org.apache.http.client.methods.HttpTrace) BufferedReader(java.io.BufferedReader) ContentTypeDecoder(com.twinsoft.convertigo.engine.util.ContentTypeDecoder) OutputStreamWriter(java.io.OutputStreamWriter) Writer(java.io.Writer) OutputStreamWriter(java.io.OutputStreamWriter)

Example 44 with Connector

use of com.twinsoft.convertigo.beans.core.Connector in project convertigo by convertigo.

the class ReverseProxyServlet method handleRedirect.

private String handleRedirect(String stringLocation, String baseUrl, ProxyHttpConnector currentProxyHttpConnector) {
    Engine.logEngine.debug("ReverseProxyServlet:handleRedirect() requested redirect location: " + stringLocation);
    Engine.logEngine.debug("ReverseProxyServlet:handleRedirect() reverse proxy base url: " + baseUrl);
    for (Connector connector : currentProxyHttpConnector.getProject().getConnectorsList()) {
        if (connector instanceof ProxyHttpConnector) {
            String redirectLocation = stringLocation;
            Engine.logEngine.debug("ReverseProxyServlet:handleRedirect() analyzing connector " + connector.getName());
            ProxyHttpConnector proxyHttpConnector = (ProxyHttpConnector) connector;
            String baseDir = proxyHttpConnector.getBaseDir();
            // comment of #1798
            if ("/".equals(baseDir)) {
                baseDir = "";
            }
            Engine.logEngine.debug("ReverseProxyServlet:handleRedirect()   connector baseDir=" + baseDir);
            String proxyDomainAndPort = "http" + (proxyHttpConnector.isHttps() ? "s" : "") + "://" + getProxyHostAndPort(proxyHttpConnector);
            String proxyBaseUrl = proxyDomainAndPort + baseDir;
            Engine.logEngine.debug("ReverseProxyServlet:handleRedirect()   proxyBaseUrl=" + proxyBaseUrl);
            // Bugfix for #1891
            if (redirectLocation.startsWith("/")) {
                redirectLocation = proxyDomainAndPort + redirectLocation;
                Engine.logEngine.debug("ReverseProxyServlet:handleRedirect()   asbolute path redirect => redirectLocation=" + redirectLocation);
            }
            // Bugfix for #1798 regression about #1718
            if (!redirectLocation.matches(proxyBaseUrl + "((/.*)|$)")) {
                // Bugfix #1718: it probably means the standard port number
                // (80 or 443) has been included
                proxyBaseUrl = "http" + (proxyHttpConnector.isHttps() ? "s" : "") + "://" + proxyHttpConnector.getServer() + ":" + proxyHttpConnector.getPort() + baseDir;
                Engine.logEngine.debug("ReverseProxyServlet:handleRedirect()   update proxyBaseUrl=" + proxyBaseUrl);
            }
            // Bugfix for #1798 regression about #1718
            if (redirectLocation.matches(proxyBaseUrl + "((/.*)|$)")) {
                String newBaseUrl = switchConnector(baseUrl, connector.getName());
                Engine.logEngine.debug("ReverseProxyServlet:handleRedirect()   newBaseUrl=" + newBaseUrl);
                redirectLocation = redirectLocation.replace(proxyBaseUrl, newBaseUrl);
                Engine.logEngine.debug("ReverseProxyServlet:handleRedirect() final redirect location: " + redirectLocation);
                return redirectLocation;
            }
        }
    }
    // Default case: no connector match
    return stringLocation;
}
Also used : HttpConnector(com.twinsoft.convertigo.beans.connectors.HttpConnector) ProxyHttpConnector(com.twinsoft.convertigo.beans.connectors.ProxyHttpConnector) Connector(com.twinsoft.convertigo.beans.core.Connector) ProxyHttpConnector(com.twinsoft.convertigo.beans.connectors.ProxyHttpConnector)

Example 45 with Connector

use of com.twinsoft.convertigo.beans.core.Connector in project convertigo by convertigo.

the class HtmlConnectorDesignComposite method selectionChanged.

public void selectionChanged(SelectionChangedEvent event) {
    if (event.getSource() instanceof ISelectionProvider) {
        IStructuredSelection selection = (IStructuredSelection) event.getSelection();
        TreeObject treeObject = (TreeObject) selection.getFirstElement();
        if (treeObject != null) {
            ConnectorTreeObject connectorTreeObject = treeObject.getConnectorTreeObject();
            if (connectorTreeObject != null) {
                Connector connector = (Connector) connectorTreeObject.getObject();
                if (connector.equals(htmlConnector)) {
                    if (treeObject instanceof TransactionTreeObject) {
                        if (!htmlConnector.isLearning())
                            toolLearn.setEnabled(true);
                    } else {
                        if (!htmlConnector.isLearning())
                            toolLearn.setEnabled(false);
                    }
                } else {
                    if (!htmlConnector.isLearning())
                        toolLearn.setEnabled(false);
                }
            }
        }
    }
}
Also used : ConnectorTreeObject(com.twinsoft.convertigo.eclipse.views.projectexplorer.model.ConnectorTreeObject) HtmlConnector(com.twinsoft.convertigo.beans.connectors.HtmlConnector) HttpConnector(com.twinsoft.convertigo.beans.connectors.HttpConnector) Connector(com.twinsoft.convertigo.beans.core.Connector) TransactionTreeObject(com.twinsoft.convertigo.eclipse.views.projectexplorer.model.TransactionTreeObject) ISelectionProvider(org.eclipse.jface.viewers.ISelectionProvider) TransactionTreeObject(com.twinsoft.convertigo.eclipse.views.projectexplorer.model.TransactionTreeObject) TreeObject(com.twinsoft.convertigo.eclipse.views.projectexplorer.model.TreeObject) ConnectorTreeObject(com.twinsoft.convertigo.eclipse.views.projectexplorer.model.ConnectorTreeObject) IStructuredSelection(org.eclipse.jface.viewers.IStructuredSelection)

Aggregations

Connector (com.twinsoft.convertigo.beans.core.Connector)72 Transaction (com.twinsoft.convertigo.beans.core.Transaction)43 Project (com.twinsoft.convertigo.beans.core.Project)32 EngineException (com.twinsoft.convertigo.engine.EngineException)28 JavelinConnector (com.twinsoft.convertigo.beans.connectors.JavelinConnector)22 Sequence (com.twinsoft.convertigo.beans.core.Sequence)21 HtmlConnector (com.twinsoft.convertigo.beans.connectors.HtmlConnector)17 Step (com.twinsoft.convertigo.beans.core.Step)17 DatabaseObject (com.twinsoft.convertigo.beans.core.DatabaseObject)16 HttpConnector (com.twinsoft.convertigo.beans.connectors.HttpConnector)15 SiteClipperConnector (com.twinsoft.convertigo.beans.connectors.SiteClipperConnector)14 ScreenClass (com.twinsoft.convertigo.beans.core.ScreenClass)14 HtmlTransaction (com.twinsoft.convertigo.beans.transactions.HtmlTransaction)14 TreeObject (com.twinsoft.convertigo.eclipse.views.projectexplorer.model.TreeObject)12 CouchDbConnector (com.twinsoft.convertigo.beans.connectors.CouchDbConnector)11 SqlConnector (com.twinsoft.convertigo.beans.connectors.SqlConnector)11 Statement (com.twinsoft.convertigo.beans.core.Statement)11 ElseStep (com.twinsoft.convertigo.beans.steps.ElseStep)11 ThenStep (com.twinsoft.convertigo.beans.steps.ThenStep)11 ProjectExplorerView (com.twinsoft.convertigo.eclipse.views.projectexplorer.ProjectExplorerView)11