fix 3 security issues.
http://www.kde.org/info/security/advisory-20040811-1.txt http://www.kde.org/info/security/advisory-20040811-2.txt http://www.kde.org/info/security/advisory-20040811-3.txt ok naddy@
This commit is contained in:
parent
036acaf2ff
commit
cb3487157b
114
x11/kde/base3/patches/patch-konqueror_konq_mainwindow_cc
Normal file
114
x11/kde/base3/patches/patch-konqueror_konq_mainwindow_cc
Normal file
@ -0,0 +1,114 @@
|
||||
$OpenBSD: patch-konqueror_konq_mainwindow_cc,v 1.1 2004/08/14 18:03:48 brad Exp $
|
||||
--- konqueror/konq_mainwindow.cc.orig Sun May 30 07:41:54 2004
|
||||
+++ konqueror/konq_mainwindow.cc Fri Aug 13 17:08:05 2004
|
||||
@@ -856,6 +856,7 @@ void KonqMainWindow::slotOpenURLRequest(
|
||||
{
|
||||
kdDebug(1202) << "KonqMainWindow::slotOpenURLRequest frameName=" << args.frameName << endl;
|
||||
|
||||
+ KParts::ReadOnlyPart *callingPart = static_cast<KParts::ReadOnlyPart *>( sender()->parent() );
|
||||
QString frameName = args.frameName;
|
||||
|
||||
if ( !frameName.isEmpty() )
|
||||
@@ -876,11 +877,11 @@ void KonqMainWindow::slotOpenURLRequest(
|
||||
frameName.lower() != _parent )
|
||||
{
|
||||
KParts::BrowserHostExtension *hostExtension = 0;
|
||||
- KonqView *view = childView( frameName, &hostExtension, 0 );
|
||||
+ KonqView *view = childView( callingPart, frameName, &hostExtension, 0 );
|
||||
if ( !view )
|
||||
{
|
||||
KonqMainWindow *mainWindow = 0;
|
||||
- view = findChildView( frameName, &mainWindow, &hostExtension, 0 );
|
||||
+ view = findChildView( callingPart, frameName, &mainWindow, &hostExtension, 0 );
|
||||
|
||||
if ( !view || !mainWindow )
|
||||
{
|
||||
@@ -903,8 +904,7 @@ void KonqMainWindow::slotOpenURLRequest(
|
||||
}
|
||||
}
|
||||
|
||||
- KParts::ReadOnlyPart *part = static_cast<KParts::ReadOnlyPart *>( sender()->parent() );
|
||||
- KonqView *view = childView( part );
|
||||
+ KonqView *view = childView( callingPart );
|
||||
openURL( view, url, args );
|
||||
}
|
||||
|
||||
@@ -1039,7 +1039,7 @@ void KonqMainWindow::slotCreateNewWindow
|
||||
if ( !args.frameName.isEmpty() && args.frameName.lower() != "_blank" )
|
||||
{
|
||||
KParts::BrowserHostExtension *hostExtension = 0;
|
||||
- if ( findChildView( args.frameName, &mainWindow, &hostExtension, &part ) )
|
||||
+ if ( findChildView( 0, args.frameName, &mainWindow, &hostExtension, &part ) )
|
||||
{
|
||||
// Found a view. If url isn't empty, we should open it - but this never happens currently
|
||||
// findChildView put the resulting part in 'part', so we can just return now
|
||||
@@ -2091,9 +2091,9 @@ KonqView * KonqMainWindow::childView( KP
|
||||
return 0L;
|
||||
}
|
||||
|
||||
-KonqView * KonqMainWindow::childView( const QString &name, KParts::BrowserHostExtension **hostExtension, KParts::ReadOnlyPart **part )
|
||||
+KonqView * KonqMainWindow::childView( KParts::ReadOnlyPart *callingPart, const QString &name, KParts::BrowserHostExtension **hostExtension, KParts::ReadOnlyPart **part )
|
||||
{
|
||||
- //kdDebug() << "KonqMainWindow::childView this=" << this << " looking for " << name << endl;
|
||||
+ kdDebug() << "KonqMainWindow::childView this=" << this << " looking for " << name << endl;
|
||||
|
||||
MapViews::ConstIterator it = m_mapViews.begin();
|
||||
MapViews::ConstIterator end = m_mapViews.end();
|
||||
@@ -2101,11 +2101,11 @@ KonqView * KonqMainWindow::childView( co
|
||||
{
|
||||
KonqView* view = it.data();
|
||||
QString viewName = view->viewName();
|
||||
- //kdDebug() << " - viewName=" << viewName << " "
|
||||
- // << "frame names:" << view->frameNames().join( "," ) << endl;
|
||||
+ kdDebug() << " - viewName=" << viewName << " "
|
||||
+ << "frame names:" << view->frameNames().join( "," ) << endl;
|
||||
if ( !viewName.isEmpty() && viewName == name )
|
||||
{
|
||||
- //kdDebug() << "found existing view by name: " << view << endl;
|
||||
+ kdDebug() << "found existing view by name: " << view << endl;
|
||||
if ( hostExtension )
|
||||
*hostExtension = 0;
|
||||
if ( part )
|
||||
@@ -2114,8 +2114,13 @@ KonqView * KonqMainWindow::childView( co
|
||||
}
|
||||
|
||||
// First look for a hostextension containing this frame name
|
||||
- // (KonqView looks for it recursively)
|
||||
- KParts::BrowserHostExtension* ext = KonqView::hostExtension( view->part(), name );
|
||||
+ KParts::BrowserHostExtension *ext = KParts::BrowserHostExtension::childObject( view->part() );
|
||||
+ if ( ext )
|
||||
+ {
|
||||
+ ext = ext->findFrameParent(callingPart, name);
|
||||
+ }
|
||||
+
|
||||
+// KParts::BrowserHostExtension* ext = KonqView::hostExtension( view->part(), name );
|
||||
|
||||
if ( ext )
|
||||
{
|
||||
@@ -2125,7 +2130,7 @@ KonqView * KonqMainWindow::childView( co
|
||||
{
|
||||
if ( frameIt.current()->name() == name )
|
||||
{
|
||||
- //kdDebug() << "found a frame of name " << name << " : " << frameIt.current() << endl;
|
||||
+ kdDebug() << "found a frame of name " << name << " : " << frameIt.current() << endl;
|
||||
if ( hostExtension )
|
||||
*hostExtension = ext;
|
||||
if ( part )
|
||||
@@ -2140,7 +2145,7 @@ KonqView * KonqMainWindow::childView( co
|
||||
}
|
||||
|
||||
// static
|
||||
-KonqView * KonqMainWindow::findChildView( const QString &name, KonqMainWindow **mainWindow, KParts::BrowserHostExtension **hostExtension, KParts::ReadOnlyPart **part )
|
||||
+KonqView * KonqMainWindow::findChildView( KParts::ReadOnlyPart *callingPart, const QString &name, KonqMainWindow **mainWindow, KParts::BrowserHostExtension **hostExtension, KParts::ReadOnlyPart **part )
|
||||
{
|
||||
if ( !s_lstViews )
|
||||
return 0;
|
||||
@@ -2148,7 +2153,7 @@ KonqView * KonqMainWindow::findChildView
|
||||
QPtrListIterator<KonqMainWindow> it( *s_lstViews );
|
||||
for (; it.current(); ++it )
|
||||
{
|
||||
- KonqView *res = it.current()->childView( name, hostExtension, part );
|
||||
+ KonqView *res = it.current()->childView( callingPart, name, hostExtension, part );
|
||||
if ( res )
|
||||
{
|
||||
if ( mainWindow )
|
16
x11/kde/base3/patches/patch-konqueror_konq_mainwindow_h
Normal file
16
x11/kde/base3/patches/patch-konqueror_konq_mainwindow_h
Normal file
@ -0,0 +1,16 @@
|
||||
$OpenBSD: patch-konqueror_konq_mainwindow_h,v 1.1 2004/08/14 18:03:48 brad Exp $
|
||||
--- konqueror/konq_mainwindow.h.orig Sun May 30 07:41:54 2004
|
||||
+++ konqueror/konq_mainwindow.h Fri Aug 13 17:08:05 2004
|
||||
@@ -145,10 +145,10 @@ public:
|
||||
void insertChildView( KonqView *childView );
|
||||
void removeChildView( KonqView *childView );
|
||||
KonqView *childView( KParts::ReadOnlyPart *view );
|
||||
- KonqView *childView( const QString &name, KParts::BrowserHostExtension **hostExtension, KParts::ReadOnlyPart **part );
|
||||
+ KonqView *childView( KParts::ReadOnlyPart *callingPart, const QString &name, KParts::BrowserHostExtension **hostExtension, KParts::ReadOnlyPart **part );
|
||||
|
||||
// dcop idl bug! it can't handle KonqMainWindow *&mainWindow
|
||||
- static KonqView *findChildView( const QString &name, KonqMainWindow **mainWindow, KParts::BrowserHostExtension **hostExtension, KParts::ReadOnlyPart **part );
|
||||
+ static KonqView *findChildView( KParts::ReadOnlyPart *callingPart, const QString &name, KonqMainWindow **mainWindow, KParts::BrowserHostExtension **hostExtension, KParts::ReadOnlyPart **part );
|
||||
|
||||
// Total number of views
|
||||
int viewCount() const { return m_mapViews.count(); }
|
182
x11/kde/libs3/patches/patch-dcop_dcopserver_cpp
Normal file
182
x11/kde/libs3/patches/patch-dcop_dcopserver_cpp
Normal file
@ -0,0 +1,182 @@
|
||||
$OpenBSD: patch-dcop_dcopserver_cpp,v 1.1 2004/08/14 18:03:47 brad Exp $
|
||||
--- dcop/dcopserver.cpp.orig Sun May 30 08:23:44 2004
|
||||
+++ dcop/dcopserver.cpp Fri Aug 13 16:04:38 2004
|
||||
@@ -443,35 +443,78 @@ write_iceauth (FILE *addfp, IceAuthDataE
|
||||
fprintf (addfp, "\n");
|
||||
}
|
||||
|
||||
+#ifndef HAVE_MKSTEMPS
|
||||
+#include <string.h>
|
||||
+#include <strings.h>
|
||||
|
||||
-#ifndef HAVE_MKSTEMP
|
||||
-static char *unique_filename (const char *path, const char *prefix)
|
||||
-#else
|
||||
-static char *unique_filename (const char *path, const char *prefix, int *pFd)
|
||||
-#endif
|
||||
+/* this is based on code taken from the GNU libc, distributed under the LGPL license */
|
||||
+
|
||||
+/* Generate a unique temporary file name from TEMPLATE.
|
||||
+
|
||||
+ TEMPLATE has the form:
|
||||
+
|
||||
+ <path>/ccXXXXXX<suffix>
|
||||
+
|
||||
+ SUFFIX_LEN tells us how long <suffix> is (it can be zero length).
|
||||
+
|
||||
+ The last six characters of TEMPLATE before <suffix> must be "XXXXXX";
|
||||
+ they are replaced with a string that makes the filename unique.
|
||||
+
|
||||
+ Returns a file descriptor open on the file for reading and writing. */
|
||||
+
|
||||
+int mkstemps (char* _template, int suffix_len)
|
||||
{
|
||||
-#ifndef HAVE_MKSTEMP
|
||||
-#ifndef X_NOT_POSIX
|
||||
- return ((char *) tempnam (path, prefix));
|
||||
-#else
|
||||
- char tempFile[PATH_MAX];
|
||||
- char *tmp;
|
||||
+ static const char letters[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
|
||||
+ char *XXXXXX;
|
||||
+ int len;
|
||||
+ int count;
|
||||
+ int value;
|
||||
|
||||
- snprintf (tempFile, PATH_MAX, "%s/%sXXXXXX", path, prefix);
|
||||
- tmp = (char *) mktemp (tempFile);
|
||||
- if (tmp)
|
||||
- {
|
||||
- char *ptr = (char *) malloc (strlen (tmp) + 1);
|
||||
- if (ptr != NULL)
|
||||
- {
|
||||
- strcpy (ptr, tmp);
|
||||
- }
|
||||
- return (ptr);
|
||||
- }
|
||||
- else
|
||||
- return (NULL);
|
||||
+ len = strlen (_template);
|
||||
+
|
||||
+ if ((int) len < 6 + suffix_len || strncmp (&_template[len - 6 - suffix_len], "XXXXXX", 6))
|
||||
+ return -1;
|
||||
+
|
||||
+ XXXXXX = &_template[len - 6 - suffix_len];
|
||||
+
|
||||
+ value = rand();
|
||||
+ for (count = 0; count < 256; ++count)
|
||||
+ {
|
||||
+ int v = value;
|
||||
+ int fd;
|
||||
+
|
||||
+ /* Fill in the random bits. */
|
||||
+ XXXXXX[0] = letters[v % 62];
|
||||
+ v /= 62;
|
||||
+ XXXXXX[1] = letters[v % 62];
|
||||
+ v /= 62;
|
||||
+ XXXXXX[2] = letters[v % 62];
|
||||
+ v /= 62;
|
||||
+ XXXXXX[3] = letters[v % 62];
|
||||
+ v /= 62;
|
||||
+ XXXXXX[4] = letters[v % 62];
|
||||
+ v /= 62;
|
||||
+ XXXXXX[5] = letters[v % 62];
|
||||
+
|
||||
+ fd = open (_template, O_RDWR|O_CREAT|O_EXCL, 0600);
|
||||
+ if (fd >= 0)
|
||||
+ /* The file does not exist. */
|
||||
+ return fd;
|
||||
+
|
||||
+ /* This is a random value. It is only necessary that the next
|
||||
+ TMP_MAX values generated by adding 7777 to VALUE are different
|
||||
+ with (module 2^32). */
|
||||
+ value += 7777;
|
||||
+ }
|
||||
+ /* We return the null string if we can't find a unique file name. */
|
||||
+ _template[0] = '\0';
|
||||
+ return -1;
|
||||
+}
|
||||
+
|
||||
#endif
|
||||
-#else
|
||||
+
|
||||
+static char *unique_filename (const char *path, const char *prefix, int *pFd)
|
||||
+{
|
||||
char tempFile[PATH_MAX];
|
||||
char *ptr;
|
||||
|
||||
@@ -480,44 +523,11 @@ static char *unique_filename (const char
|
||||
if (ptr != NULL)
|
||||
{
|
||||
strcpy(ptr, tempFile);
|
||||
- *pFd = mkstemp(ptr);
|
||||
+ *pFd = mkstemps(ptr, 0);
|
||||
}
|
||||
return ptr;
|
||||
-#endif
|
||||
}
|
||||
|
||||
-#if 0
|
||||
-Status SetAuthentication_local (int count, IceListenObj *listenObjs)
|
||||
-{
|
||||
- int i;
|
||||
- for (i = 0; i < count; i ++) {
|
||||
- char *prot = IceGetListenConnectionString(listenObjs[i]);
|
||||
- if (!prot) continue;
|
||||
- char *host = strchr(prot, '/');
|
||||
- char *sock = 0;
|
||||
- if (host) {
|
||||
- *host=0;
|
||||
- host++;
|
||||
- sock = strchr(host, ':');
|
||||
- if (sock) {
|
||||
- *sock = 0;
|
||||
- sock++;
|
||||
- }
|
||||
- }
|
||||
-#ifndef NDEBUG
|
||||
- qDebug("DCOPServer: SetAProc_loc: conn %d, prot=%s, file=%s",
|
||||
- (unsigned)i, prot, sock);
|
||||
-#endif
|
||||
- if (sock && !strcmp(prot, "local")) {
|
||||
- chmod(sock, 0700);
|
||||
- }
|
||||
- IceSetHostBasedAuthProc (listenObjs[i], HostBasedAuthProc);
|
||||
- free(prot);
|
||||
- }
|
||||
- return 1;
|
||||
-}
|
||||
-#endif
|
||||
-
|
||||
#define MAGIC_COOKIE_LEN 16
|
||||
|
||||
Status
|
||||
@@ -529,28 +539,19 @@ SetAuthentication (int count, IceListenO
|
||||
int original_umask;
|
||||
int i;
|
||||
QCString command;
|
||||
-#ifdef HAVE_MKSTEMP
|
||||
int fd;
|
||||
-#endif
|
||||
|
||||
original_umask = umask (0077); /* disallow non-owner access */
|
||||
|
||||
path = getenv ("DCOP_SAVE_DIR");
|
||||
if (!path)
|
||||
path = "/tmp";
|
||||
-#ifndef HAVE_MKSTEMP
|
||||
- if ((addAuthFile = unique_filename (path, "dcop")) == NULL)
|
||||
- goto bad;
|
||||
|
||||
- if (!(addfp = fopen (addAuthFile, "w")))
|
||||
- goto bad;
|
||||
-#else
|
||||
if ((addAuthFile = unique_filename (path, "dcop", &fd)) == NULL)
|
||||
goto bad;
|
||||
|
||||
if (!(addfp = fdopen(fd, "wb")))
|
||||
goto bad;
|
||||
-#endif
|
||||
|
||||
if ((*_authDataEntries = static_cast<IceAuthDataEntry *>(malloc (count * 2 * sizeof (IceAuthDataEntry)))) == NULL)
|
||||
goto bad;
|
33
x11/kde/libs3/patches/patch-kdecore_kstandarddirs_cpp
Normal file
33
x11/kde/libs3/patches/patch-kdecore_kstandarddirs_cpp
Normal file
@ -0,0 +1,33 @@
|
||||
$OpenBSD: patch-kdecore_kstandarddirs_cpp,v 1.1 2004/08/14 18:03:48 brad Exp $
|
||||
--- kdecore/kstandarddirs.cpp.orig Sun May 30 08:24:00 2004
|
||||
+++ kdecore/kstandarddirs.cpp Fri Aug 13 16:04:57 2004
|
||||
@@ -650,7 +650,28 @@ void KStandardDirs::createSpecialResourc
|
||||
char link[1024];
|
||||
link[1023] = 0;
|
||||
int result = readlink(QFile::encodeName(dir).data(), link, 1023);
|
||||
- if ((result == -1) && (errno == ENOENT))
|
||||
+ bool relink = (result == -1) && (errno == ENOENT);
|
||||
+ if ((result > 0) && (link[0] == '/'))
|
||||
+ {
|
||||
+ link[result] = 0;
|
||||
+ struct stat stat_buf;
|
||||
+ int res = lstat(link, &stat_buf);
|
||||
+ if ((res == -1) && (errno == ENOENT))
|
||||
+ {
|
||||
+ relink = true;
|
||||
+ }
|
||||
+ else if ((res == -1) || (!S_ISDIR(stat_buf.st_mode)))
|
||||
+ {
|
||||
+ fprintf(stderr, "Error: \"%s\" is not a directory.\n", link);
|
||||
+ relink = true;
|
||||
+ }
|
||||
+ else if (stat_buf.st_uid != getuid())
|
||||
+ {
|
||||
+ fprintf(stderr, "Error: \"%s\" is owned by uid %d instead of uid %d.\n", link, stat_buf.st_uid, getuid());
|
||||
+ relink = true;
|
||||
+ }
|
||||
+ }
|
||||
+ if (relink)
|
||||
{
|
||||
QString srv = findExe(QString::fromLatin1("lnusertemp"), KDEDIR+QString::fromLatin1("/bin"));
|
||||
if (srv.isEmpty())
|
23
x11/kde/libs3/patches/patch-khtml_khtml_ext_cpp
Normal file
23
x11/kde/libs3/patches/patch-khtml_khtml_ext_cpp
Normal file
@ -0,0 +1,23 @@
|
||||
$OpenBSD: patch-khtml_khtml_ext_cpp,v 1.1 2004/08/14 18:03:48 brad Exp $
|
||||
--- khtml/khtml_ext.cpp.orig Sun May 30 08:24:21 2004
|
||||
+++ khtml/khtml_ext.cpp Fri Aug 13 16:04:21 2004
|
||||
@@ -646,6 +646,19 @@ bool KHTMLPartBrowserHostExtension::open
|
||||
return m_part->openURLInFrame( url, urlArgs );
|
||||
}
|
||||
|
||||
+void KHTMLPartBrowserHostExtension::virtual_hook( int id, void *data )
|
||||
+{
|
||||
+ if (id == VIRTUAL_FIND_FRAME_PARENT)
|
||||
+ {
|
||||
+ FindFrameParentParams *param = static_cast<FindFrameParentParams*>(data);
|
||||
+ KHTMLPart *parentPart = m_part->findFrameParent(param->callingPart, param->frame);
|
||||
+ if (parentPart)
|
||||
+ param->parent = parentPart->browserHostExtension();
|
||||
+ return;
|
||||
+ }
|
||||
+ BrowserHostExtension::virtual_hook( id, data );
|
||||
+}
|
||||
+
|
||||
// BCI: remove in KDE 4
|
||||
KHTMLZoomFactorAction::KHTMLZoomFactorAction( KHTMLPart *part, bool direction, const QString &text, const QString &icon, const QObject *receiver, const char *slot, QObject *parent, const char *name )
|
||||
: KAction( text, icon, 0, receiver, slot, parent, name )
|
13
x11/kde/libs3/patches/patch-khtml_khtml_ext_h
Normal file
13
x11/kde/libs3/patches/patch-khtml_khtml_ext_h
Normal file
@ -0,0 +1,13 @@
|
||||
$OpenBSD: patch-khtml_khtml_ext_h,v 1.1 2004/08/14 18:03:48 brad Exp $
|
||||
--- khtml/khtml_ext.h.orig Mon Mar 1 01:25:08 2004
|
||||
+++ khtml/khtml_ext.h Fri Aug 13 16:04:21 2004
|
||||
@@ -98,6 +98,9 @@ public:
|
||||
virtual const QPtrList<KParts::ReadOnlyPart> frames() const;
|
||||
|
||||
virtual bool openURLInFrame( const KURL &url, const KParts::URLArgs &urlArgs );
|
||||
+
|
||||
+protected:
|
||||
+ virtual void virtual_hook( int id, void* data );
|
||||
private:
|
||||
KHTMLPart *m_part;
|
||||
};
|
266
x11/kde/libs3/patches/patch-khtml_khtml_part_cpp
Normal file
266
x11/kde/libs3/patches/patch-khtml_khtml_part_cpp
Normal file
@ -0,0 +1,266 @@
|
||||
$OpenBSD: patch-khtml_khtml_part_cpp,v 1.2 2004/08/14 18:03:48 brad Exp $
|
||||
--- khtml/khtml_part.cpp.orig Sun May 30 08:24:22 2004
|
||||
+++ khtml/khtml_part.cpp Fri Aug 13 16:04:22 2004
|
||||
@@ -734,12 +734,16 @@ DOM::Document KHTMLPart::document() cons
|
||||
return d->m_doc;
|
||||
}
|
||||
|
||||
-
|
||||
KParts::BrowserExtension *KHTMLPart::browserExtension() const
|
||||
{
|
||||
return d->m_extension;
|
||||
}
|
||||
|
||||
+KParts::BrowserHostExtension *KHTMLPart::browserHostExtension() const
|
||||
+{
|
||||
+ return d->m_hostExtension;
|
||||
+}
|
||||
+
|
||||
KHTMLView *KHTMLPart::view() const
|
||||
{
|
||||
return d->m_view;
|
||||
@@ -857,30 +861,19 @@ QVariant KHTMLPart::crossFrameExecuteScr
|
||||
// we always allow these
|
||||
}
|
||||
else {
|
||||
- while (destpart->parentPart())
|
||||
- destpart = destpart->parentPart();
|
||||
- destpart = destpart->findFrame(target);
|
||||
-
|
||||
+ destpart = findFrame(target);
|
||||
if (!destpart)
|
||||
- destpart = this; // ### doesn't make sense, does it?
|
||||
+ destpart = this;
|
||||
}
|
||||
|
||||
// easy way out?
|
||||
if (destpart == this)
|
||||
return executeScript(DOM::Node(), script);
|
||||
|
||||
-
|
||||
// now compare the domains
|
||||
- if (!destpart->htmlDocument().isNull() &&
|
||||
- !htmlDocument().isNull()) {
|
||||
- DOM::DOMString actDomain = htmlDocument().domain();
|
||||
- DOM::DOMString destDomain = destpart->htmlDocument().domain();
|
||||
+ if (destpart->checkFrameAccess(this))
|
||||
+ return destpart->executeScript(DOM::Node(), script);
|
||||
|
||||
- if (actDomain == destDomain)
|
||||
- return destpart->executeScript(DOM::Node(), script);
|
||||
- }
|
||||
-
|
||||
-
|
||||
// eww, something went wrong. better execute it in our frame
|
||||
return executeScript(DOM::Node(), script);
|
||||
}
|
||||
@@ -3331,7 +3324,7 @@ void KHTMLPart::urlSelected( const QStri
|
||||
if ( hasTarget )
|
||||
{
|
||||
// unknown frame names should open in a new window.
|
||||
- khtml::ChildFrame *frame = recursiveFrameRequest( cURL, args, false );
|
||||
+ khtml::ChildFrame *frame = recursiveFrameRequest( this, cURL, args, false );
|
||||
if ( frame )
|
||||
{
|
||||
args.metaData()["referrer"] = d->m_referrer;
|
||||
@@ -4337,6 +4330,7 @@ void KHTMLPart::slotChildDocCreated()
|
||||
void KHTMLPart::slotChildURLRequest( const KURL &url, const KParts::URLArgs &args )
|
||||
{
|
||||
khtml::ChildFrame *child = frame( sender()->parent() );
|
||||
+ KHTMLPart *callingHtmlPart = const_cast<KHTMLPart *>(dynamic_cast<const KHTMLPart *>(sender()->parent()));
|
||||
|
||||
// TODO: handle child target correctly! currently the script are always executed fur the parent
|
||||
QString urlStr = url.url();
|
||||
@@ -4368,7 +4362,7 @@ void KHTMLPart::slotChildURLRequest( con
|
||||
}
|
||||
else if ( frameName != QString::fromLatin1( "_self" ) )
|
||||
{
|
||||
- khtml::ChildFrame *_frame = recursiveFrameRequest( url, args );
|
||||
+ khtml::ChildFrame *_frame = recursiveFrameRequest( callingHtmlPart, url, args );
|
||||
|
||||
if ( !_frame )
|
||||
{
|
||||
@@ -4412,46 +4406,92 @@ khtml::ChildFrame *KHTMLPart::frame( con
|
||||
|
||||
//#define DEBUG_FINDFRAME
|
||||
|
||||
-KHTMLPart *KHTMLPart::findFrame( const QString &f )
|
||||
+bool KHTMLPart::checkFrameAccess(KHTMLPart *callingHtmlPart)
|
||||
{
|
||||
+ if (callingHtmlPart == this)
|
||||
+ return true; // trivial
|
||||
+
|
||||
+ if (htmlDocument().isNull()) {
|
||||
#ifdef DEBUG_FINDFRAME
|
||||
- kdDebug(6050) << "KHTMLPart::findFrame '" << f << "'" << endl;
|
||||
- FrameIt it2 = d->m_frames.begin();
|
||||
- FrameIt end = d->m_frames.end();
|
||||
- for (; it2 != end; ++it2 )
|
||||
- kdDebug(6050) << " - having frame '" << (*it2).m_name << "'" << endl;
|
||||
+ kdDebug(6050) << "KHTMLPart::checkFrameAccess: Empty part " << this << " URL = " << m_url << endl;
|
||||
#endif
|
||||
- // ### http://www.w3.org/TR/html4/appendix/notes.html#notes-frames
|
||||
- ConstFrameIt it = d->m_frames.find( f );
|
||||
- if ( it == d->m_frames.end() )
|
||||
+ return false; // we are empty?
|
||||
+ }
|
||||
+
|
||||
+ // now compare the domains
|
||||
+ if (callingHtmlPart && !callingHtmlPart->htmlDocument().isNull() &&
|
||||
+ !htmlDocument().isNull()) {
|
||||
+ DOM::DOMString actDomain = callingHtmlPart->htmlDocument().domain();
|
||||
+ DOM::DOMString destDomain = htmlDocument().domain();
|
||||
+
|
||||
+#ifdef DEBUG_FINDFRAME
|
||||
+ kdDebug(6050) << "KHTMLPart::checkFrameAccess: actDomain = '" << actDomain.string() << "' destDomain = '" << destDomain.string() << "'" << endl;
|
||||
+#endif
|
||||
+
|
||||
+ if (actDomain == destDomain)
|
||||
+ return true;
|
||||
+ }
|
||||
+#ifdef DEBUG_FINDFRAME
|
||||
+ else
|
||||
{
|
||||
+ kdDebug(6050) << "KHTMLPart::checkFrameAccess: Unknown part/domain " << callingHtmlPart << " tries to access part " << this << endl;
|
||||
+ }
|
||||
+#endif
|
||||
+ return false;
|
||||
+}
|
||||
+
|
||||
+KHTMLPart *
|
||||
+KHTMLPart::findFrameParent( KParts::ReadOnlyPart *callingPart, const QString &f, khtml::ChildFrame **childFrame )
|
||||
+{
|
||||
#ifdef DEBUG_FINDFRAME
|
||||
- kdDebug(6050) << "KHTMLPart::findFrame frame " << f << " not found" << endl;
|
||||
+ kdDebug(6050) << "KHTMLPart::findFrameParent: this = " << this << " URL = " << m_url << " findFrameParent( " << f << " )" << endl;
|
||||
#endif
|
||||
- return 0L;
|
||||
+ // Check access
|
||||
+ KHTMLPart *callingHtmlPart = dynamic_cast<KHTMLPart *>(callingPart);
|
||||
+
|
||||
+ if (!checkFrameAccess(callingHtmlPart))
|
||||
+ return 0;
|
||||
+
|
||||
+ FrameIt it = d->m_frames.find( f );
|
||||
+ FrameIt end = d->m_frames.end();
|
||||
+ if ( it != end )
|
||||
+ {
|
||||
+#ifdef DEBUG_FINDFRAME
|
||||
+ kdDebug(6050) << "KHTMLPart::findFrameParent: FOUND!" << endl;
|
||||
+#endif
|
||||
+ if (childFrame)
|
||||
+ *childFrame = &(*it);
|
||||
+ return this;
|
||||
}
|
||||
- else {
|
||||
+
|
||||
+ it = d->m_frames.begin();
|
||||
+ for (; it != end; ++it )
|
||||
+ {
|
||||
KParts::ReadOnlyPart *p = (*it).m_part;
|
||||
if ( p && p->inherits( "KHTMLPart" ))
|
||||
{
|
||||
-#ifdef DEBUG_FINDFRAME
|
||||
- kdDebug(6050) << "KHTMLPart::findFrame frame " << f << " is a KHTMLPart, ok" << endl;
|
||||
-#endif
|
||||
- return (KHTMLPart*)p;
|
||||
+ KHTMLPart *frameParent = static_cast<KHTMLPart*>(p)->findFrameParent(callingPart, f, childFrame);
|
||||
+ if (frameParent)
|
||||
+ return frameParent;
|
||||
}
|
||||
- else
|
||||
- {
|
||||
-#ifdef DEBUG_FINDFRAME
|
||||
- if (p)
|
||||
- kdWarning() << "KHTMLPart::findFrame frame " << f << " found but isn't a KHTMLPart ! " << p->className() << endl;
|
||||
- else
|
||||
- kdWarning() << "KHTMLPart::findFrame frame " << f << " found but m_part=0L" << endl;
|
||||
-#endif
|
||||
- return 0L;
|
||||
- }
|
||||
}
|
||||
+ return 0;
|
||||
}
|
||||
|
||||
+
|
||||
+KHTMLPart *KHTMLPart::findFrame( const QString &f )
|
||||
+{
|
||||
+ khtml::ChildFrame *childFrame;
|
||||
+ KHTMLPart *parentFrame = findFrameParent(this, f, &childFrame);
|
||||
+ if (parentFrame)
|
||||
+ {
|
||||
+ KParts::ReadOnlyPart *p = childFrame->m_part;
|
||||
+ if ( p && p->inherits( "KHTMLPart" ))
|
||||
+ return static_cast<KHTMLPart *>(p);
|
||||
+ }
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
KParts::ReadOnlyPart *KHTMLPart::currentFrame() const
|
||||
{
|
||||
KParts::ReadOnlyPart* part = (KParts::ReadOnlyPart*)(this);
|
||||
@@ -4487,37 +4527,29 @@ KHTMLPart *KHTMLPart::parentPart()
|
||||
return (KHTMLPart *)parent();
|
||||
}
|
||||
|
||||
-khtml::ChildFrame *KHTMLPart::recursiveFrameRequest( const KURL &url, const KParts::URLArgs &args,
|
||||
- bool callParent )
|
||||
+khtml::ChildFrame *KHTMLPart::recursiveFrameRequest( KHTMLPart *callingHtmlPart, const KURL &url,
|
||||
+ const KParts::URLArgs &args, bool callParent )
|
||||
{
|
||||
- FrameIt it = d->m_frames.find( args.frameName );
|
||||
+#ifdef DEBUG_FINDFRAME
|
||||
+ kdDebug( 6050 ) << "KHTMLPart::recursiveFrameRequest this = " << this << ", frame = " << args.frameName << ", url = " << url << endl;
|
||||
+#endif
|
||||
+ khtml::ChildFrame *childFrame;
|
||||
+ KHTMLPart *childPart = findFrameParent(callingHtmlPart, args.frameName, &childFrame);
|
||||
+ if (childPart)
|
||||
+ {
|
||||
+ if (childPart == this)
|
||||
+ return childFrame;
|
||||
+
|
||||
+ childPart->requestObject( childFrame, url, args );
|
||||
+ return 0;
|
||||
+ }
|
||||
|
||||
- if ( it != d->m_frames.end() )
|
||||
- return &(*it);
|
||||
-
|
||||
- it = d->m_frames.begin();
|
||||
- FrameIt end = d->m_frames.end();
|
||||
- for (; it != end; ++it )
|
||||
- if ( (*it).m_part && (*it).m_part->inherits( "KHTMLPart" ) )
|
||||
- {
|
||||
- KHTMLPart *childPart = (KHTMLPart *)(KParts::ReadOnlyPart *)(*it).m_part;
|
||||
-
|
||||
- khtml::ChildFrame *res = childPart->recursiveFrameRequest( url, args, false );
|
||||
- if ( !res )
|
||||
- continue;
|
||||
-
|
||||
- childPart->requestObject( res, url, args );
|
||||
- return 0L;
|
||||
- }
|
||||
-
|
||||
if ( parentPart() && callParent )
|
||||
{
|
||||
- khtml::ChildFrame *res = parentPart()->recursiveFrameRequest( url, args );
|
||||
+ khtml::ChildFrame *res = parentPart()->recursiveFrameRequest( callingHtmlPart, url, args, callParent );
|
||||
|
||||
- if ( res )
|
||||
- parentPart()->requestObject( res, url, args );
|
||||
-
|
||||
- return 0L;
|
||||
+ if ( res )
|
||||
+ parentPart()->requestObject( res, url, args );
|
||||
}
|
||||
|
||||
return 0L;
|
||||
@@ -4525,7 +4557,7 @@ khtml::ChildFrame *KHTMLPart::recursiveF
|
||||
|
||||
void KHTMLPart::saveState( QDataStream &stream )
|
||||
{
|
||||
- kdDebug( 6050 ) << "KHTMLPart::saveState saving URL " << m_url.url() << endl;
|
||||
+ kdDebug( 6050 ) << "KHTMLPart::saveState this = " << this << " saving URL " << m_url.url() << endl;
|
||||
|
||||
stream << m_url << (Q_INT32)d->m_view->contentsX() << (Q_INT32)d->m_view->contentsY()
|
||||
<< (Q_INT32) d->m_view->contentsWidth() << (Q_INT32) d->m_view->contentsHeight() << (Q_INT32) d->m_view->marginWidth() << (Q_INT32) d->m_view->marginHeight();
|
46
x11/kde/libs3/patches/patch-khtml_khtml_part_h
Normal file
46
x11/kde/libs3/patches/patch-khtml_khtml_part_h
Normal file
@ -0,0 +1,46 @@
|
||||
$OpenBSD: patch-khtml_khtml_part_h,v 1.2 2004/08/14 18:03:48 brad Exp $
|
||||
--- khtml/khtml_part.h.orig Sun Apr 4 03:08:39 2004
|
||||
+++ khtml/khtml_part.h Fri Aug 13 16:04:22 2004
|
||||
@@ -287,6 +287,7 @@ public:
|
||||
*/
|
||||
KParts::BrowserExtension *browserExtension() const;
|
||||
KParts::LiveConnectExtension *liveConnectExtension( const khtml::RenderPart *) const;
|
||||
+ KParts::BrowserHostExtension *browserHostExtension() const;
|
||||
|
||||
/**
|
||||
* Returns a pointer to the HTML document's view.
|
||||
@@ -812,6 +813,16 @@ public:
|
||||
KHTMLPart *findFrame( const QString &f );
|
||||
|
||||
/**
|
||||
+ * @internal
|
||||
+ * Recursively finds the part containing the frame with name @p f
|
||||
+ * and checks if it is accessible by @p callingPart
|
||||
+ * Returns 0L if no suitable frame can't be found.
|
||||
+ * Returns parent part if a suitable frame was found and
|
||||
+ * frame info in @p *childFrame
|
||||
+ */
|
||||
+ KHTMLPart *findFrameParent( KParts::ReadOnlyPart *callingPart, const QString &f, khtml::ChildFrame **childFrame=0 );
|
||||
+
|
||||
+ /**
|
||||
* Return the current frame (the one that has focus)
|
||||
* Not necessarily a direct child of ours, framesets can be nested.
|
||||
* Returns "this" if this part isn't a frameset.
|
||||
@@ -1368,6 +1379,8 @@ private:
|
||||
|
||||
bool restoreURL( const KURL &url );
|
||||
void emitSelectionChanged();
|
||||
+ // Returns whether callingHtmlPart may access this part
|
||||
+ bool checkFrameAccess(KHTMLPart *callingHtmlPart);
|
||||
bool openURLInFrame( const KURL &url, const KParts::URLArgs &urlArgs );
|
||||
void startAutoScroll();
|
||||
void stopAutoScroll();
|
||||
@@ -1426,7 +1439,7 @@ private:
|
||||
DOM::DocumentImpl *xmlDocImpl() const;
|
||||
khtml::ChildFrame *frame( const QObject *obj );
|
||||
|
||||
- khtml::ChildFrame *recursiveFrameRequest( const KURL &url, const KParts::URLArgs &args, bool callParent = true );
|
||||
+ khtml::ChildFrame *recursiveFrameRequest( KHTMLPart *callingHtmlPart, const KURL &url, const KParts::URLArgs &args, bool callParent = true );
|
||||
|
||||
bool checkLinkSecurity( const KURL &linkURL,const QString &message = QString::null, const QString &button = QString::null );
|
||||
QVariant executeScript( const QString& filename, int baseLine, const DOM::Node &n, const QString& script );
|
21
x11/kde/libs3/patches/patch-kparts_browserextension_cpp
Normal file
21
x11/kde/libs3/patches/patch-kparts_browserextension_cpp
Normal file
@ -0,0 +1,21 @@
|
||||
$OpenBSD: patch-kparts_browserextension_cpp,v 1.1 2004/08/14 18:03:48 brad Exp $
|
||||
--- kparts/browserextension.cpp.orig Sun May 30 08:24:45 2004
|
||||
+++ kparts/browserextension.cpp Fri Aug 13 16:04:22 2004
|
||||
@@ -636,6 +636,17 @@ BrowserHostExtension *BrowserHostExtensi
|
||||
void BrowserExtension::virtual_hook( int, void* )
|
||||
{ /*BASE::virtual_hook( id, data );*/ }
|
||||
|
||||
+BrowserHostExtension *
|
||||
+BrowserHostExtension::findFrameParent(KParts::ReadOnlyPart *callingPart, const QString &frame)
|
||||
+{
|
||||
+ FindFrameParentParams param;
|
||||
+ param.parent = 0;
|
||||
+ param.callingPart = callingPart;
|
||||
+ param.frame = frame;
|
||||
+ virtual_hook(VIRTUAL_FIND_FRAME_PARENT, ¶m);
|
||||
+ return param.parent;
|
||||
+}
|
||||
+
|
||||
void BrowserHostExtension::virtual_hook( int, void* )
|
||||
{ /*BASE::virtual_hook( id, data );*/ }
|
||||
|
41
x11/kde/libs3/patches/patch-kparts_browserextension_h
Normal file
41
x11/kde/libs3/patches/patch-kparts_browserextension_h
Normal file
@ -0,0 +1,41 @@
|
||||
$OpenBSD: patch-kparts_browserextension_h,v 1.1 2004/08/14 18:03:48 brad Exp $
|
||||
--- kparts/browserextension.h.orig Sun Oct 26 03:54:24 2003
|
||||
+++ kparts/browserextension.h Fri Aug 13 16:04:22 2004
|
||||
@@ -671,10 +671,16 @@ public:
|
||||
*
|
||||
* Note that this method does not query the child objects recursively.
|
||||
*/
|
||||
-
|
||||
virtual const QPtrList<KParts::ReadOnlyPart> frames() const;
|
||||
|
||||
/**
|
||||
+ * @internal
|
||||
+ * Returns the part that contains @p frame and that may be accessed
|
||||
+ * by @p callingPart
|
||||
+ */
|
||||
+ BrowserHostExtension *findFrameParent(KParts::ReadOnlyPart *callingPart, const QString &frame);
|
||||
+
|
||||
+ /**
|
||||
* Opens the given url in a hosted child frame. The frame name is specified in the
|
||||
* frameName variable in the urlArgs argument structure (see KParts::URLArgs ) .
|
||||
*/
|
||||
@@ -687,6 +693,19 @@ public:
|
||||
static BrowserHostExtension *childObject( QObject *obj );
|
||||
|
||||
protected:
|
||||
+ /** This 'enum' along with the structure below is NOT part of the public API.
|
||||
+ * It's going to disappear in KDE 4.0 and is likely to change inbetween.
|
||||
+ *
|
||||
+ * @internal
|
||||
+ */
|
||||
+ enum { VIRTUAL_FIND_FRAME_PARENT = 0x10 };
|
||||
+ struct FindFrameParentParams
|
||||
+ {
|
||||
+ BrowserHostExtension *parent;
|
||||
+ KParts::ReadOnlyPart *callingPart;
|
||||
+ QString frame;
|
||||
+ };
|
||||
+
|
||||
virtual void virtual_hook( int id, void* data );
|
||||
private:
|
||||
class BrowserHostExtensionPrivate;
|
Loading…
Reference in New Issue
Block a user