//String IOMLCode::encodeUrl(shared_ptr<OMLContext> context, shared_ptr<OMLItem> i, const String& href, OMLRenderUrlDestination& destination, bool onlyExternalWithoutConfirm) String IOMLCode::encodeUrl(shared_ptr<OMLContext> context, shared_ptr<OMLItem> i, const String& href, OMLRenderUrlDestination destination, bool onlyExternalWithoutConfirm) { if(context->getMode() == omlRenderModeSearch) // 0.15 return href; shared_ptr<const IPortalPage> portalPage = context->getPortalPage(); bool redirect = false; bool confirm = false; //String confirmMessage; String out = cleanUrl(context, href); OsirisLink osirisLink(out.to_ascii()); if(osirisLink.isValid()) { if(osirisLink.getType() == OsirisLink::linkPortal) { destination = omlRenderUrlDestinationSame; } else if(osirisLink.getType() == OsirisLink::linkIsis) { destination = omlRenderUrlDestinationSame; } else if(osirisLink.getType() == OsirisLink::linkUrl) { if(onlyExternalWithoutConfirm) return String::EMPTY; if(context->checkPortalPageAvailable(i) == false) return String::EMPTY; // Internal page url String urlPage = osirisLink.getParam("url"); if(urlPage.substr(0,1) != _S("/")) urlPage = _S("/") + urlPage; if( (urlPage.substr(0,9) == _S("/portals/")) ) { if(urlPage.find(_S("?")) == String::npos) urlPage += _S("?"); else urlPage += _S("&"); std::string pov; if(osirisLink.hasParam("portal")) pov = osirisLink.getPortal().getString(); else pov = portalPage->getPortal()->getPortalID().getString(); // Portal param maybe a Portal or a POV. if(pov.length() == 40) // If is a Portal, convert to POV. { PortalID portalID(pov); if(portalID == portalPage->getPortal()->getPortalID()) pov = Portal::generatePovID(portalID, portalPage->getPortal()->getPovID()); else { shared_ptr<Portal> externalPortal = PortalsSystem::instance()->getFirstPortal(portalID); if(externalPortal) pov = Portal::generatePovID(portalID, externalPortal->getPovID()); else { // We don't have the requested portal. return String::EMPTY; } } } else { shared_ptr<Portal> externalPortal = PortalsSystem::instance()->getPortalByFullPov(pov); if(externalPortal == nullptr) { // We don't have the requested portal. return String::EMPTY; } } urlPage += _S("portal=") + pov; /* // Normally the "portal" param is mandatory PortalID portalID = portalPage->getPortal()->getPortalID(); if(osirisLink.hasParam("portal")) portalID = osirisLink.getPortal(); // Normally the "user" param is absent. Because we want to avoid that changing POV will break urls. urlPage += _S("&user="******"user")) urlPage += osirisLink.getUser().getString(); else { // If the link is internal to the current portal, use the current user. if(portalID == portalPage->getPortal()->getPortalID()) urlPage += portalPage->getPortal()->getUserID().getString(); else { shared_ptr<Portal> externalPortal = PortalsSystem::instance()->getFirstPortal(portalID); if(externalPortal) urlPage += externalPortal->getUserID().getString(); else { // We don't have the requested portal. return String::EMPTY; } } } */ out = urlPage; //out = String::format(_S("%s").c_str(), url.toString()); } else { // Main url //out = String::format(_S("%S").c_str(), urlPage.c_str()); out = urlPage; } } else if(osirisLink.getType() == OsirisLink::linkFile) { if(onlyExternalWithoutConfirm) return String::EMPTY; if(context->checkPortalPageAvailable(i) == false) return String::EMPTY; // Internal file url out = portalPage->getPortal()->getFileLink(EntityID(String(osirisLink.getParam("id")).to_ascii())); } else context->addWarningInvalidUrl(i, out); if(context->getMode() == omlRenderModeExternal) out = IdeSystem::instance()->getLocalUrl(out); /* StringVector params; utils::split(out,_S("|"), params); if(params.size()<2) { context->addWarningInvalidUrl(i, out); return String::EMPTY; } if(params[1] == _S("portal")) { destination = omlRenderUrlDestinationSame; } else if(params[1] == _S("isis")) { destination = omlRenderUrlDestinationSame; } else if(params[1] == _S("url")) { if(onlyExternalWithoutConfirm) return String::EMPTY; if(params.size()<3) { context->addWarningInvalidUrl(i, out); return String::EMPTY; } // Internal page url String urlPage = params[2]; String urlParams = (params.size() == 3) ? String::EMPTY : params[3]; if(urlPage.substr(0,1) != _S("/")) urlPage = _S("/") + urlPage; if( (urlPage.substr(0,9) == _S("/portals/")) ) { // Portal url if(urlParams.find(OS_URL_PARAM_PORTAL + String(_S("="))) == String::npos) { if(context->checkPortalPageAvailable(i) == false) return String::EMPTY; if(!urlParams.empty()) urlParams += _S("&"); //urlParams += String::format(_S("%S=%S").c_str(), OS_URL_PARAM_PORTAL.c_str(),portalPage->getLoggedUser()->getPortal()->getID().toString().c_str()); urlParams.append(OS_URL_PARAM_PORTAL); urlParams.append("="); urlParams.append(portalPage->getLoggedUser()->getPortal()->getPortalID().getString()); urlParams.append("&"); urlParams.append(OS_URL_PARAM_USER); urlParams.append("="); urlParams.append(portalPage->getLoggedUser()->getPortal()->getUserID().getString()); } out = String::format(_S("%S?%S").c_str(), urlPage.c_str(),urlParams.c_str()); } else { // Main url out = String::format(_S("%S?%S").c_str(), urlPage.c_str(),urlParams.c_str()); } } else if(params[1] == _S("file")) { if(onlyExternalWithoutConfirm) return String::EMPTY; if(context->checkPortalPageAvailable(i) == false) return String::EMPTY; if(params.size()<3) { context->addWarningInvalidUrl(i, out); return String::EMPTY; } // Internal file url String oId = params[2]; out = portalPage->getLoggedUser()->getPortal()->getFileLink(ObjectID(oId.to_ascii())); } if(context->getMode() == omlRenderModeExternal) out = IdeSystem::instance()->getLocalUrl(out); */ } else { String protocol = extractProtocol(out); if(protocol == String::EMPTY) { // Osiris 0.13 // If protocol can't be determined, it's a relative url. Relative url are accepted. if(context->getMode() == omlRenderModeExternal) out = IdeSystem::instance()->getLocalUrl(out); } else { if(context->getMode() == omlRenderModeExternal) { redirect = false; confirm = false; } else { // Se non sono abilitati i link esterni if( (context->getSecure()) || (!bool(context->getPage()->getOption(Options::privacy_options::allow_external_urls))) ) { context->setSecureCheck(false); return String::EMPTY; } else { if(onlyExternalWithoutConfirm) { String protocolsCollectOption = context->getPage()->getOption(Options::url_options::protocols_collect); if(protocolsCollectOption.empty()) { return String::EMPTY; } else if(protocolsCollectOption == _S("*")) { redirect = false; confirm = false; } else if(regex_match(protocol, RegexManager::instance()->getRegex(_S("\\b(") + protocolsCollectOption + _S(")"), true))) { redirect = false; confirm = false; } else if(regex_match(out, RegexManager::instance()->getRegex(_S("\\b(") + protocolsCollectOption + _S(")\\b"), true))) { redirect = false; confirm = false; } else { return String::EMPTY; } } else { // Se il protocollo richiede una redirect // 0.12: Viene testato non solo il protocollo, ma anche l'url. Per ora, per supportare OffSystem. // Solo l'inizio dell'url, per evitare conflitti. String protocolsNoRedirectOption = context->getPage()->getOption(Options::url_options::protocols_no_redirect); if(protocolsNoRedirectOption.empty()) { redirect = true; } else if(protocolsNoRedirectOption == _S("*")) { redirect = false; destination = omlRenderUrlDestinationSame; } else if(regex_match(protocol, RegexManager::instance()->getRegex(_S("\\b(") + protocolsNoRedirectOption + _S(")\\b"), true))) { redirect = false; destination = omlRenderUrlDestinationSame; } else if(regex_match(out, RegexManager::instance()->getRegex(_S("\\b(") + protocolsNoRedirectOption + _S(")"), true))) { redirect = false; destination = omlRenderUrlDestinationSame; } else { redirect = true; } // Se il protocollo richiede una conferma // 0.12: Viene testato non solo il protocollo, ma anche l'url. Per ora, per supportare OffSystem. // Solo l'inizio dell'url, per evitare conflitti. String protocolsNoConfirmOption = context->getPage()->getOption(Options::url_options::protocols_no_confirm); if(protocolsNoConfirmOption.empty()) { confirm = true; } else if(protocolsNoConfirmOption == _S("*")) { confirm = false; } else if(regex_match(protocol, RegexManager::instance()->getRegex(_S("\\b(") + protocolsNoConfirmOption + _S(")"), true))) { confirm = false; } else if(regex_match(out, RegexManager::instance()->getRegex(_S("\\b(") + protocolsNoConfirmOption + _S(")\\b"), true))) { confirm = false; } else { confirm = true; } } } } } } // Encoding html //out = HttpParser::urlEncode(out); out = encode(context, out); // Basato su IPB 2.1, converto i '\' in '#092' // Questo perchè in un url se scrivo "\0040" viene interpretato quel carattere unicode. out.replace_all(_S("\\"), _S("#092")); if( (redirect) || (confirm) ) { // Added 0.12 out = String(context->getPage()->getOption(Options::web_options::redirect_url)).replace_all(_S("#url#"), out); out = PortalsSystem::instance()->getExternalLink(out.to_ascii(), confirm); } /* confirmMessage = encodeJavascriptString(confirmMessage); if((inNewWindow) || (!confirmMessage.empty())) out = String::format(_S("javascript:osRedirect('%S','%S',%d);").c_str(), out.c_str(),confirmMessage.c_str(),inNewWindow); */ return out; }
bool CompatibilityManager::upgradeContentOML(const shared_ptr<IPortalDatabase> &database, const String &tableName, const String& fieldName, bool xmlEncoded) { NotificationsManager::instance()->notify(_S("Migration (OML texts) of '") + database->getPortal()->getName() + _S("' to 1.0 series")); DataTable result; String sql = _S("select id,") + fieldName + _S(" as oml from ") + tableName; //database->execute(sql,result); shared_ptr<IDbResult> result2 = database->getConnection()->query(sql); result2->init(result); DataTableRow row = result.addRow(); //String patch; //for(uint32 r=0;r<result.rows();r++) while(result2->end() == false) { result2->bind(row); //String id = result.get(r,_S("id")); //String oml = result.get(r,_S("oml")); String id = *row[_S("id")]; String omlOrig = *row[_S("oml")]; String oldOml = omlOrig; // portal=0D2C4E505C1D98B221E222CABE4E167BECB2D669 #ifdef OS_NOOBJECTID omlOrig = RegexManager::instance()->replace(omlOrig, _S("[0-1][0-9]0[0-1]000[0-4]([0-9A-F]{40})"), _S("$1"), false); #else omlOrig = RegexManager::instance()->replace(omlOrig, _S("[0-1][0-9]0[0-1]000[2-4]([0-9A-F]{40})"), _S("$1"), false); #endif String oml = omlOrig; /* bool xmlEncoded = false; if(oml.starts_with(_S("<?xml version=\"1.0\" encoding=\"UTF-16\" standalone=\"no\" ?>"))) { oml = HtmlParser::instance()->decode(omlOrig); xmlEncoded = true; }*/ if(xmlEncoded) oml = HtmlParser::instance()->decode(omlOrig); int nReplace = 0; String::size_type lastPosLink = 0; for(;;) { nReplace++; String::size_type posLink = oml.find(_S("osiris://"),lastPosLink); if(posLink == String::npos) break; String::size_type posEnd = String::npos; { String::size_type posEndC = oml.find(_S("\""), posLink+1); if( (posEndC != String::npos) && ( (posEndC<posEnd) || (posEnd == String::npos) ) ) posEnd = posEndC; } { String::size_type posEndC = oml.find(_S("'"), posLink+1); if( (posEndC != String::npos) && ( (posEndC<posEnd) || (posEnd == String::npos) ) ) posEnd = posEndC; } { String::size_type posEndC = oml.find(_S("["), posLink+1); if( (posEndC != String::npos) && ( (posEndC<posEnd) || (posEnd == String::npos) ) ) posEnd = posEndC; } { String::size_type posEndC = oml.find(_S("]"), posLink+1); if( (posEndC != String::npos) && ( (posEndC<posEnd) || (posEnd == String::npos) ) ) posEnd = posEndC; } String linkEx = oml.substr(posLink); bool valid = true; bool warning = true; if(posEnd == String::npos) valid = false; if(valid) { String link = oml.substr(posLink, posEnd-posLink); if( (link == _S("osiris://")) ) { valid = false; warning = false; } else if( (link == _S("osiris://.")) ) { valid = false; warning = false; } else { OsirisLink osirisLink(link.to_ascii()); if(osirisLink.isValid() == false) valid = false; else { String linkNew = osirisLink.generate(); oml = oml.replace_all(link, linkNew); if(id == _S("FE10596C2B406B19020DE70118C5A36208CE7B06")) { valid = true; } if(xmlEncoded == false) omlOrig = omlOrig.replace_all(link, linkNew); else omlOrig = omlOrig.replace_all(HtmlParser::instance()->encodeEx(link), HtmlParser::instance()->encodeEx(linkNew)); //m_DebugLog += id + _S(" --> ") + link + _S(" --> ") + linkNew + _S("\r\n"); } } } if(valid == false) { linkEx = linkEx.replace_all(_S("\r"),_S(" {\\r} ")); linkEx = linkEx.replace_all(_S("\n"),_S(" {\\n} ")); m_DebugLog += id + _S(" --> ") + linkEx + _S(" --> invalid!\r\n"); lastPosLink = posLink+1; } if(nReplace == 10000) // Something wrong. return false; } // Qui rilevo eventuale parametro 'portal' della 0.x. Lo converto nel nuovo ID. if(omlOrig != oldOml) { String sql = _S("update ") + tableName + _S(" set ") + fieldName + _S("=") + Convert::toSQL(omlOrig) + _S(" where id='") + id + _S("'"); if(database->execute(sql) == false) return false; //patch.append(); } result2->moveNext(); } /* if(patch.empty() == false) if(database->execute(patch) == false) return false; */ return true; }
// Se è un url di un'immagine interna, valorizza in objectID l'oggetto a cui si riferisce. String IOMLCode::encodeResourceUrlEx(shared_ptr<OMLContext> context, shared_ptr<OMLItem> i, const String& href, String& entityID) { if(context->getMode() == omlRenderModeSearch) // 0.15 return href; String src = cleanUrl(context, href); OsirisLink osirisLink(src.to_ascii()); if(osirisLink.isValid()) { if(osirisLink.getType() == OsirisLink::linkResource) { src = context->getPage()->getSkin()->getResourceUrl(osirisLink.getParam("path")); if(src.empty()) { src = context->getPage()->getSkin()->getResourceUrl(_S("images/oml/img_missing.gif")); } if(context->getMode() == omlRenderModeExternal) src = IdeSystem::instance()->getLocalUrl(src); } else if(osirisLink.getType() == OsirisLink::linkFile) { shared_ptr<Portal> portal = nullptr; shared_ptr<const IPortalPage> page = context->getPortalPage(); if(osirisLink.hasParam("portal")) { PortalID portalID = osirisLink.getPortal(); if( (page != nullptr) && (portalID == page->getPortal()->getPortalID()) ) // Force the use of the current POV portal = page->getPortal(); else { portal = PortalsSystem::instance()->getFirstPortal(portalID); } } else { shared_ptr<const IPortalPage> page = context->getPortalPage(); if(page != nullptr) { portal = page->getPortal(); } } if(portal != nullptr) { String id = osirisLink.getParam("id"); shared_ptr<EntitiesEntity> entity = portal->getEntity(page->getDatabase(), EntityID(id.to_ascii())); shared_ptr<ObjectsIObject> current = entity ? entity->getCurrent() : nullptr; if( (current != nullptr) && (current->getObjectType() == portalObjectTypeFile) ) { src = portal->getFileLink(id.to_ascii()); entityID = id.to_ascii(); } else { src = context->getPage()->getSkin()->getResourceUrl(_S("images/oml/img_unknown.gif")); } if(context->getMode() == omlRenderModeExternal) src = IdeSystem::instance()->getLocalUrl(src); } } } else { String protocol = extractProtocol(src); if( (protocol == _S("http")) || (protocol == _S("https")) ) { if(context->getMode() == omlRenderModeExternal) { } else { // Check se sono abilitati i link esterni if((context->getSecure()) || (!bool(context->getPage()->getOption(Options::privacy_options::allow_external_images)))) { context->setSecureCheck(false); src = context->getPage()->getSkin()->getResourceUrl(_S("images/oml/img_notallowed.gif")); } } } else if(protocol == String::EMPTY) { // Osiris 0.13 // If protocol can't be determined, it's a relative url. Relative url are accepted. if(context->getMode() == omlRenderModeExternal) src = IdeSystem::instance()->getLocalUrl(src); return src; } else { context->addWarningInvalidUrl(i, src); src = String::EMPTY; } } return src; }