<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array">
    <added>
      <filename>tasks/generate_certificate.rake</filename>
    </added>
  </added>
  <modified type="array">
    <modified>
      <diff>@@ -1,5 +1,7 @@
 require 'rake/clean'
 
+Dir['tasks/**/*.rake'].each { |rake| load rake }
+
 def percent_to_color(per)
 	if ENV['COLORTERM'].to_s.downcase == 'yes' or ENV['TERM'] =~ /-color$/
 		if per &gt;= 90.0</diff>
      <filename>Rakefile</filename>
    </modified>
    <modified>
      <diff>@@ -1467,274 +1467,288 @@ smtp_session_auth_test_() -&gt;
 	}.
 
 smtp_session_tls_test_() -&gt;
-	{foreach,
-		local,
-		fun() -&gt;
-				Self = self(),
-				spawn(fun() -&gt;
-							{ok, ListenSock} = gen_tcp:listen(9876, [list, {packet, line}, {reuseaddr, true}, {keepalive, true}, {backlog, 30}, {active, false}]),
-							{ok, X} = gen_tcp:accept(ListenSock),
-							inet:setopts(X, [list, {packet, line}, {reuseaddr, true}, {keepalive, true}, {backlog, 30}, {active, false}]),
-							gen_tcp:controlling_process(X, Self),
-							Self ! X
-					end),
-				{ok, CSock} = gen_tcp:connect(&quot;localhost&quot;, 9876,  [list, {packet, line}, {active, false}]),
-				receive
-					SSock when is_port(SSock) -&gt;
-						?debugFmt(&quot;Got server side of the socket ~p, client is ~p~n&quot;, [SSock, CSock])
+	case filelib:is_regular(&quot;server.crt&quot;) of
+		true -&gt;
+			{foreach,
+				local,
+				fun() -&gt;
+						Self = self(),
+						spawn(fun() -&gt;
+									{ok, ListenSock} = gen_tcp:listen(9876, [list, {packet, line}, {reuseaddr, true}, {keepalive, true}, {backlog, 30}, {active, false}]),
+									{ok, X} = gen_tcp:accept(ListenSock),
+									inet:setopts(X, [list, {packet, line}, {reuseaddr, true}, {keepalive, true}, {backlog, 30}, {active, false}]),
+									gen_tcp:controlling_process(X, Self),
+									Self ! X
+							end),
+						{ok, CSock} = gen_tcp:connect(&quot;localhost&quot;, 9876,  [list, {packet, line}, {active, false}]),
+						receive
+							SSock when is_port(SSock) -&gt;
+								?debugFmt(&quot;Got server side of the socket ~p, client is ~p~n&quot;, [SSock, CSock])
+						end,
+						{ok, Pid} = gen_smtp_server_session:start(SSock, smtp_server_example_auth, &quot;localhost&quot;, 1),
+						gen_tcp:controlling_process(SSock, Pid),
+						{CSock, Pid}
 				end,
-				{ok, Pid} = gen_smtp_server_session:start(SSock, smtp_server_example_auth, &quot;localhost&quot;, 1),
-				gen_tcp:controlling_process(SSock, Pid),
-				{CSock, Pid}
-		end,
-		fun({CSock, _Pid}) -&gt;
-				gen_tcp:close(CSock)
-		end,
-		[fun({CSock, _Pid}) -&gt;
-					{&quot;EHLO response includes STARTTLS&quot;,
-						fun() -&gt;
-								inet:setopts(CSock, [{active, once}]),
-								receive {tcp, CSock, Packet} -&gt; inet:setopts(CSock, [{active, once}]) end,
-								?assertMatch(&quot;220 localhost&quot;++_Stuff,  Packet),
-								gen_tcp:send(CSock, &quot;EHLO somehost.com\r\n&quot;),
-								receive {tcp, CSock, Packet2} -&gt; inet:setopts(CSock, [{active, once}]) end,
-								?assertMatch(&quot;250-localhost\r\n&quot;,  Packet2),
-								Foo = fun(F, Acc) -&gt;
-										receive
-											{tcp, CSock, &quot;250-STARTTLS&quot;++_} -&gt;
-												inet:setopts(CSock, [{active, once}]),
-												F(F, true);
-											{tcp, CSock, &quot;250-&quot;++Packet3} -&gt;
-												?debugFmt(&quot;XX~sXX&quot;, [Packet3]),
-												inet:setopts(CSock, [{active, once}]),
-												F(F, Acc);
-											{tcp, CSock, &quot;250 STARTTLS&quot;++_} -&gt;
-												inet:setopts(CSock, [{active, once}]),
-												true;
-											{tcp, CSock, &quot;250 &quot;++Packet3} -&gt;
-												inet:setopts(CSock, [{active, once}]),
-												Acc;
-											R -&gt;
-												inet:setopts(CSock, [{active, once}]),
-												error
-										end
-								end,
-								?assertEqual(true, Foo(Foo, false))
-						end
-					}
-			end,
-			fun({CSock, _Pid}) -&gt;
-					{&quot;STARTTLS does a SSL handshake&quot;,
-						fun() -&gt;
-								inet:setopts(CSock, [{active, once}]),
-								receive {tcp, CSock, Packet} -&gt; inet:setopts(CSock, [{active, once}]) end,
-								?assertMatch(&quot;220 localhost&quot;++_Stuff,  Packet),
-								gen_tcp:send(CSock, &quot;EHLO somehost.com\r\n&quot;),
-								receive {tcp, CSock, Packet2} -&gt; inet:setopts(CSock, [{active, once}]) end,
-								?assertMatch(&quot;250-localhost\r\n&quot;,  Packet2),
-								Foo = fun(F, Acc) -&gt;
-										receive
-											{tcp, CSock, &quot;250-STARTTLS&quot;++_} -&gt;
-												inet:setopts(CSock, [{active, once}]),
-												F(F, true);
-											{tcp, CSock, &quot;250-&quot;++Packet3} -&gt;
-												?debugFmt(&quot;XX~sXX&quot;, [Packet3]),
-												inet:setopts(CSock, [{active, once}]),
-												F(F, Acc);
-											{tcp, CSock, &quot;250 STARTTLS&quot;++_} -&gt;
-												inet:setopts(CSock, [{active, once}]),
-												true;
-											{tcp, CSock, &quot;250 &quot;++Packet3} -&gt;
-												inet:setopts(CSock, [{active, once}]),
-												Acc;
-											R -&gt;
-												inet:setopts(CSock, [{active, once}]),
-												error
-										end
-								end,
-								?assertEqual(true, Foo(Foo, false)),
-								gen_tcp:send(CSock, &quot;STARTTLS\r\n&quot;),
-								receive {tcp, CSock, Packet4} -&gt; ok end,
-								?assertMatch(&quot;220 &quot;++_,  Packet4),
-								application:start(ssl),
-								Result = ssl:connect(CSock, [{ssl_impl, new}]),
-								?assertMatch({ok, Socket}, Result),
-								{ok, Socket} = Result
-								%ssl:setopts(Socket, [{active, once}]),
-								%ssl:send(Socket, &quot;EHLO somehost.com\r\n&quot;),
-								%receive {ssl, Socket, Packet5} -&gt; ssl:setopts(Socket, [{active, once}]) end,
-								%?assertEqual(&quot;Foo&quot;, Packet5),
-						end
-					}
-			end,
-			fun({CSock, _Pid}) -&gt;
-					{&quot;After STARTTLS, EHLO doesn't report STARTTLS&quot;,
-						fun() -&gt;
-								inet:setopts(CSock, [{active, once}]),
-								receive {tcp, CSock, Packet} -&gt; inet:setopts(CSock, [{active, once}]) end,
-								?assertMatch(&quot;220 localhost&quot;++_Stuff,  Packet),
-								gen_tcp:send(CSock, &quot;EHLO somehost.com\r\n&quot;),
-								receive {tcp, CSock, Packet2} -&gt; inet:setopts(CSock, [{active, once}]) end,
-								?assertMatch(&quot;250-localhost\r\n&quot;,  Packet2),
-								Foo = fun(F, Acc) -&gt;
-										receive
-											{tcp, CSock, &quot;250-STARTTLS&quot;++_} -&gt;
-												inet:setopts(CSock, [{active, once}]),
-												F(F, true);
-											{tcp, CSock, &quot;250-&quot;++Packet3} -&gt;
-												?debugFmt(&quot;XX~sXX&quot;, [Packet3]),
-												inet:setopts(CSock, [{active, once}]),
-												F(F, Acc);
-											{tcp, CSock, &quot;250 STARTTLS&quot;++_} -&gt;
-												inet:setopts(CSock, [{active, once}]),
-												true;
-											{tcp, CSock, &quot;250 &quot;++Packet3} -&gt;
-												inet:setopts(CSock, [{active, once}]),
-												Acc;
-											R -&gt;
-												inet:setopts(CSock, [{active, once}]),
-												error
-										end
-								end,
-								?assertEqual(true, Foo(Foo, false)),
-								gen_tcp:send(CSock, &quot;STARTTLS\r\n&quot;),
-								receive {tcp, CSock, Packet4} -&gt; ok end,
-								?assertMatch(&quot;220 &quot;++_,  Packet4),
-								application:start(ssl),
-								Result = ssl:connect(CSock, [{ssl_impl, new}]),
-								?assertMatch({ok, Socket}, Result),
-								{ok, Socket} = Result,
-								ssl:setopts(Socket, [{active, once}]),
-								ssl:send(Socket, &quot;EHLO somehost.com\r\n&quot;),
-								receive {ssl, Socket, Packet5} -&gt; ssl:setopts(Socket, [{active, once}]) end,
-								?assertMatch(&quot;250-localhost\r\n&quot;,  Packet5),
-								Bar = fun(F, Acc) -&gt;
-										receive
-											{ssl, Socket, &quot;250-STARTTLS&quot;++_} -&gt;
-												ssl:setopts(Socket, [{active, once}]),
-												F(F, true);
-											{ssl, Socket, &quot;250-&quot;++_} -&gt;
-												ssl:setopts(Socket, [{active, once}]),
-												F(F, Acc);
-											{ssl, Socket, &quot;250 STARTTLS&quot;++_} -&gt;
-												ssl:setopts(Socket, [{active, once}]),
-												true;
-											{ssl, Socket, &quot;250 &quot;++_} -&gt;
-												ssl:setopts(Socket, [{active, once}]),
-												Acc;
-											R -&gt;
-												ssl:setopts(Socket, [{active, once}]),
-												error
-										end
-								end,
-								?assertEqual(false, Bar(Bar, false))
-						end
-					}
-			end,
-			fun({CSock, _Pid}) -&gt;
-					{&quot;After STARTTLS, re-negotiating STARTTLS is an error&quot;,
-						fun() -&gt;
-								inet:setopts(CSock, [{active, once}]),
-								receive {tcp, CSock, Packet} -&gt; inet:setopts(CSock, [{active, once}]) end,
-								?assertMatch(&quot;220 localhost&quot;++_Stuff,  Packet),
-								gen_tcp:send(CSock, &quot;EHLO somehost.com\r\n&quot;),
-								receive {tcp, CSock, Packet2} -&gt; inet:setopts(CSock, [{active, once}]) end,
-								?assertMatch(&quot;250-localhost\r\n&quot;,  Packet2),
-								Foo = fun(F, Acc) -&gt;
-										receive
-											{tcp, CSock, &quot;250-STARTTLS&quot;++_} -&gt;
-												inet:setopts(CSock, [{active, once}]),
-												F(F, true);
-											{tcp, CSock, &quot;250-&quot;++Packet3} -&gt;
-												?debugFmt(&quot;XX~sXX&quot;, [Packet3]),
-												inet:setopts(CSock, [{active, once}]),
-												F(F, Acc);
-											{tcp, CSock, &quot;250 STARTTLS&quot;++_} -&gt;
-												inet:setopts(CSock, [{active, once}]),
-												true;
-											{tcp, CSock, &quot;250 &quot;++Packet3} -&gt;
-												inet:setopts(CSock, [{active, once}]),
-												Acc;
-											R -&gt;
-												inet:setopts(CSock, [{active, once}]),
-												error
-										end
-								end,
-								?assertEqual(true, Foo(Foo, false)),
-								gen_tcp:send(CSock, &quot;STARTTLS\r\n&quot;),
-								receive {tcp, CSock, Packet4} -&gt; ok end,
-								?assertMatch(&quot;220 &quot;++_,  Packet4),
-								application:start(ssl),
-								Result = ssl:connect(CSock, [{ssl_impl, new}]),
-								?assertMatch({ok, Socket}, Result),
-								{ok, Socket} = Result,
-								ssl:setopts(Socket, [{active, once}]),
-								ssl:send(Socket, &quot;EHLO somehost.com\r\n&quot;),
-								receive {ssl, Socket, Packet5} -&gt; ssl:setopts(Socket, [{active, once}]) end,
-								?assertMatch(&quot;250-localhost\r\n&quot;,  Packet5),
-								Bar = fun(F, Acc) -&gt;
-										receive
-											{ssl, Socket, &quot;250-STARTTLS&quot;++_} -&gt;
-												ssl:setopts(Socket, [{active, once}]),
-												F(F, true);
-											{ssl, Socket, &quot;250-&quot;++_} -&gt;
-												ssl:setopts(Socket, [{active, once}]),
-												F(F, Acc);
-											{ssl, Socket, &quot;250 STARTTLS&quot;++_} -&gt;
-												ssl:setopts(Socket, [{active, once}]),
-												true;
-											{ssl, Socket, &quot;250 &quot;++_} -&gt;
-												ssl:setopts(Socket, [{active, once}]),
-												Acc;
-											R -&gt;
-												ssl:setopts(Socket, [{active, once}]),
-												error
-										end
-								end,
-								?assertEqual(false, Bar(Bar, false)),
-								ssl:send(Socket, &quot;STARTTLS\r\n&quot;),
-								receive {ssl, Socket, Packet6} -&gt; ssl:setopts(Socket, [{active, once}]) end,
-								?assertMatch(&quot;500 &quot;++_,  Packet6)
-						end
-					}
-			end,
-			fun({CSock, _Pid}) -&gt;
-					{&quot;After STARTTLS, re-negotiating STARTTLS is an error&quot;,
-						fun() -&gt;
-								inet:setopts(CSock, [{active, once}]),
-								receive {tcp, CSock, Packet} -&gt; inet:setopts(CSock, [{active, once}]) end,
-								?assertMatch(&quot;220 localhost&quot;++_Stuff,  Packet),
-								gen_tcp:send(CSock, &quot;EHLO somehost.com\r\n&quot;),
-								receive {tcp, CSock, Packet2} -&gt; inet:setopts(CSock, [{active, once}]) end,
-								?assertMatch(&quot;250-localhost\r\n&quot;,  Packet2),
-								Foo = fun(F, Acc) -&gt;
-										receive
-											{tcp, CSock, &quot;250-STARTTLS&quot;++_} -&gt;
-												inet:setopts(CSock, [{active, once}]),
-												F(F, true);
-											{tcp, CSock, &quot;250-&quot;++Packet3} -&gt;
-												?debugFmt(&quot;XX~sXX&quot;, [Packet3]),
-												inet:setopts(CSock, [{active, once}]),
-												F(F, Acc);
-											{tcp, CSock, &quot;250 STARTTLS&quot;++_} -&gt;
-												inet:setopts(CSock, [{active, once}]),
-												true;
-											{tcp, CSock, &quot;250 &quot;++Packet3} -&gt;
-												inet:setopts(CSock, [{active, once}]),
-												Acc;
-											R -&gt;
-												inet:setopts(CSock, [{active, once}]),
-												error
-										end
-								end,
-								?assertEqual(true, Foo(Foo, false)),
-								gen_tcp:send(CSock, &quot;STARTTLS foo\r\n&quot;),
-								receive {tcp, CSock, Packet4} -&gt; ok end,
-								?assertMatch(&quot;501 &quot;++_,  Packet4)
-						end
-					}
-			end
-		]
-	}.
+				fun({CSock, _Pid}) -&gt;
+						gen_tcp:close(CSock)
+				end,
+				[fun({CSock, _Pid}) -&gt;
+							{&quot;EHLO response includes STARTTLS&quot;,
+								fun() -&gt;
+										inet:setopts(CSock, [{active, once}]),
+										receive {tcp, CSock, Packet} -&gt; inet:setopts(CSock, [{active, once}]) end,
+										?assertMatch(&quot;220 localhost&quot;++_Stuff,  Packet),
+										gen_tcp:send(CSock, &quot;EHLO somehost.com\r\n&quot;),
+										receive {tcp, CSock, Packet2} -&gt; inet:setopts(CSock, [{active, once}]) end,
+										?assertMatch(&quot;250-localhost\r\n&quot;,  Packet2),
+										Foo = fun(F, Acc) -&gt;
+												receive
+													{tcp, CSock, &quot;250-STARTTLS&quot;++_} -&gt;
+														inet:setopts(CSock, [{active, once}]),
+														F(F, true);
+													{tcp, CSock, &quot;250-&quot;++Packet3} -&gt;
+														?debugFmt(&quot;XX~sXX&quot;, [Packet3]),
+														inet:setopts(CSock, [{active, once}]),
+														F(F, Acc);
+													{tcp, CSock, &quot;250 STARTTLS&quot;++_} -&gt;
+														inet:setopts(CSock, [{active, once}]),
+														true;
+													{tcp, CSock, &quot;250 &quot;++Packet3} -&gt;
+														inet:setopts(CSock, [{active, once}]),
+														Acc;
+													R -&gt;
+														inet:setopts(CSock, [{active, once}]),
+														error
+												end
+										end,
+										?assertEqual(true, Foo(Foo, false))
+								end
+							}
+					end,
+					fun({CSock, _Pid}) -&gt;
+							{&quot;STARTTLS does a SSL handshake&quot;,
+								fun() -&gt;
+										inet:setopts(CSock, [{active, once}]),
+										receive {tcp, CSock, Packet} -&gt; inet:setopts(CSock, [{active, once}]) end,
+										?assertMatch(&quot;220 localhost&quot;++_Stuff,  Packet),
+										gen_tcp:send(CSock, &quot;EHLO somehost.com\r\n&quot;),
+										receive {tcp, CSock, Packet2} -&gt; inet:setopts(CSock, [{active, once}]) end,
+										?assertMatch(&quot;250-localhost\r\n&quot;,  Packet2),
+										Foo = fun(F, Acc) -&gt;
+												receive
+													{tcp, CSock, &quot;250-STARTTLS&quot;++_} -&gt;
+														inet:setopts(CSock, [{active, once}]),
+														F(F, true);
+													{tcp, CSock, &quot;250-&quot;++Packet3} -&gt;
+														?debugFmt(&quot;XX~sXX&quot;, [Packet3]),
+														inet:setopts(CSock, [{active, once}]),
+														F(F, Acc);
+													{tcp, CSock, &quot;250 STARTTLS&quot;++_} -&gt;
+														inet:setopts(CSock, [{active, once}]),
+														true;
+													{tcp, CSock, &quot;250 &quot;++Packet3} -&gt;
+														inet:setopts(CSock, [{active, once}]),
+														Acc;
+													R -&gt;
+														inet:setopts(CSock, [{active, once}]),
+														error
+												end
+										end,
+										?assertEqual(true, Foo(Foo, false)),
+										gen_tcp:send(CSock, &quot;STARTTLS\r\n&quot;),
+										receive {tcp, CSock, Packet4} -&gt; ok end,
+										?assertMatch(&quot;220 &quot;++_,  Packet4),
+										application:start(ssl),
+										Result = ssl:connect(CSock, [{ssl_impl, new}]),
+										?assertMatch({ok, Socket}, Result),
+										{ok, Socket} = Result
+										%ssl:setopts(Socket, [{active, once}]),
+										%ssl:send(Socket, &quot;EHLO somehost.com\r\n&quot;),
+										%receive {ssl, Socket, Packet5} -&gt; ssl:setopts(Socket, [{active, once}]) end,
+										%?assertEqual(&quot;Foo&quot;, Packet5),
+								end
+							}
+					end,
+					fun({CSock, _Pid}) -&gt;
+							{&quot;After STARTTLS, EHLO doesn't report STARTTLS&quot;,
+								fun() -&gt;
+										inet:setopts(CSock, [{active, once}]),
+										receive {tcp, CSock, Packet} -&gt; inet:setopts(CSock, [{active, once}]) end,
+										?assertMatch(&quot;220 localhost&quot;++_Stuff,  Packet),
+										gen_tcp:send(CSock, &quot;EHLO somehost.com\r\n&quot;),
+										receive {tcp, CSock, Packet2} -&gt; inet:setopts(CSock, [{active, once}]) end,
+										?assertMatch(&quot;250-localhost\r\n&quot;,  Packet2),
+										Foo = fun(F, Acc) -&gt;
+												receive
+													{tcp, CSock, &quot;250-STARTTLS&quot;++_} -&gt;
+														inet:setopts(CSock, [{active, once}]),
+														F(F, true);
+													{tcp, CSock, &quot;250-&quot;++Packet3} -&gt;
+														?debugFmt(&quot;XX~sXX&quot;, [Packet3]),
+														inet:setopts(CSock, [{active, once}]),
+														F(F, Acc);
+													{tcp, CSock, &quot;250 STARTTLS&quot;++_} -&gt;
+														inet:setopts(CSock, [{active, once}]),
+														true;
+													{tcp, CSock, &quot;250 &quot;++Packet3} -&gt;
+														inet:setopts(CSock, [{active, once}]),
+														Acc;
+													R -&gt;
+														inet:setopts(CSock, [{active, once}]),
+														error
+												end
+										end,
+										?assertEqual(true, Foo(Foo, false)),
+										gen_tcp:send(CSock, &quot;STARTTLS\r\n&quot;),
+										receive {tcp, CSock, Packet4} -&gt; ok end,
+										?assertMatch(&quot;220 &quot;++_,  Packet4),
+										application:start(ssl),
+										Result = ssl:connect(CSock, [{ssl_impl, new}]),
+										?assertMatch({ok, Socket}, Result),
+										{ok, Socket} = Result,
+										ssl:setopts(Socket, [{active, once}]),
+										ssl:send(Socket, &quot;EHLO somehost.com\r\n&quot;),
+										receive {ssl, Socket, Packet5} -&gt; ssl:setopts(Socket, [{active, once}]) end,
+										?assertMatch(&quot;250-localhost\r\n&quot;,  Packet5),
+										Bar = fun(F, Acc) -&gt;
+												receive
+													{ssl, Socket, &quot;250-STARTTLS&quot;++_} -&gt;
+														ssl:setopts(Socket, [{active, once}]),
+														F(F, true);
+													{ssl, Socket, &quot;250-&quot;++_} -&gt;
+														ssl:setopts(Socket, [{active, once}]),
+														F(F, Acc);
+													{ssl, Socket, &quot;250 STARTTLS&quot;++_} -&gt;
+														ssl:setopts(Socket, [{active, once}]),
+														true;
+													{ssl, Socket, &quot;250 &quot;++_} -&gt;
+														ssl:setopts(Socket, [{active, once}]),
+														Acc;
+													R -&gt;
+														ssl:setopts(Socket, [{active, once}]),
+														error
+												end
+										end,
+										?assertEqual(false, Bar(Bar, false))
+								end
+							}
+					end,
+					fun({CSock, _Pid}) -&gt;
+							{&quot;After STARTTLS, re-negotiating STARTTLS is an error&quot;,
+								fun() -&gt;
+										inet:setopts(CSock, [{active, once}]),
+										receive {tcp, CSock, Packet} -&gt; inet:setopts(CSock, [{active, once}]) end,
+										?assertMatch(&quot;220 localhost&quot;++_Stuff,  Packet),
+										gen_tcp:send(CSock, &quot;EHLO somehost.com\r\n&quot;),
+										receive {tcp, CSock, Packet2} -&gt; inet:setopts(CSock, [{active, once}]) end,
+										?assertMatch(&quot;250-localhost\r\n&quot;,  Packet2),
+										Foo = fun(F, Acc) -&gt;
+												receive
+													{tcp, CSock, &quot;250-STARTTLS&quot;++_} -&gt;
+														inet:setopts(CSock, [{active, once}]),
+														F(F, true);
+													{tcp, CSock, &quot;250-&quot;++Packet3} -&gt;
+														?debugFmt(&quot;XX~sXX&quot;, [Packet3]),
+														inet:setopts(CSock, [{active, once}]),
+														F(F, Acc);
+													{tcp, CSock, &quot;250 STARTTLS&quot;++_} -&gt;
+														inet:setopts(CSock, [{active, once}]),
+														true;
+													{tcp, CSock, &quot;250 &quot;++Packet3} -&gt;
+														inet:setopts(CSock, [{active, once}]),
+														Acc;
+													R -&gt;
+														inet:setopts(CSock, [{active, once}]),
+														error
+												end
+										end,
+										?assertEqual(true, Foo(Foo, false)),
+										gen_tcp:send(CSock, &quot;STARTTLS\r\n&quot;),
+										receive {tcp, CSock, Packet4} -&gt; ok end,
+										?assertMatch(&quot;220 &quot;++_,  Packet4),
+										application:start(ssl),
+										Result = ssl:connect(CSock, [{ssl_impl, new}]),
+										?assertMatch({ok, Socket}, Result),
+										{ok, Socket} = Result,
+										ssl:setopts(Socket, [{active, once}]),
+										ssl:send(Socket, &quot;EHLO somehost.com\r\n&quot;),
+										receive {ssl, Socket, Packet5} -&gt; ssl:setopts(Socket, [{active, once}]) end,
+										?assertMatch(&quot;250-localhost\r\n&quot;,  Packet5),
+										Bar = fun(F, Acc) -&gt;
+												receive
+													{ssl, Socket, &quot;250-STARTTLS&quot;++_} -&gt;
+														ssl:setopts(Socket, [{active, once}]),
+														F(F, true);
+													{ssl, Socket, &quot;250-&quot;++_} -&gt;
+														ssl:setopts(Socket, [{active, once}]),
+														F(F, Acc);
+													{ssl, Socket, &quot;250 STARTTLS&quot;++_} -&gt;
+														ssl:setopts(Socket, [{active, once}]),
+														true;
+													{ssl, Socket, &quot;250 &quot;++_} -&gt;
+														ssl:setopts(Socket, [{active, once}]),
+														Acc;
+													R -&gt;
+														ssl:setopts(Socket, [{active, once}]),
+														error
+												end
+										end,
+										?assertEqual(false, Bar(Bar, false)),
+										ssl:send(Socket, &quot;STARTTLS\r\n&quot;),
+										receive {ssl, Socket, Packet6} -&gt; ssl:setopts(Socket, [{active, once}]) end,
+										?assertMatch(&quot;500 &quot;++_,  Packet6)
+								end
+							}
+					end,
+					fun({CSock, _Pid}) -&gt;
+							{&quot;After STARTTLS, re-negotiating STARTTLS is an error&quot;,
+								fun() -&gt;
+										inet:setopts(CSock, [{active, once}]),
+										receive {tcp, CSock, Packet} -&gt; inet:setopts(CSock, [{active, once}]) end,
+										?assertMatch(&quot;220 localhost&quot;++_Stuff,  Packet),
+										gen_tcp:send(CSock, &quot;EHLO somehost.com\r\n&quot;),
+										receive {tcp, CSock, Packet2} -&gt; inet:setopts(CSock, [{active, once}]) end,
+										?assertMatch(&quot;250-localhost\r\n&quot;,  Packet2),
+										Foo = fun(F, Acc) -&gt;
+												receive
+													{tcp, CSock, &quot;250-STARTTLS&quot;++_} -&gt;
+														inet:setopts(CSock, [{active, once}]),
+														F(F, true);
+													{tcp, CSock, &quot;250-&quot;++Packet3} -&gt;
+														?debugFmt(&quot;XX~sXX&quot;, [Packet3]),
+														inet:setopts(CSock, [{active, once}]),
+														F(F, Acc);
+													{tcp, CSock, &quot;250 STARTTLS&quot;++_} -&gt;
+														inet:setopts(CSock, [{active, once}]),
+														true;
+													{tcp, CSock, &quot;250 &quot;++Packet3} -&gt;
+														inet:setopts(CSock, [{active, once}]),
+														Acc;
+													R -&gt;
+														inet:setopts(CSock, [{active, once}]),
+														error
+												end
+										end,
+										?assertEqual(true, Foo(Foo, false)),
+										gen_tcp:send(CSock, &quot;STARTTLS foo\r\n&quot;),
+										receive {tcp, CSock, Packet4} -&gt; ok end,
+										?assertMatch(&quot;501 &quot;++_,  Packet4)
+								end
+							}
+					end
+				]
+			};
+		false -&gt;
+			[
+				{&quot;SSL certificate exists&quot;,
+					fun() -&gt;
+							?debugFmt(&quot;~n********************************************~nPLEASE run rake generate_self_signed_certificate to run the SSL tests!~n********************************************~n&quot;, []),
+							?assert(false)
+					end
+				}
+			]
+	end.
+
+
 
 -endif.</diff>
      <filename>src/gen_smtp_server_session.erl</filename>
    </modified>
  </modified>
  <removed type="array"/>
  <parents type="array">
    <parent>
      <id>2dc5f095f198bcdc61855851c95cdf9c5229c604</id>
    </parent>
  </parents>
  <author>
    <name>Andrew Thompson</name>
    <email>andrew@thraddash.mgmt</email>
  </author>
  <url>http://github.com/Vagabond/gen_smtp/commit/d28372436d4c55618175842a327b5be44f71d0b3</url>
  <id>d28372436d4c55618175842a327b5be44f71d0b3</id>
  <committed-date>2009-08-27T13:28:36-07:00</committed-date>
  <authored-date>2009-08-27T13:28:36-07:00</authored-date>
  <message>Add a rake task to generate cert, don't run TLS tests without a cert</message>
  <tree>4bb431af56b417e35b28a6820841b3c4532699f2</tree>
  <committer>
    <name>Andrew Thompson</name>
    <email>andrew@thraddash.mgmt</email>
  </committer>
</commit>
