1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120 | ------------------------------------------------------------------------------
-- --
-- GNOGA - The GNU Omnificent GUI for Ada --
-- --
-- G N O G A . S E R V E R . C O N N E C I O N . S E C U R E --
-- --
-- B o d y --
-- --
-- --
-- Copyright (C) 2014 David Botton --
-- --
-- This library is free software; you can redistribute it and/or modify --
-- it under terms of the GNU General Public License as published by the --
-- Free Software Foundation; either version 3, or (at your option) any --
-- later version. This library is distributed in the hope that it will be --
-- useful, but WITHOUT ANY WARRANTY; without even the implied warranty of --
-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. --
-- --
-- As a special exception under Section 7 of GPL version 3, you are --
-- granted additional permissions described in the GCC Runtime Library --
-- Exception, version 3.1, as published by the Free Software Foundation. --
-- --
-- You should have received a copy of the GNU General Public License and --
-- a copy of the GCC Runtime Library Exception along with this program; --
-- see the files COPYING3 and COPYING.RUNTIME respectively. If not, see --
-- <http://www.gnu.org/licenses/>. --
-- --
-- As a special exception, if other files instantiate generics from this --
-- unit, or you link this unit with other files to produce an executable, --
-- this unit does not by itself cause the resulting executable to be --
-- covered by the GNU General Public License. This exception does not --
-- however invalidate any other reasons why the executable file might be --
-- covered by the GNU Public License. --
-- --
-- For more information please go to http://www.gnoga.com --
------------------------------------------------------------------------------
with Gnoga.Server.Connection.Common; use Gnoga.Server.Connection.Common;
with GNAT.Sockets.Server; use GNAT.Sockets.Server;
with GNAT.Sockets.Connection_State_Machine.HTTP_Server;
use GNAT.Sockets.Connection_State_Machine.HTTP_Server;
with GNAT.Sockets.Server.Secure;
with GNAT.Sockets.Server.Secure.X509;
package body Gnoga.Server.Connection.Secure is
pragma Linker_Options ("-lgnutls");
function Secure_Server_Factory return Pointer_To_Connections_Factory_Class;
type X509_HTTPS_Factory
(Request_Length : Positive; Input_Size : Buffer_Length;
Output_Size : Buffer_Length; Decoded_Size : Buffer_Length;
Max_Connections : Positive)
is new GNAT.Sockets.Server.Secure.X509.X509_Authentication_Factory
(Decoded_Size => Decoded_Size) with
null record;
overriding function Create
(Factory : access X509_HTTPS_Factory;
Listener : access Connections_Server'Class;
From : GNAT.Sockets.Sock_Addr_Type) return Connection_Ptr;
overriding function Create
(Factory : access X509_HTTPS_Factory;
Listener : access Connections_Server'Class;
From : GNAT.Sockets.Sock_Addr_Type) return Connection_Ptr
is
begin
return
Gnoga.Server.Connection.Common.Gnoga_Client_Factory
(Listener => Listener.all'Unchecked_Access,
Request_Length => Factory.Request_Length,
Input_Size => Factory.Input_Size,
Output_Size => Factory.Output_Size);
end Create;
procedure Register_Secure_Server
(Certificate_File : String; Key_File : String; Port : Integer := 443;
Disable_Insecure : Boolean := False)
is
begin
Secure_Server := True;
Secure_Port := GNAT.Sockets.Port_Type (Port);
Secure_Only := Disable_Insecure;
Secure_Crt := Certificate_File;
Secure_Key := Key_File;
end Register_Secure_Server;
Factory : aliased X509_HTTPS_Factory
(Request_Length => Max_HTTP_Request_Length,
Input_Size => Max_HTTP_Input_Chunk, Output_Size => Max_HTTP_Output_Chunk,
Decoded_Size => Max_HTTP_Input_Chunk,
Max_Connections => Max_HTTP_Connections);
function Secure_Server_Factory return Pointer_To_Connections_Factory_Class
is
begin
Add_System_Trust (Factory);
Add_Key_From_PEM_File
(Factory => Factory, Certificate_File => To_UTF_8 (Secure_Crt),
Key_File => To_UTF_8 (Secure_Key));
Generate_Diffie_Hellman_Parameters (Factory);
-- Trace_On (Factory => Factory,
-- Received => GNAT.Sockets.Server.Trace_Any,
-- Sent => GNAT.Sockets.Server.Trace_Any);
-- Set_TLS_Tracing (Factory => Factory,
-- Session => True,
-- Decoded => True);
return Factory'Access;
end Secure_Server_Factory;
begin
Gnoga.Server.Connection.Common.Gnoga_Secure_Factory :=
Secure_Server_Factory'Access;
end Gnoga.Server.Connection.Secure;
|