sc/inc/stringutil.hxx | 7 +++++++ sc/source/core/data/column3.cxx | 10 +++++++--- sc/source/core/data/documentimport.cxx | 9 ++++++++- sc/source/core/tool/stringutil.cxx | 3 ++- sc/source/filter/rtf/eeimpars.cxx | 1 + sc/source/ui/docshell/impex.cxx | 17 +++++------------ 6 files changed, 30 insertions(+), 17 deletions(-)
New commits: commit 15c14abc62d7a46bb4769c452b1cf9f7c2a48c5b Author: Eike Rathke <er...@redhat.com> Date: Tue Feb 13 18:45:09 2018 +0100 Force CheckLinkFormulaNeedingCheck() only if no ScSetStringParam given And ensure that if one is given mbCheckLinkFormula is set. Change-Id: I4eb70825ce4db5a59aa37d98ae40698e4ab81c3c diff --git a/sc/source/core/data/documentimport.cxx b/sc/source/core/data/documentimport.cxx index f53bca4cdaaf..a4161d9071f1 100644 --- a/sc/source/core/data/documentimport.cxx +++ b/sc/source/core/data/documentimport.cxx @@ -189,6 +189,10 @@ void ScDocumentImport::setAutoInput(const ScAddress& rPos, const OUString& rStr, if (!pBlockPos) return; + // If ScSetStringParam was given, ScColumn::ParseString() shall take care + // of checking. Ensure caller said so. + assert(!pStringParam || pStringParam->mbCheckLinkFormula); + ScCellValue aCell; pTab->aCol[rPos.Col()].ParseString( aCell, rPos.Row(), rPos.Tab(), rStr, mpImpl->mrDoc.GetAddressConvention(), pStringParam); @@ -209,7 +213,8 @@ void ScDocumentImport::setAutoInput(const ScAddress& rPos, const OUString& rStr, pBlockPos->miCellPos = rCells.set(pBlockPos->miCellPos, rPos.Row(), aCell.mfValue); break; case CELLTYPE_FORMULA: - mpImpl->mrDoc.CheckLinkFormulaNeedingCheck( *aCell.mpFormula->GetCode()); + if (!pStringParam) + mpImpl->mrDoc.CheckLinkFormulaNeedingCheck( *aCell.mpFormula->GetCode()); // This formula cell instance is directly placed in the document without copying. pBlockPos->miCellPos = rCells.set(pBlockPos->miCellPos, rPos.Row(), aCell.mpFormula); aCell.mpFormula = nullptr; commit 60dcdcb82edff93f682586f930b9516c0010f777 Author: Eike Rathke <er...@redhat.com> Date: Tue Feb 13 18:32:15 2018 +0100 Use ScSetStringParam::mbCheckLinkFormula in simple ScImportExport::Text2Doc() Change-Id: I59f5ebd1056c7c0caa89ba2754e6feaa34cc1a43 diff --git a/sc/source/ui/docshell/impex.cxx b/sc/source/ui/docshell/impex.cxx index 088f6d977041..146c097626e1 100644 --- a/sc/source/ui/docshell/impex.cxx +++ b/sc/source/ui/docshell/impex.cxx @@ -848,6 +848,9 @@ bool ScImportExport::Text2Doc( SvStream& rStrm ) pSeps[0] = cSep; pSeps[1] = 0; + ScSetStringParam aSetStringParam; + aSetStringParam.mbCheckLinkFormula = true; + SCCOL nStartCol = aRange.aStart.Col(); SCROW nStartRow = aRange.aStart.Row(); SCCOL nEndCol = aRange.aEnd.Col(); @@ -897,7 +900,7 @@ bool ScImportExport::Text2Doc( SvStream& rStrm ) if (nRow>nEndRow) nEndRow = nRow; } if( bData && nCol <= nEndCol && nRow <= nEndRow ) - pDoc->SetString( nCol, nRow, aRange.aStart.Tab(), aCell ); + pDoc->SetString( nCol, nRow, aRange.aStart.Tab(), aCell, &aSetStringParam ); } else // too many columns/rows { commit bcd62f2050336951ad56892d6e0a42f63c59a674 Author: Eike Rathke <er...@redhat.com> Date: Tue Feb 13 18:08:28 2018 +0100 CheckLinkFormulaNeedingCheck() for ScDocumentImport::setFormulaCell() Change-Id: I1587be914b390b2597185dd5af870d1d785010a4 diff --git a/sc/source/core/data/documentimport.cxx b/sc/source/core/data/documentimport.cxx index c86065b881ed..f53bca4cdaaf 100644 --- a/sc/source/core/data/documentimport.cxx +++ b/sc/source/core/data/documentimport.cxx @@ -285,6 +285,8 @@ void ScDocumentImport::setFormulaCell( std::unique_ptr<ScFormulaCell> pFC = o3tl::make_unique<ScFormulaCell>(&mpImpl->mrDoc, rPos, rFormula, eGrammar); + mpImpl->mrDoc.CheckLinkFormulaNeedingCheck( *pFC->GetCode()); + if (pResult) { // Set cached result to this formula cell. commit d0a230db23410d68ed55f6518de242f83fe8d1bd Author: Eike Rathke <er...@redhat.com> Date: Tue Feb 13 17:39:34 2018 +0100 Use ScSetStringParam::mbCheckLinkFormula instead ... of obtaining the formula cell again. Change-Id: I37978744577a45c0234d2bfa222e96de548786e6 diff --git a/sc/source/ui/docshell/impex.cxx b/sc/source/ui/docshell/impex.cxx index da9d0c7bc9e2..088f6d977041 100644 --- a/sc/source/ui/docshell/impex.cxx +++ b/sc/source/ui/docshell/impex.cxx @@ -1213,21 +1213,11 @@ static bool lcl_PutString( aParam.mbDetectNumberFormat = bDetectNumFormat; aParam.meSetTextNumFormat = ScSetStringParam::SpecialNumberOnly; aParam.mbHandleApostrophe = false; + aParam.mbCheckLinkFormula = true; if ( bUseDocImport ) rDocImport.setAutoInput(ScAddress(nCol, nRow, nTab), rStr, &aParam); else - { pDoc->SetString( nCol, nRow, nTab, rStr, &aParam ); - // ScColumn::ParseString() is strict about the first character - // having to be '=' for formula, so we can use that here and don't - // need to obtain the created cell for each and every value. - if (rStr.getLength() > 1 && rStr[0] == '=') - { - const ScFormulaCell* pFC = pDoc->GetFormulaCell( ScAddress( nCol, nRow, nTab)); - if (pFC) - pDoc->CheckLinkFormulaNeedingCheck( *pFC->GetCode()); - } - } } else { commit 98c0bd7ffd008015623b2c5eb8630649394d76f6 Author: Eike Rathke <er...@redhat.com> Date: Tue Feb 13 17:16:38 2018 +0100 ScSetStringParam::mbCheckLinkFormula for HTML and RTF import Change-Id: I7cf7cf12142322cbffd5160e9a8dce55efd36be5 diff --git a/sc/source/filter/rtf/eeimpars.cxx b/sc/source/filter/rtf/eeimpars.cxx index 267c84d7cf80..b07ddecf9ae5 100644 --- a/sc/source/filter/rtf/eeimpars.cxx +++ b/sc/source/filter/rtf/eeimpars.cxx @@ -341,6 +341,7 @@ void ScEEImport::WriteToDocument( bool bSizeColsRows, double nOutputFactor, SvNu aParam.mbDetectNumberFormat = true; aParam.meSetTextNumFormat = ScSetStringParam::SpecialNumberOnly; aParam.mbHandleApostrophe = false; + aParam.mbCheckLinkFormula = true; if (!aValStr.isEmpty()) mpDoc->SetValue( nCol, nRow, nTab, fVal ); commit 271d9ebfe0c4fc57ea6f01a9c048021e5429dd15 Author: Eike Rathke <er...@redhat.com> Date: Tue Feb 13 17:11:47 2018 +0100 Handle ScSetStringParam::mbCheckLinkFormula in ScColumn::ParseString() Change-Id: Id6b0705140baacdb872560f7031efaf0c03f0e00 diff --git a/sc/source/core/data/column3.cxx b/sc/source/core/data/column3.cxx index 3343ea782383..d42b4479b5d5 100644 --- a/sc/source/core/data/column3.cxx +++ b/sc/source/core/data/column3.cxx @@ -1727,11 +1727,15 @@ bool ScColumn::ParseString( rCell.set(rPool.intern(rString)); } else // = Formula - rCell.set( - new ScFormulaCell( + { + ScFormulaCell* pFormulaCell = new ScFormulaCell( GetDoc(), ScAddress(nCol, nRow, nTabP), rString, formula::FormulaGrammar::mergeToGrammar(formula::FormulaGrammar::GRAM_DEFAULT, eConv), - ScMatrixMode::NONE)); + ScMatrixMode::NONE); + if (aParam.mbCheckLinkFormula) + GetDoc()->CheckLinkFormulaNeedingCheck( *pFormulaCell->GetCode()); + rCell.set( pFormulaCell); + } } else if ( cFirstChar == '\'') // 'Text { commit 5a93c51e3b7f455ff5d4cfc9e8b6e510fc126b75 Author: Eike Rathke <er...@redhat.com> Date: Tue Feb 13 17:10:21 2018 +0100 Introduce ScSetStringParam::mbCheckLinkFormula Change-Id: I2028fc53f9778606778cd8629611752acd3f1a1c diff --git a/sc/inc/stringutil.hxx b/sc/inc/stringutil.hxx index 34c4ce246b9f..ff2bc9cd74cd 100644 --- a/sc/inc/stringutil.hxx +++ b/sc/inc/stringutil.hxx @@ -93,6 +93,13 @@ struct SAL_WARN_UNUSED SC_DLLPUBLIC ScSetStringParam sc::StartListeningType meStartListening; + /** When true and the string results in a compiled formula, check the + formula tokens for presence of functions that could trigger access to + external resources. This is to be set to true in import filter code, + but not for user input. + */ + bool mbCheckLinkFormula; + ScSetStringParam(); /** diff --git a/sc/source/core/tool/stringutil.cxx b/sc/source/core/tool/stringutil.cxx index 62a7f0d53490..ba5923896e38 100644 --- a/sc/source/core/tool/stringutil.cxx +++ b/sc/source/core/tool/stringutil.cxx @@ -30,7 +30,8 @@ ScSetStringParam::ScSetStringParam() : mbDetectNumberFormat(true), meSetTextNumFormat(Never), mbHandleApostrophe(true), - meStartListening(sc::SingleCellListening) + meStartListening(sc::SingleCellListening), + mbCheckLinkFormula(false) { } _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits