Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(177)

Side by Side Diff: net/tools/testserver/testserver.py

Issue 7246021: Prevent DOS attack on UDP echo servers by distinguishing between an echo request (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 9 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « net/tools/testserver/echo_message.py ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 #!/usr/bin/python2.4 1 #!/usr/bin/python2.4
2 # Copyright (c) 2011 The Chromium Authors. All rights reserved. 2 # Copyright (c) 2011 The Chromium Authors. All rights reserved.
3 # Use of this source code is governed by a BSD-style license that can be 3 # Use of this source code is governed by a BSD-style license that can be
4 # found in the LICENSE file. 4 # found in the LICENSE file.
5 5
6 """This is a simple HTTP/FTP/SYNC/TCP ECHO/UDP ECHO/ server used for testing 6 """This is a simple HTTP/FTP/SYNC/TCP/UDP/ server used for testing Chrome.
7 Chrome.
8 7
9 It supports several test URLs, as specified by the handlers in TestPageHandler. 8 It supports several test URLs, as specified by the handlers in TestPageHandler.
10 By default, it listens on an ephemeral port and sends the port number back to 9 By default, it listens on an ephemeral port and sends the port number back to
11 the originating process over a pipe. The originating process can specify an 10 the originating process over a pipe. The originating process can specify an
12 explicit port if necessary. 11 explicit port if necessary.
13 It can use https if you specify the flag --https=CERT where CERT is the path 12 It can use https if you specify the flag --https=CERT where CERT is the path
14 to a pem file containing the certificate and private key that should be used. 13 to a pem file containing the certificate and private key that should be used.
15 """ 14 """
16 15
17 import asyncore 16 import asyncore
18 import base64 17 import base64
19 import BaseHTTPServer 18 import BaseHTTPServer
20 import cgi 19 import cgi
21 import errno 20 import errno
22 import optparse 21 import optparse
23 import os 22 import os
23 import random
24 import re 24 import re
25 import select 25 import select
26 import simplejson 26 import simplejson
27 import SocketServer 27 import SocketServer
28 import socket 28 import socket
29 import sys 29 import sys
30 import struct 30 import struct
31 import time 31 import time
32 import urlparse 32 import urlparse
33 import warnings 33 import warnings
34 import zlib 34 import zlib
35 35
36 # Ignore deprecation warnings, they make our output more cluttered. 36 # Ignore deprecation warnings, they make our output more cluttered.
37 warnings.filterwarnings("ignore", category=DeprecationWarning) 37 warnings.filterwarnings("ignore", category=DeprecationWarning)
38 38
39 import echo_message
39 import pyftpdlib.ftpserver 40 import pyftpdlib.ftpserver
40 import tlslite 41 import tlslite
41 import tlslite.api 42 import tlslite.api
42 43
43 try: 44 try:
44 import hashlib 45 import hashlib
45 _new_md5 = hashlib.md5 46 _new_md5 = hashlib.md5
46 except ImportError: 47 except ImportError:
47 import md5 48 import md5
48 _new_md5 = md5.new 49 _new_md5 = md5.new
(...skipping 1465 matching lines...) Expand 10 before | Expand all | Expand 10 after
1514 1515
1515 1516
1516 class TCPEchoHandler(SocketServer.BaseRequestHandler): 1517 class TCPEchoHandler(SocketServer.BaseRequestHandler):
1517 """The RequestHandler class for TCP echo server. 1518 """The RequestHandler class for TCP echo server.
1518 1519
1519 It is instantiated once per connection to the server, and overrides the 1520 It is instantiated once per connection to the server, and overrides the
1520 handle() method to implement communication to the client. 1521 handle() method to implement communication to the client.
1521 """ 1522 """
1522 1523
1523 def handle(self): 1524 def handle(self):
1524 data = self.request.recv(65536) 1525 """Handles the request from the client and constructs a response."""
1525 if not data: 1526
1527 data = self.request.recv(65536).strip()
1528 # Verify the "echo request" message received from the client. Send back
1529 # "echo response" message if "echo request" message is valid.
1530 try:
1531 return_data = echo_message.GetEchoResponseData(data)
1532 if not return_data:
1526 return 1533 return
1527 self.request.send(data) 1534 except ValueError:
1535 return
1536
1537 self.request.send(return_data)
1528 1538
1529 1539
1530 class UDPEchoHandler(SocketServer.BaseRequestHandler): 1540 class UDPEchoHandler(SocketServer.BaseRequestHandler):
1531 """The RequestHandler class for UDP echo server. 1541 """The RequestHandler class for UDP echo server.
1532 1542
1533 It is instantiated once per connection to the server, and overrides the 1543 It is instantiated once per connection to the server, and overrides the
1534 handle() method to implement communication to the client. 1544 handle() method to implement communication to the client.
1535 """ 1545 """
1536 1546
1537 def handle(self): 1547 def handle(self):
1548 """Handles the request from the client and constructs a response."""
1549
1538 data = self.request[0].strip() 1550 data = self.request[0].strip()
1539 socket = self.request[1] 1551 socket = self.request[1]
1540 socket.sendto(data, self.client_address) 1552 # Verify the "echo request" message received from the client. Send back
1553 # "echo response" message if "echo request" message is valid.
1554 try:
1555 return_data = echo_message.GetEchoResponseData(data)
1556 if not return_data:
1557 return
1558 except ValueError:
1559 return
1560 socket.sendto(return_data, self.client_address)
1541 1561
1542 1562
1543 class FileMultiplexer: 1563 class FileMultiplexer:
1544 def __init__(self, fd1, fd2) : 1564 def __init__(self, fd1, fd2) :
1545 self.__fd1 = fd1 1565 self.__fd1 = fd1
1546 self.__fd2 = fd2 1566 self.__fd2 = fd2
1547 1567
1548 def __del__(self) : 1568 def __del__(self) :
1549 if self.__fd1 != sys.stdout and self.__fd1 != sys.stderr: 1569 if self.__fd1 != sys.stdout and self.__fd1 != sys.stderr:
1550 self.__fd1.close() 1570 self.__fd1.close()
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
1597 server._device_management_handler = None 1617 server._device_management_handler = None
1598 server.policy_keys = options.policy_keys 1618 server.policy_keys = options.policy_keys
1599 server.policy_user = options.policy_user 1619 server.policy_user = options.policy_user
1600 elif options.server_type == SERVER_SYNC: 1620 elif options.server_type == SERVER_SYNC:
1601 server = SyncHTTPServer(('127.0.0.1', port), SyncPageHandler) 1621 server = SyncHTTPServer(('127.0.0.1', port), SyncPageHandler)
1602 print 'Sync HTTP server started on port %d...' % server.server_port 1622 print 'Sync HTTP server started on port %d...' % server.server_port
1603 print 'Sync XMPP server started on port %d...' % server.xmpp_port 1623 print 'Sync XMPP server started on port %d...' % server.xmpp_port
1604 server_data['port'] = server.server_port 1624 server_data['port'] = server.server_port
1605 server_data['xmpp_port'] = server.xmpp_port 1625 server_data['xmpp_port'] = server.xmpp_port
1606 elif options.server_type == SERVER_TCP_ECHO: 1626 elif options.server_type == SERVER_TCP_ECHO:
1627 # Used for generating the key (randomly) that encodes the "echo request"
1628 # message.
1629 random.seed()
1607 server = TCPEchoServer(('127.0.0.1', port), TCPEchoHandler) 1630 server = TCPEchoServer(('127.0.0.1', port), TCPEchoHandler)
1608 print 'Echo TCP server started on port %d...' % server.server_port 1631 print 'Echo TCP server started on port %d...' % server.server_port
1609 server_data['port'] = server.server_port 1632 server_data['port'] = server.server_port
1610 elif options.server_type == SERVER_UDP_ECHO: 1633 elif options.server_type == SERVER_UDP_ECHO:
1634 # Used for generating the key (randomly) that encodes the "echo request"
1635 # message.
1636 random.seed()
1611 server = UDPEchoServer(('127.0.0.1', port), UDPEchoHandler) 1637 server = UDPEchoServer(('127.0.0.1', port), UDPEchoHandler)
1612 print 'Echo UDP server started on port %d...' % server.server_port 1638 print 'Echo UDP server started on port %d...' % server.server_port
1613 server_data['port'] = server.server_port 1639 server_data['port'] = server.server_port
1614 # means FTP Server 1640 # means FTP Server
1615 else: 1641 else:
1616 my_data_dir = MakeDataDir() 1642 my_data_dir = MakeDataDir()
1617 1643
1618 # Instantiate a dummy authorizer for managing 'virtual' users 1644 # Instantiate a dummy authorizer for managing 'virtual' users
1619 authorizer = pyftpdlib.ftpserver.DummyAuthorizer() 1645 authorizer = pyftpdlib.ftpserver.DummyAuthorizer()
1620 1646
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after
1727 'random key if none is specified on the command ' 1753 'random key if none is specified on the command '
1728 'line.') 1754 'line.')
1729 option_parser.add_option('', '--policy-user', default='user@example.com', 1755 option_parser.add_option('', '--policy-user', default='user@example.com',
1730 dest='policy_user', 1756 dest='policy_user',
1731 help='Specify the user name the server should ' 1757 help='Specify the user name the server should '
1732 'report back to the client as the user owning the ' 1758 'report back to the client as the user owning the '
1733 'token used for making the policy request.') 1759 'token used for making the policy request.')
1734 options, args = option_parser.parse_args() 1760 options, args = option_parser.parse_args()
1735 1761
1736 sys.exit(main(options, args)) 1762 sys.exit(main(options, args))
OLDNEW
« no previous file with comments | « net/tools/testserver/echo_message.py ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698