Changeset 60957 in webkit


Ignore:
Timestamp:
Jun 10, 2010 7:31:34 AM (14 years ago)
Author:
eric@webkit.org
Message:

2010-06-10 Daniel Cheng <dcheng@chromium.org>

Reviewed by Jian Li.

Don't convert filenames to URLs in edit drags.
https://bugs.webkit.org/show_bug.cgi?id=38826

For security reasons, we don't want to expose file system paths to web
content, so we filter them out of edit drags.

  • editing/pasteboard/file-drag-to-editable-expected.txt: Added.
  • editing/pasteboard/file-drag-to-editable.html: Added.
  • editing/pasteboard/script-tests/file-drag-to-editable.js: Added.
  • platform/gtk/Skipped:
  • platform/mac/Skipped:
  • platform/qt/Skipped:
  • platform/win/Skipped:

2010-06-10 Daniel Cheng <dcheng@chromium.org>

Reviewed by Jian Li.

Don't convert filenames to URLs in edit drags.
https://bugs.webkit.org/show_bug.cgi?id=38826

For security reasons, we don't want to expose file system paths to web
content, so we filter them out of edit drags.

Test: editing/pasteboard/file-drag-to-editable.html

  • page/DragController.cpp: (WebCore::documentFragmentFromDragData):
  • platform/DragData.h: (WebCore::DragData::):
  • platform/android/DragDataAndroid.cpp: (WebCore::DragData::containsURL): (WebCore::DragData::asURL):
  • platform/chromium/DragDataChromium.cpp: (WebCore::DragData::containsURL): (WebCore::DragData::asURL):
  • platform/efl/DragDataEfl.cpp: (WebCore::DragData::containsURL): (WebCore::DragData::asURL):
  • platform/gtk/DragDataGtk.cpp: (WebCore::DragData::containsURL): (WebCore::DragData::asURL):
  • platform/haiku/DragDataHaiku.cpp: (WebCore::DragData::containsURL): (WebCore::DragData::asURL):
  • platform/mac/DragDataMac.mm: (WebCore::DragData::containsURL): (WebCore::DragData::asURL):
  • platform/qt/DragDataQt.cpp: (WebCore::DragData::asPlainText): (WebCore::DragData::containsURL): (WebCore::DragData::asURL):
  • platform/win/ClipboardUtilitiesWin.cpp: (WebCore::getURL): (WebCore::getPlainText):
  • platform/win/ClipboardUtilitiesWin.h:
  • platform/win/ClipboardWin.cpp: (WebCore::ClipboardWin::getData):
  • platform/win/DragDataWin.cpp: (WebCore::DragData::containsURL): (WebCore::DragData::asURL):
  • platform/wince/DragDataWince.cpp: (WebCore::DragData::containsURL): (WebCore::DragData::asURL):
  • platform/wx/DragDataWx.cpp: (WebCore::DragData::containsURL): (WebCore::DragData::asURL):
Location:
trunk
Files:
3 added
21 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r60956 r60957  
     12010-06-10  Daniel Cheng  <dcheng@chromium.org>
     2
     3        Reviewed by Jian Li.
     4
     5        Don't convert filenames to URLs in edit drags.
     6        https://bugs.webkit.org/show_bug.cgi?id=38826
     7
     8        For security reasons, we don't want to expose file system paths to web
     9        content, so we filter them out of edit drags.
     10
     11        * editing/pasteboard/file-drag-to-editable-expected.txt: Added.
     12        * editing/pasteboard/file-drag-to-editable.html: Added.
     13        * editing/pasteboard/script-tests/file-drag-to-editable.js: Added.
     14        * platform/gtk/Skipped:
     15        * platform/mac/Skipped:
     16        * platform/qt/Skipped:
     17        * platform/win/Skipped:
     18
    1192010-06-10  Marcus Bulach  <bulach@google.com>
    220
  • trunk/LayoutTests/platform/gtk/Skipped

    r60936 r60957  
    666666editing/pasteboard/copy-in-password-field.html
    667667editing/pasteboard/drag-image-in-about-blank-frame.html
     668editing/pasteboard/file-drag-to-editable.html
    668669editing/pasteboard/file-input-files-access.html
    669670editing/pasteboard/get-data-text-plain-drop.html
  • trunk/LayoutTests/platform/mac/Skipped

    r60911 r60957  
    295295fast/dom/Geolocation/reentrant-error.html
    296296fast/dom/Geolocation/reentrant-success.html
     297
     298# Filenames aren't filtered out from edit drags yet, see https://bugs.wekit.org/show_bug.cgi?id=38826
     299editing/pasteboard/file-drag-to-editable.html
  • trunk/LayoutTests/platform/qt/Skipped

    r60936 r60957  
    830830# ------- missing eventSender.beginDragWithFiles
    831831editing/pasteboard/dataTransfer-setData-getData.html
     832editing/pasteboard/file-drag-to-editable.html
    832833editing/pasteboard/file-input-files-access.html
    833834fast/dom/Window/window-postmessage-clone.html
  • trunk/LayoutTests/platform/win/Skipped

    r60822 r60957  
    193193# <rdar://problem/5230396> eventSender.beginDragWithFiles is unimplemented
    194194editing/pasteboard/dataTransfer-setData-getData.html
     195editing/pasteboard/file-drag-to-editable.html
    195196editing/pasteboard/file-input-files-access.html
    196197fast/events/drag-to-navigate.html
  • trunk/WebCore/ChangeLog

    r60955 r60957  
     12010-06-10  Daniel Cheng  <dcheng@chromium.org>
     2
     3        Reviewed by Jian Li.
     4
     5        Don't convert filenames to URLs in edit drags.
     6        https://bugs.webkit.org/show_bug.cgi?id=38826
     7
     8        For security reasons, we don't want to expose file system paths to web
     9        content, so we filter them out of edit drags.
     10
     11        Test: editing/pasteboard/file-drag-to-editable.html
     12
     13        * page/DragController.cpp:
     14        (WebCore::documentFragmentFromDragData):
     15        * platform/DragData.h:
     16        (WebCore::DragData::):
     17        * platform/android/DragDataAndroid.cpp:
     18        (WebCore::DragData::containsURL):
     19        (WebCore::DragData::asURL):
     20        * platform/chromium/DragDataChromium.cpp:
     21        (WebCore::DragData::containsURL):
     22        (WebCore::DragData::asURL):
     23        * platform/efl/DragDataEfl.cpp:
     24        (WebCore::DragData::containsURL):
     25        (WebCore::DragData::asURL):
     26        * platform/gtk/DragDataGtk.cpp:
     27        (WebCore::DragData::containsURL):
     28        (WebCore::DragData::asURL):
     29        * platform/haiku/DragDataHaiku.cpp:
     30        (WebCore::DragData::containsURL):
     31        (WebCore::DragData::asURL):
     32        * platform/mac/DragDataMac.mm:
     33        (WebCore::DragData::containsURL):
     34        (WebCore::DragData::asURL):
     35        * platform/qt/DragDataQt.cpp:
     36        (WebCore::DragData::asPlainText):
     37        (WebCore::DragData::containsURL):
     38        (WebCore::DragData::asURL):
     39        * platform/win/ClipboardUtilitiesWin.cpp:
     40        (WebCore::getURL):
     41        (WebCore::getPlainText):
     42        * platform/win/ClipboardUtilitiesWin.h:
     43        * platform/win/ClipboardWin.cpp:
     44        (WebCore::ClipboardWin::getData):
     45        * platform/win/DragDataWin.cpp:
     46        (WebCore::DragData::containsURL):
     47        (WebCore::DragData::asURL):
     48        * platform/wince/DragDataWince.cpp:
     49        (WebCore::DragData::containsURL):
     50        (WebCore::DragData::asURL):
     51        * platform/wx/DragDataWx.cpp:
     52        (WebCore::DragData::containsURL):
     53        (WebCore::DragData::asURL):
     54
    1552010-06-10  Mike Belshe  <mbelshe@chromium.org>
    256
  • trunk/WebCore/page/DragController.cpp

    r60943 r60957  
    111111            return fragment;
    112112
    113         if (dragData->containsURL()) {
     113        if (dragData->containsURL(DragData::DoNotConvertFilenames)) {
    114114            String title;
    115             String url = dragData->asURL(&title);
     115            String url = dragData->asURL(DragData::DoNotConvertFilenames, &title);
    116116            if (!url.isEmpty()) {
    117117                RefPtr<HTMLAnchorElement> anchor = HTMLAnchorElement::create(document);
  • trunk/WebCore/platform/DragData.h

    r60025 r60957  
    7979    class DragData {
    8080    public:
     81        enum FilenameConversionPolicy { DoNotConvertFilenames, ConvertFilenames };
     82
    8183#if PLATFORM(MAC)
    8284        //FIXME: In the future the WebKit functions provided by the helper class should be moved into WebCore,
     
    9395        DragOperation draggingSourceOperationMask() const { return m_draggingSourceOperationMask; }
    9496        PassRefPtr<Clipboard> createClipboard(ClipboardAccessPolicy) const;
    95         bool containsURL() const;
     97        bool containsURL(FilenameConversionPolicy filenamePolicy = ConvertFilenames) const;
    9698        bool containsPlainText() const;
    9799        bool containsCompatibleContent() const;
    98         String asURL(String* title = 0) const;
     100        String asURL(FilenameConversionPolicy filenamePolicy = ConvertFilenames, String* title = 0) const;
    99101        String asPlainText() const;
    100102        void asFilenames(Vector<String>&) const;
  • trunk/WebCore/platform/android/DragDataAndroid.cpp

    r44580 r60957  
    6969}
    7070   
    71 bool DragData::containsURL() const
     71bool DragData::containsURL(FilenameConversionPolicy) const
    7272{
    7373    return false;
    7474}
    7575   
    76 String DragData::asURL(String*) const
     76String DragData::asURL(FilenameConversionPolicy, String*) const
    7777{
    7878    return String();
  • trunk/WebCore/platform/chromium/DragDataChromium.cpp

    r59689 r60957  
    5757}
    5858
    59 bool DragData::containsURL() const
     59bool DragData::containsURL(FilenameConversionPolicy filenamePolicy) const
    6060{
    61     return !asURL().isEmpty();
     61    return !asURL(filenamePolicy).isEmpty();
    6262}
    6363
    64 String DragData::asURL(String* title) const
     64String DragData::asURL(FilenameConversionPolicy filenamePolicy, String* title) const
    6565{
    6666    String url;
    6767    if (m_platformDragData->hasValidURL())
    6868        url = m_platformDragData->getURL().string();
    69     else if (!m_platformDragData->filenames.isEmpty()) {
     69    else if (filenamePolicy == ConvertFilenames && !m_platformDragData->filenames.isEmpty()) {
    7070        String fileName = m_platformDragData->filenames[0];
    7171        fileName = ChromiumBridge::getAbsolutePath(fileName);
  • trunk/WebCore/platform/efl/DragDataEfl.cpp

    r55342 r60957  
    7272}
    7373
    74 bool DragData::containsURL() const
     74bool DragData::containsURL(FilenameConversionPolicy filenamePolicy) const
    7575{
    7676    return false;
    7777}
    7878
    79 String DragData::asURL(String* title) const
     79String DragData::asURL(FilenameConversionPolicy filenamePolicy, String* title) const
    8080{
    8181    return String();
  • trunk/WebCore/platform/gtk/DragDataGtk.cpp

    r34554 r60957  
    6868}
    6969
    70 bool DragData::containsURL() const
     70bool DragData::containsURL(FilenameConversionPolicy filenamePolicy) const
    7171{
    7272    return false;
    7373}
    7474
    75 String DragData::asURL(String* title) const
     75String DragData::asURL(FilenameConversionPolicy filenamePolicy, String* title) const
    7676{
    7777    return String();
  • trunk/WebCore/platform/haiku/DragDataHaiku.cpp

    r47068 r60957  
    8787}
    8888
    89 bool DragData::containsURL() const
     89bool DragData::containsURL(FilenameConversionPolicy filenamePolicy) const
    9090{
    9191    notImplemented();
     
    9393}
    9494
    95 String DragData::asURL(String* title) const
     95String DragData::asURL(FilenameConversionPolicy filenamePolicy, String* title) const
    9696{
    9797    notImplemented();
  • trunk/WebCore/platform/mac/DragDataMac.mm

    r48426 r60957  
    114114}
    115115   
    116 bool DragData::containsURL() const
     116bool DragData::containsURL(FilenameConversionPolicy filenamePolicy) const
    117117{
    118     return !asURL().isEmpty();
     118    return !asURL(filenamePolicy).isEmpty();
    119119}
    120120   
    121 String DragData::asURL(String* title) const
     121String DragData::asURL(FilenameConversionPolicy filenamePolicy, String* title) const
    122122{
     123    // FIXME: Use filenamePolicy.
     124    (void)filenamePolicy;
    123125    return m_pasteboardHelper->urlFromPasteboard([m_platformDragData draggingPasteboard], title);
    124126}
  • trunk/WebCore/platform/qt/DragDataQt.cpp

    r60749 r60957  
    9191
    9292    // FIXME: Should handle rich text here
    93     return asURL(0);
     93    return asURL(DoNotConvertFilenames, 0);
    9494}
    9595
     
    113113}
    114114
    115 bool DragData::containsURL() const
     115bool DragData::containsURL(FilenameConversionPolicy filenamePolicy) const
    116116{
     117    // FIXME: Use filenamePolicy.
    117118    if (!m_platformDragData)
    118119        return false;
     
    120121}
    121122
    122 String DragData::asURL(String*) const
     123String DragData::asURL(FilenameConversionPolicy filenamePolicy, String*) const
    123124{
     125    // FIXME: Use filenamePolicy.
    124126    if (!m_platformDragData)
    125127        return String();
  • trunk/WebCore/platform/win/ClipboardUtilitiesWin.cpp

    r59917 r60957  
    290290}
    291291
    292 String getURL(IDataObject* dataObject, bool& success, String* title)
     292String getURL(IDataObject* dataObject, DragData::FilenameConversionPolicy filenamePolicy, bool& success, String* title)
    293293{
    294294    STGMEDIUM store;
     
    312312        ReleaseStgMedium(&store);
    313313        success = true;
    314     } else if (SUCCEEDED(dataObject->GetData(filenameWFormat(), &store))) {
    315         //file using unicode
    316         wchar_t* data = (wchar_t*)GlobalLock(store.hGlobal);
    317         if (data && data[0] && (PathFileExists(data) || PathIsUNC(data))) {
    318             RetainPtr<CFStringRef> pathAsCFString(AdoptCF, CFStringCreateWithCharacters(kCFAllocatorDefault, (const UniChar*)data, wcslen(data)));
    319             if (urlFromPath(pathAsCFString.get(), url)) {
    320                 if (title)
    321                     *title = url;
    322                 success = true;
     314    } else if (filenamePolicy == DragData::ConvertFilenames) {
     315        if (SUCCEEDED(dataObject->GetData(filenameWFormat(), &store))) {
     316            // file using unicode
     317            wchar_t* data = (wchar_t*)GlobalLock(store.hGlobal);
     318            if (data && data[0] && (PathFileExists(data) || PathIsUNC(data))) {
     319                RetainPtr<CFStringRef> pathAsCFString(AdoptCF, CFStringCreateWithCharacters(kCFAllocatorDefault, (const UniChar*)data, wcslen(data)));
     320                if (urlFromPath(pathAsCFString.get(), url)) {
     321                    if (title)
     322                        *title = url;
     323                    success = true;
     324                }
    323325            }
     326            GlobalUnlock(store.hGlobal);
     327            ReleaseStgMedium(&store);
     328        } else if (SUCCEEDED(dataObject->GetData(filenameFormat(), &store))) {
     329            // filename using ascii
     330            char* data = (char*)GlobalLock(store.hGlobal);
     331            if (data && data[0] && (PathFileExistsA(data) || PathIsUNCA(data))) {
     332                RetainPtr<CFStringRef> pathAsCFString(AdoptCF, CFStringCreateWithCString(kCFAllocatorDefault, data, kCFStringEncodingASCII));
     333                if (urlFromPath(pathAsCFString.get(), url)) {
     334                    if (title)
     335                        *title = url;
     336                    success = true;
     337                }
     338            }
     339            GlobalUnlock(store.hGlobal);
     340            ReleaseStgMedium(&store);
    324341        }
    325         GlobalUnlock(store.hGlobal);     
    326         ReleaseStgMedium(&store);
    327     } else if (SUCCEEDED(dataObject->GetData(filenameFormat(), &store))) {
    328         //filename using ascii
    329         char* data = (char*)GlobalLock(store.hGlobal);       
    330         if (data && data[0] && (PathFileExistsA(data) || PathIsUNCA(data))) {
    331             RetainPtr<CFStringRef> pathAsCFString(AdoptCF, CFStringCreateWithCString(kCFAllocatorDefault, data, kCFStringEncodingASCII));
    332             if (urlFromPath(pathAsCFString.get(), url)) {
    333                 if (title)
    334                     *title = url;
    335                 success = true;
    336             }
    337         }
    338         GlobalUnlock(store.hGlobal);     
    339         ReleaseStgMedium(&store);
    340342    }
    341343    return url;
     
    351353        UChar* data = (UChar*)GlobalLock(store.hGlobal);
    352354        text = String(data);
    353         GlobalUnlock(store.hGlobal);     
     355        GlobalUnlock(store.hGlobal);
    354356        ReleaseStgMedium(&store);
    355357        success = true;
     
    358360        char* data = (char*)GlobalLock(store.hGlobal);
    359361        text = String(data);
    360         GlobalUnlock(store.hGlobal);     
     362        GlobalUnlock(store.hGlobal);
    361363        ReleaseStgMedium(&store);
    362364        success = true;
    363365    } else {
    364         //If a file is dropped on the window, it does not provide either of the
    365         //plain text formats, so here we try to forcibly get a url.
    366         text = getURL(dataObject, success);
     366        // FIXME: Originally, we called getURL() here because dragging and dropping files doesn't
     367        // populate the drag with text data. Per https://bugs.webkit.org/show_bug.cgi?id=38826, this
     368        // is undesirable, so maybe this line can be removed.
     369        text = getURL(dataObject, DragData::DoNotConvertFilenames, success);
    367370        success = true;
    368371    }
  • trunk/WebCore/platform/win/ClipboardUtilitiesWin.h

    r59917 r60957  
    6262PassRefPtr<DocumentFragment> fragmentFromCF_HTML(Document*, const String& cf_html);
    6363
    64 String getURL(IDataObject*, bool& success, String* title = 0);
     64String getURL(IDataObject*, DragData::FilenameConversionPolicy, bool& success, String* title = 0);
    6565String getPlainText(IDataObject*, bool& success);
    6666
     
    6868
    6969#endif // ClipboardUtilitiesWin_h
     70
  • trunk/WebCore/platform/win/ClipboardWin.cpp

    r56825 r60957  
    500500        return getPlainText(m_dataObject.get(), success);
    501501    else if (dataType == ClipboardDataTypeURL)
    502         return getURL(m_dataObject.get(), success);
     502        return getURL(m_dataObject.get(), DragData::DoNotConvertFilenames, success);
    503503   
    504504    return "";
  • trunk/WebCore/platform/win/DragDataWin.cpp

    r34544 r60957  
    4545}
    4646
    47 bool DragData::containsURL() const
     47bool DragData::containsURL(FilenameConversionPolicy filenamePolicy) const
    4848{
    4949    return SUCCEEDED(m_platformDragData->QueryGetData(urlWFormat()))
    5050        || SUCCEEDED(m_platformDragData->QueryGetData(urlFormat()))
    51         || SUCCEEDED(m_platformDragData->QueryGetData(filenameWFormat()))
    52         || SUCCEEDED(m_platformDragData->QueryGetData(filenameFormat()));
     51        || (filenamePolicy == ConvertFilenames
     52            && (SUCCEEDED(m_platformDragData->QueryGetData(filenameWFormat()))
     53                || SUCCEEDED(m_platformDragData->QueryGetData(filenameFormat()))));
    5354}
    5455
    55 String DragData::asURL(String* title) const
     56String DragData::asURL(FilenameConversionPolicy filenamePolicy, String* title) const
    5657{
    5758    bool success;
    58     return getURL(m_platformDragData, success, title);
     59    return getURL(m_platformDragData, filenamePolicy, success, title);
    5960}
    6061
  • trunk/WebCore/platform/wince/DragDataWince.cpp

    r47137 r60957  
    3333}
    3434
    35 bool DragData::containsURL() const
     35bool DragData::containsURL(FilenameConversionPolicy filenamePolicy) const
    3636{
    3737    return false;
    3838}
    3939
    40 String DragData::asURL(String* title) const
     40String DragData::asURL(FilenameConversionPolicy filenamePolicy, String* title) const
    4141{
    4242    return String();
  • trunk/WebCore/platform/wx/DragDataWx.cpp

    r34554 r60957  
    7777}
    7878   
    79 bool DragData::containsURL() const
     79bool DragData::containsURL(FilenameConversionPolicy filenamePolicy) const
    8080{
    8181    return false;
    8282}
    8383   
    84 String DragData::asURL(String* title) const
     84String DragData::asURL(FilenameConversionPolicy filenamePolicy, String* title) const
    8585{
    8686    return String();
Note: See TracChangeset for help on using the changeset viewer.