Add initial support for choosing to still connect when the server uses a self-signed cert and verify_vertificates is turned on
This commit is contained in:
parent
3f70567d56
commit
c005fc7cae
File diff suppressed because one or more lines are too long
|
@ -1,6 +1,7 @@
|
||||||
import { socketAction } from 'state/actions';
|
import { socketAction } from 'state/actions';
|
||||||
import { setConnected } from 'state/app';
|
import { setConnected } from 'state/app';
|
||||||
import { broadcast, inform, print, addMessage, addMessages } from 'state/messages';
|
import { broadcast, inform, print, addMessage, addMessages } from 'state/messages';
|
||||||
|
import { reconnect } from 'state/servers';
|
||||||
import { select } from 'state/tab';
|
import { select } from 'state/tab';
|
||||||
import { normalizeChannel } from 'util';
|
import { normalizeChannel } from 'util';
|
||||||
|
|
||||||
|
@ -98,6 +99,15 @@ export default function handleSocket({ socket, store: { dispatch, getState } })
|
||||||
dispatch(addMessage(message, tab.server, tab.name));
|
dispatch(addMessage(message, tab.server, tab.name));
|
||||||
},
|
},
|
||||||
|
|
||||||
|
connection_update({ server, errorType }) {
|
||||||
|
if (errorType === 'verify' &&
|
||||||
|
confirm('The server is using a self-signed certificate, continue anyway?')) {
|
||||||
|
dispatch(reconnect(server, {
|
||||||
|
skipVerify: true
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
_connected(connected) {
|
_connected(connected) {
|
||||||
dispatch(setConnected(connected));
|
dispatch(setConnected(connected));
|
||||||
}
|
}
|
||||||
|
|
|
@ -28,6 +28,7 @@ export const TOGGLE_SEARCH = 'TOGGLE_SEARCH';
|
||||||
export const AWAY = 'AWAY';
|
export const AWAY = 'AWAY';
|
||||||
export const CONNECT = 'CONNECT';
|
export const CONNECT = 'CONNECT';
|
||||||
export const DISCONNECT = 'DISCONNECT';
|
export const DISCONNECT = 'DISCONNECT';
|
||||||
|
export const RECONNECT = 'RECONNECT';
|
||||||
export const SET_NICK = 'SET_NICK';
|
export const SET_NICK = 'SET_NICK';
|
||||||
export const SET_SERVER_NAME = 'SET_SERVER_NAME';
|
export const SET_SERVER_NAME = 'SET_SERVER_NAME';
|
||||||
export const WHOIS = 'WHOIS';
|
export const WHOIS = 'WHOIS';
|
||||||
|
|
|
@ -150,6 +150,21 @@ export function disconnect(server) {
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function reconnect(server, settings) {
|
||||||
|
return {
|
||||||
|
type: actions.RECONNECT,
|
||||||
|
server,
|
||||||
|
settings,
|
||||||
|
socket: {
|
||||||
|
type: 'reconnect',
|
||||||
|
data: {
|
||||||
|
...settings,
|
||||||
|
server
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
export function whois(user, server) {
|
export function whois(user, server) {
|
||||||
return {
|
return {
|
||||||
type: actions.WHOIS,
|
type: actions.WHOIS,
|
||||||
|
|
16
irc/conn.go
16
irc/conn.go
|
@ -3,6 +3,7 @@ package irc
|
||||||
import (
|
import (
|
||||||
"bufio"
|
"bufio"
|
||||||
"crypto/tls"
|
"crypto/tls"
|
||||||
|
"crypto/x509"
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"net"
|
"net"
|
||||||
|
@ -33,6 +34,10 @@ func (c *Client) Connect(address string) {
|
||||||
go c.run()
|
go c.run()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (c *Client) Reconnect() {
|
||||||
|
close(c.reconnect)
|
||||||
|
}
|
||||||
|
|
||||||
func (c *Client) Write(data string) {
|
func (c *Client) Write(data string) {
|
||||||
c.out <- data + "\r\n"
|
c.out <- data + "\r\n"
|
||||||
}
|
}
|
||||||
|
@ -64,8 +69,9 @@ func (c *Client) run() {
|
||||||
return
|
return
|
||||||
|
|
||||||
case <-c.reconnect:
|
case <-c.reconnect:
|
||||||
c.disconnect()
|
if c.Connected() {
|
||||||
c.connChange(false, nil)
|
c.disconnect()
|
||||||
|
}
|
||||||
|
|
||||||
c.sendRecv.Wait()
|
c.sendRecv.Wait()
|
||||||
c.reconnect = make(chan struct{})
|
c.reconnect = make(chan struct{})
|
||||||
|
@ -107,6 +113,9 @@ func (c *Client) tryConnect() {
|
||||||
err := c.connect()
|
err := c.connect()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
c.connChange(false, err)
|
c.connChange(false, err)
|
||||||
|
if _, ok := err.(x509.UnknownAuthorityError); ok {
|
||||||
|
return
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
c.backoff.Reset()
|
c.backoff.Reset()
|
||||||
|
|
||||||
|
@ -181,7 +190,8 @@ func (c *Client) recv() {
|
||||||
return
|
return
|
||||||
|
|
||||||
default:
|
default:
|
||||||
close(c.reconnect)
|
c.connChange(false, nil)
|
||||||
|
c.Reconnect()
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
package server
|
package server
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"crypto/x509"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
|
|
||||||
"github.com/khlieng/dispatch/irc"
|
"github.com/khlieng/dispatch/irc"
|
||||||
|
@ -27,10 +28,16 @@ type ServerName struct {
|
||||||
Name string `json:"name"`
|
Name string `json:"name"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type ReconnectSettings struct {
|
||||||
|
Server string `json:"server"`
|
||||||
|
SkipVerify bool `json:"skipVerify"`
|
||||||
|
}
|
||||||
|
|
||||||
type ConnectionUpdate struct {
|
type ConnectionUpdate struct {
|
||||||
Server string `json:"server"`
|
Server string `json:"server"`
|
||||||
Connected bool `json:"connected"`
|
Connected bool `json:"connected"`
|
||||||
Error string `json:"error,omitempty"`
|
Error string `json:"error,omitempty"`
|
||||||
|
ErrorType string `json:"errorType,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func newConnectionUpdate(server string, state irc.ConnectionState) ConnectionUpdate {
|
func newConnectionUpdate(server string, state irc.ConnectionState) ConnectionUpdate {
|
||||||
|
@ -40,6 +47,9 @@ func newConnectionUpdate(server string, state irc.ConnectionState) ConnectionUpd
|
||||||
}
|
}
|
||||||
if state.Error != nil {
|
if state.Error != nil {
|
||||||
status.Error = state.Error.Error()
|
status.Error = state.Error.Error()
|
||||||
|
if _, ok := state.Error.(x509.UnknownAuthorityError); ok {
|
||||||
|
status.ErrorType = "verify"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return status
|
return status
|
||||||
}
|
}
|
||||||
|
|
|
@ -95,6 +95,18 @@ func (h *wsHandler) connect(b []byte) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (h *wsHandler) reconnect(b []byte) {
|
||||||
|
var data ReconnectSettings
|
||||||
|
json.Unmarshal(b, &data)
|
||||||
|
|
||||||
|
if i, ok := h.session.getIRC(data.Server); ok && !i.Connected() {
|
||||||
|
if i.TLS {
|
||||||
|
i.TLSConfig.InsecureSkipVerify = data.SkipVerify
|
||||||
|
}
|
||||||
|
i.Reconnect()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func (h *wsHandler) join(b []byte) {
|
func (h *wsHandler) join(b []byte) {
|
||||||
var data Join
|
var data Join
|
||||||
json.Unmarshal(b, &data)
|
json.Unmarshal(b, &data)
|
||||||
|
@ -252,6 +264,7 @@ func (h *wsHandler) setServerName(b []byte) {
|
||||||
func (h *wsHandler) initHandlers() {
|
func (h *wsHandler) initHandlers() {
|
||||||
h.handlers = map[string]func([]byte){
|
h.handlers = map[string]func([]byte){
|
||||||
"connect": h.connect,
|
"connect": h.connect,
|
||||||
|
"reconnect": h.reconnect,
|
||||||
"join": h.join,
|
"join": h.join,
|
||||||
"part": h.part,
|
"part": h.part,
|
||||||
"quit": h.quit,
|
"quit": h.quit,
|
||||||
|
|
Loading…
Reference in New Issue