seven
4 years ago
2 changed files with 104 additions and 0 deletions
@ -0,0 +1,43 @@ |
|||||||
|
<?php |
||||||
|
/* |
||||||
|
* Set the location of your certificate file. All other settings are optional. |
||||||
|
* |
||||||
|
* |
||||||
|
* This is your certificate file. A self-signed certificate is acceptable here. |
||||||
|
* You can generate one using: |
||||||
|
* |
||||||
|
* openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365 |
||||||
|
* |
||||||
|
* Then combine the key and certificate and copy them to the certs directory: |
||||||
|
* |
||||||
|
* cp cert.pem certs/yourdomain.com.pem |
||||||
|
* cat key.pem >> certs/yourdomain.com.pem |
||||||
|
|
||||||
|
* Enter the passphrase (if you used one) below. |
||||||
|
* |
||||||
|
*/ |
||||||
|
|
||||||
|
$config['certificate_file'] = ''; |
||||||
|
$config['certificate_passphrase'] = ''; |
||||||
|
|
||||||
|
// IP address to listen to (leave commented out to listen on all interfaces) |
||||||
|
//$config['ip'] = "127.0.0.1"; |
||||||
|
|
||||||
|
// Port to listen on (1965 is the default) |
||||||
|
//$config['port'] = "1965"; |
||||||
|
|
||||||
|
// This is the location files are served from |
||||||
|
// The path is constructed based on the hostname in the client request |
||||||
|
// i.e. gemini://domain1.com/file1 is retrieved from hosts/domain1.com/file1 |
||||||
|
//$config['data_dir'] = "hosts/"; |
||||||
|
//$config['default_host_dir'] = "default/"; |
||||||
|
|
||||||
|
// Default index file. If a path isn't specified then the server will |
||||||
|
// default to an index file (like index.html on a web server). |
||||||
|
//$config['default_index_file'] = "index.gemini"; |
||||||
|
|
||||||
|
// Logging, setting this to false will disable logging (default is on/true); |
||||||
|
//$config['logging'] = true; |
||||||
|
//$config['log_file'] = "logs/gemini-php.log"; |
||||||
|
|
||||||
|
?> |
@ -0,0 +1,61 @@ |
|||||||
|
<?php |
||||||
|
/* |
||||||
|
* Gemini server written in PHP by seven@0xm.net |
||||||
|
* Version 0.1, Oct 2020 |
||||||
|
*/ |
||||||
|
|
||||||
|
if(!require("config.php")) |
||||||
|
die("config.php is missing. Copy config.php.sample to config.php and customise your settings"); |
||||||
|
require("gemini.class.php"); |
||||||
|
$g = new Gemini($config); |
||||||
|
|
||||||
|
$context = stream_context_create(); |
||||||
|
|
||||||
|
stream_context_set_option($context, 'ssl', 'local_cert', $g->certificate_file); |
||||||
|
stream_context_set_option($context, 'ssl', 'passphrase', $g->certificate_passphrase); |
||||||
|
stream_context_set_option($context, 'ssl', 'allow_self_signed', true); |
||||||
|
stream_context_set_option($context, 'ssl', 'verify_peer', false); |
||||||
|
|
||||||
|
$socket = stream_socket_server("tcp://{$g->ip}:{$g->port}", $errno, $errstr, STREAM_SERVER_BIND|STREAM_SERVER_LISTEN, $context); |
||||||
|
|
||||||
|
stream_socket_enable_crypto($socket, false); |
||||||
|
|
||||||
|
while(true) { |
||||||
|
$forkedSocket = stream_socket_accept($socket, "-1", $remoteIP); |
||||||
|
|
||||||
|
stream_set_blocking($forkedSocket, true); |
||||||
|
stream_socket_enable_crypto($forkedSocket, true, STREAM_CRYPTO_METHOD_TLS_SERVER); |
||||||
|
$line = fread($forkedSocket, 1024); |
||||||
|
stream_set_blocking($forkedSocket, false); |
||||||
|
|
||||||
|
$parsed_url = $g->parse_request($line); |
||||||
|
|
||||||
|
$filepath = $g->get_filepath($parsed_url); |
||||||
|
|
||||||
|
$status_code = $g->get_status_code($filepath); |
||||||
|
|
||||||
|
$meta = ""; |
||||||
|
$filesize = 0; |
||||||
|
|
||||||
|
if($status_code == "20") { |
||||||
|
$meta = $g->get_mime_type($filepath); |
||||||
|
$content = file_get_contents($filepath); |
||||||
|
$filesize = filesize($filepath); |
||||||
|
} else { |
||||||
|
$meta = "Not found"; |
||||||
|
} |
||||||
|
|
||||||
|
$status_line = $status_code." ".$meta; |
||||||
|
if($g->logging) |
||||||
|
$g->log_to_file($remoteIP,$status_code, $meta, $filepath, $filesize); |
||||||
|
$status_line .= "\r\n"; |
||||||
|
fwrite($forkedSocket, $status_line); |
||||||
|
|
||||||
|
if($status_code == "20") { |
||||||
|
fwrite($forkedSocket,$content); |
||||||
|
} |
||||||
|
|
||||||
|
fclose($forkedSocket); |
||||||
|
} |
||||||
|
|
||||||
|
?> |
Loading…
Reference in new issue