aboutsummaryrefslogblamecommitdiffstats
path: root/embed/mozilla/GtkNSSSecurityWarningDialogs.cpp
blob: fca676a525d280e4dc71aad8348345aa269b1c69 (plain) (tree)











































                                                                              

                   





                          

                     


                                       


                              
                                  
 



                                         
 
                                                                                       





















                                                                                     
                                  
                                       
                                                                    
                                                                                             













                                                                                   
                                  
                                        
                                                                          
























                                                                                    
                                  
                                        
                                                                                      
                                                                                      













                                                                                     
                                     
                                      
                                        
                                                                          
                                                                            
                                                                           
                                         
                             

                           










                                                                                               
                                      
                                        

                                                                              
                                                                            
                                                                              
                                      
                             









                                                                        
                                                             



















                                                                
                                             
         
                                                                                    
                                                                       
                                                        







                                      


                                 
                                   
 














                                                                                





                                                                        

                       
                                                        






                                                                        

         

                                                                                



                                                                      
                                    
 
                                                                                    
 
                                                               



                                                                 

                              
/* ***** BEGIN LICENSE BLOCK *****
 * Version: MPL 1.1/GPL 2.0/LGPL 2.1
 *
 * The contents of this file are subject to the Mozilla Public License Version
 * 1.1 (the "License"); you may not use this file except in compliance with
 * the License. You may obtain a copy of the License at
 * http://www.mozilla.org/MPL/
 *
 * Software distributed under the License is distributed on an "AS IS" basis,
 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
 * for the specific language governing rights and limitations under the
 * License.
 *
 * The Original Code is mozilla.org code.
 *
 * The Initial Developer of the Original Code is
 * Netscape Communications Corporation.
 * Portions created by the Initial Developer are Copyright (C) 2001
 * the Initial Developer. All Rights Reserved.
 *
 * Contributor(s):
 *   Terry Hayes <thayes@netscape.com>
 *   Javier Delgadillo <javi@netscape.com>
 *
 * Alternatively, the contents of this file may be used under the terms of
 * either the GNU General Public License Version 2 or later (the "GPL"), or
 * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
 * in which case the provisions of the GPL or the LGPL are applicable instead
 * of those above. If you wish to allow use of your version of this file only
 * under the terms of either the GPL or the LGPL, and not to allow others to
 * use your version of this file under the terms of the MPL, indicate your
 * decision by deleting the provisions above and replace them with the notice
 * and other provisions required by the GPL or the LGPL. If you do not delete
 * the provisions above, a recipient may use your version of this file under
 * the terms of any one of the MPL, the GPL or the LGPL.
 *
 * ***** END LICENSE BLOCK *****
 *
 *  Copyright (C) 2005 Christian Persch
 *
 *  $Id$
 */

#include "mozilla-config.h"
#include "config.h"

#include <glib/gi18n.h>
#include <gtk/gtkbox.h>
#include <gtk/gtkdialog.h>
#include <gtk/gtkhbox.h>
#include <gtk/gtklabel.h>
#include <gtk/gtkvbox.h>

#include <nsCOMPtr.h>
#include <nsIDOMWindow.h>
#include <nsIInterfaceRequestor.h>
#include <nsIInterfaceRequestorUtils.h>
#include <nsIPrefBranch.h>
#include <nsIPrefService.h>
#include <nsIServiceManager.h>
#include <nsServiceManagerUtils.h>

#include "AutoJSContextStack.h"
#include "EphyUtils.h"

#include "GtkNSSSecurityWarningDialogs.h"

NS_IMPL_THREADSAFE_ISUPPORTS1 (GtkNSSSecurityWarningDialogs, nsISecurityWarningDialogs)

#define ENTER_SITE_PREF      "security.warn_entering_secure"
#define WEAK_SITE_PREF       "security.warn_entering_weak"
#define MIXEDCONTENT_PREF    "security.warn_viewing_mixed"
#define INSECURE_SUBMIT_PREF "security.warn_submit_insecure"

GtkNSSSecurityWarningDialogs::GtkNSSSecurityWarningDialogs()
{
}

GtkNSSSecurityWarningDialogs::~GtkNSSSecurityWarningDialogs()
{
}

NS_IMETHODIMP 
GtkNSSSecurityWarningDialogs::ConfirmEnteringSecure (nsIInterfaceRequestor *aContext,
                             PRBool *_retval)
{
    DoDialog (aContext,
          ENTER_SITE_PREF,
          GTK_MESSAGE_INFO,
          GTK_BUTTONS_OK,
          GTK_RESPONSE_OK,
          _("Security Notice"),
          _("This page is loaded over a secure connection"),
          _("The padlock icon in the statusbar indicates whether a page is secure."),
          nsnull, _retval);

    *_retval = PR_TRUE;
    return NS_OK;
}

NS_IMETHODIMP 
GtkNSSSecurityWarningDialogs::ConfirmEnteringWeak (nsIInterfaceRequestor *aContext,
                           PRBool *_retval)
{
    DoDialog (aContext,
          WEAK_SITE_PREF,
          GTK_MESSAGE_WARNING,
          GTK_BUTTONS_OK,
          GTK_RESPONSE_OK,
          _("Security Warning"),
          _("This page is loaded over a low security connection"),
          _("Any information you see or enter on this page could "
            "easily be intercepted by a third party."),
          nsnull, _retval);

    *_retval = PR_TRUE;
    return NS_OK;
}

NS_IMETHODIMP 
GtkNSSSecurityWarningDialogs::ConfirmLeavingSecure (nsIInterfaceRequestor *aContext,
                            PRBool *_retval)
{
    /* don't prompt */
    *_retval = PR_TRUE;
    return NS_OK;
}

NS_IMETHODIMP 
GtkNSSSecurityWarningDialogs::ConfirmMixedMode (nsIInterfaceRequestor *aContext,
                        PRBool *_retval)
{
    DoDialog (aContext,
          MIXEDCONTENT_PREF,
          GTK_MESSAGE_WARNING,
          GTK_BUTTONS_OK,
          GTK_RESPONSE_OK,
          _("Security Warning"),
          _("Some parts of this page are loaded over an insecure connection"),
          _("Some information you see or enter will be sent over an insecure "
            "connection, and could easily be intercepted by a third party."),
          nsnull, _retval);

    *_retval = PR_TRUE;
    return NS_OK;
}

NS_IMETHODIMP 
GtkNSSSecurityWarningDialogs::ConfirmPostToInsecure (nsIInterfaceRequestor *aContext,
                             PRBool* _retval)
{
    DoDialog (aContext,
          INSECURE_SUBMIT_PREF,
          GTK_MESSAGE_WARNING,
          GTK_BUTTONS_CANCEL,
          GTK_RESPONSE_ACCEPT,
          _("Security Warning"),
          _("Send this information over an insecure connection?"),
          _("The information you have entered will be sent over an "
            "insecure connection, and could easily be intercepted "
            "by a third party."),
          _("_Send"),
          _retval);

    return NS_OK;
}

NS_IMETHODIMP 
GtkNSSSecurityWarningDialogs::ConfirmPostToInsecureFromSecure (nsIInterfaceRequestor *aContext,
                                   PRBool* _retval)
{
    DoDialog (aContext,
          nsnull, /* No preference for this one - it's too important */
          GTK_MESSAGE_WARNING,
          GTK_BUTTONS_CANCEL,
          GTK_RESPONSE_CANCEL,
          _("Security Warning"),
          _("Send this information over an insecure connection?"),
          _("Although this page was loaded over a secure connection, "
            "the information you have entered will be sent over an "
            "insecure connection, and could easily be intercepted by "
            "a third party."),
          _("_Send"),
          _retval);

    return NS_OK;
}

void
GtkNSSSecurityWarningDialogs::DoDialog (nsIInterfaceRequestor *aContext,
                    const char *aPrefName,
                    GtkMessageType aType,
                    GtkButtonsType aButtons,
                    int aDefaultResponse,
                    const char *aTitle,
                    const char *aPrimary,
                    const char *aSecondary,
                    const char *aButtonText,
                    PRBool *_retval)
{
    *_retval = PR_FALSE;

    nsresult rv;
    PRBool show = PR_TRUE;
    nsCOMPtr<nsIPrefBranch> prefBranch
        (do_GetService (NS_PREFSERVICE_CONTRACTID));
    if (prefBranch && aPrefName)
    {
        rv = prefBranch->GetBoolPref (aPrefName, &show);
        if (NS_FAILED(rv)) show = PR_TRUE;
    }

    char *showOncePref = NULL;
    PRBool showOnce = PR_FALSE;
    if (!show && prefBranch && aPrefName)
    {
        showOncePref = g_strconcat (aPrefName, ".show_once", (char *) NULL);
        rv = prefBranch->GetBoolPref (showOncePref, &showOnce);
        if (NS_FAILED (rv)) showOnce = PR_FALSE;
    }

    if (!show && !showOnce)
    {
        g_free (showOncePref);
        *_retval = PR_TRUE;
        return;
    }

    AutoJSContextStack stack;
    rv = stack.Init ();
    if (NS_FAILED (rv)) return;

    /* Didn't you know it, mozilla SUCKS!
     * the "aContext" interface requestor is made from a nsIDOMWindow,
     * but can only give out a nsIPrompt, from where there's no way to get
     * the nsIDOMWindow back! Therefore we cannot display this dialogue with
     * a parent, and HAVE TO make it modal.
     * https://bugzilla.mozilla.org/show_bug.cgi?id=277587
     */
    /* domWin will be always nsnull, until the mozilla bug is fixed */
    nsCOMPtr<nsIDOMWindow> domWin (do_GetInterface (aContext));
    GtkWidget *parent = EphyUtils::FindGtkParent (domWin);

    GtkWidget *dialog = gtk_message_dialog_new (GTK_WINDOW (parent),
                            GTK_DIALOG_MODAL, aType,
                            aButtons, aPrimary);

    if (parent && GTK_WINDOW (parent)->group)
    {
        gtk_window_group_add_window (GTK_WINDOW (parent)->group,
                         GTK_WINDOW (dialog));
    }

    if (aSecondary)
    {
        gtk_message_dialog_format_secondary_text
            (GTK_MESSAGE_DIALOG (dialog), aSecondary);
    }

    if (aButtonText)
    {
        gtk_dialog_add_button (GTK_DIALOG (dialog), aButtonText,
                       GTK_RESPONSE_ACCEPT);
    }

    gtk_dialog_set_default_response (GTK_DIALOG (dialog), aDefaultResponse);

    gtk_window_set_title (GTK_WINDOW (dialog), aTitle);
    gtk_window_set_icon_name (GTK_WINDOW (dialog), "web-browser");

    int response = gtk_dialog_run (GTK_DIALOG (dialog));
    gtk_widget_destroy (dialog);

    *_retval = (response == GTK_RESPONSE_ACCEPT || response == GTK_RESPONSE_OK);

    if (prefBranch && showOncePref && showOnce && *_retval)
    {
        prefBranch->SetBoolPref (showOncePref, PR_FALSE);
    }

    g_free (showOncePref);
}