Changeset 12 in Main for trunk/Server


Ignore:
Timestamp:
Sep 13, 2024, 10:36:03 PM (2 months ago)
Author:
Nishi
Message:

vhost works

Location:
trunk/Server
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/Server/config.c

    r7 r12  
    77#include <stdlib.h>
    88#include <string.h>
     9#include <unistd.h>
    910
    1011#include <cm_string.h>
     
    1314struct tw_config config;
    1415
     16struct tw_config_entry* tw_vhost_match(const char* name, int port) {
     17        int i;
     18        for(i = 0; i < config.vhost_count; i++) {
     19                if(strcmp(config.vhosts[i].name, name) == 0 && config.vhosts[i].port == port) {
     20                        return &config.vhosts[i];
     21                }
     22        }
     23        return &config.root;
     24}
     25
    1526void tw_config_init(void) {
    1627        int i;
     
    1829                config.ports[i] = -1;
    1930        }
     31        for(i = 0; i < MAX_VHOSTS; i++) {
     32                config.vhosts[i].sslkey = NULL;
     33                config.vhosts[i].sslcert = NULL;
     34        }
     35        config.root.sslkey = NULL;
     36        config.root.sslcert = NULL;
     37        config.vhost_count = 0;
     38        gethostname(config.hostname, 1024);
    2039}
    2140
     
    3049                line[0] = 0;
    3150                int stop = 0;
     51                struct tw_config_entry* current = &config.root;
    3252                char* vhost = NULL;
    3353                while(stop == 0) {
     
    4868                                        } else if(cm_strcaseequ(r[0], "BeginVirtualHost")) {
    4969                                                if(vhost != NULL) {
    50                                                         cm_log("Config", "Already in virtual host section");
     70                                                        cm_log("Config", "Already in virtual host section at line %d", ln);
    5171                                                        stop = 1;
    5272                                                } else {
    5373                                                        if(r[1] == NULL) {
    54                                                                 cm_log("Config", "Missing virtual host");
     74                                                                cm_log("Config", "Missing virtual host at line %d", ln);
    5575                                                                stop = 1;
    5676                                                        } else {
    5777                                                                vhost = cm_strdup(r[1]);
     78                                                                current = &config.vhosts[config.vhost_count++];
     79                                                                int i;
     80                                                                current->name = cm_strdup(vhost);
     81                                                                current->port = 80;
     82                                                                for(i = 0; vhost[i] != 0; i++) {
     83                                                                        if(vhost[i] == ':') {
     84                                                                                current->name[i] = 0;
     85                                                                                current->port = atoi(current->name + i + 1);
     86                                                                                break;
     87                                                                        }
     88                                                                }
    5889                                                        }
    5990                                                }
    6091                                        } else if(cm_strcaseequ(r[0], "EndVirtualHost")) {
    6192                                                if(vhost == NULL) {
    62                                                         cm_log("Config", "Not in virtual host section");
     93                                                        cm_log("Config", "Not in virtual host section at line %d", ln);
    6394                                                        stop = 1;
    6495                                                } else {
    6596                                                        free(vhost);
    6697                                                        vhost = NULL;
     98                                                        current = &config.root;
    6799                                                }
    68100                                        } else if(cm_strcaseequ(r[0], "Listen") || cm_strcaseequ(r[0], "ListenSSL")) {
     
    75107                                                                ;
    76108                                                        config.ports[j] = port;
     109                                                }
     110                                        } else if(cm_strcaseequ(r[0], "SSLKey")) {
     111                                                if(r[1] == NULL) {
     112                                                        cm_log("Config", "Missing path at line %d", ln);
     113                                                        stop = 1;
     114                                                } else {
     115                                                        if(current->sslkey != NULL) free(current->sslkey);
     116                                                        current->sslkey = cm_strdup(r[1]);
     117                                                }
     118                                        } else if(cm_strcaseequ(r[0], "SSLCertificate")) {
     119                                                if(r[1] == NULL) {
     120                                                        cm_log("Config", "Missing path at line %d", ln);
     121                                                        stop = 1;
     122                                                } else {
     123                                                        if(current->sslcert != NULL) free(current->sslcert);
     124                                                        current->sslcert = cm_strdup(r[1]);
    77125                                                }
    78126                                        } else {
  • trunk/Server/server.c

    r11 r12  
    33#include "tw_server.h"
    44
     5#include "tw_ssl.h"
    56#include "tw_config.h"
    67
     
    115116struct pass_entry {
    116117        int sock;
     118        int port;
    117119        bool ssl;
    118120};
     
    121123        int sock = ((struct pass_entry*)ptr)->sock;
    122124        bool ssl = ((struct pass_entry*)ptr)->ssl;
     125        int port = ((struct pass_entry*)ptR)->port;
     126        free(ptr);
    123127#else
    124 void tw_server_pass(int sock, bool ssl) {
     128void tw_server_pass(int sock, bool ssl, int port) {
    125129#endif
     130        SSL_CTX* ctx = NULL;
     131        SSL* s = NULL;
     132        if(ssl) {
     133                ctx = tw_create_ssl_ctx(port);
     134                s = SSL_new(ctx);
     135                SSL_set_fd(s, sock);
     136                if(SSL_accept(s) <= 0) goto cleanup;
     137        }
     138cleanup:
    126139        close_socket(sock);
    127140#ifdef __MINGW32__
     
    151164                                        int clen = sizeof(claddr);
    152165                                        int sock = accept(sockets[i], (struct sockaddr*)&claddr, &clen);
     166                                        cm_log("Server", "New connection accepted");
    153167#ifdef __MINGW32__
    154168                                        HANDLE thread;
     
    156170                                        e->sock = sock;
    157171                                        e->ssl = config.ports[i] & (1ULL << 32);
     172                                        e->port = config.ports[i];
    158173                                        thread = (HANDLE)_beginthreadex(NULL, 0, tw_server_pass, e, 0, NULL);
    159174#else
    160175                                        pid_t pid = fork();
    161176                                        if(pid == 0) {
    162                                                 tw_server_pass(sock, config.ports[i] & (1ULL << 32));
     177                                                tw_server_pass(sock, config.ports[i] & (1ULL << 32), config.ports[i]);
    163178                                                _exit(0);
    164179                                        } else {
  • trunk/Server/ssl.c

    r11 r12  
    22
    33#include "tw_ssl.h"
     4
     5#include "tw_config.h"
     6
     7#include <stdio.h>
     8
     9#include <cm_log.h>
     10
     11extern struct tw_config config;
     12
     13int tw_ssl_cert_cb(SSL* ssl, void* arg) {
     14        const char* s = SSL_get_servername(ssl, TLSEXT_NAMETYPE_host_name);
     15        if(s != NULL) {
     16                cm_log("SSL", "Certificate request for %s", s);
     17        } else {
     18                s = config.hostname;
     19                cm_log("SSL", "Could not get the servername, defaulting to the hostname: %s", s);
     20        }
     21        struct tw_config_entry* e = tw_vhost_match(s, (uint64_t)arg);
     22        if(e != NULL && e->sslkey != NULL && e->sslcert != NULL) {
     23                SSL_use_PrivateKey_file(ssl, e->sslkey, SSL_FILETYPE_PEM);
     24                SSL_use_certificate_file(ssl, e->sslcert, SSL_FILETYPE_PEM);
     25                return 1;
     26        } else {
     27                return 0;
     28        }
     29}
     30
     31SSL_CTX* tw_create_ssl_ctx(uint64_t port) {
     32        SSL_CTX* ctx = SSL_CTX_new(TLS_server_method());
     33        SSL_CTX_set_cert_cb(ctx, tw_ssl_cert_cb, (void*)port);
     34        return ctx;
     35}
  • trunk/Server/tw_config.h

    r7 r12  
    66#include <stdint.h>
    77
    8 /* I don't think you would listen to 1024 ports */
    98#define MAX_PORTS 1024
    109
    11 struct tw_config_entry {};
     10#define MAX_VHOSTS 1024
     11
     12struct tw_config_entry {
     13        char* name;
     14        int port;
     15        char* sslkey;
     16        char* sslcert;
     17};
    1218
    1319struct tw_config {
    1420        uint64_t ports[MAX_PORTS + 1]; /* If port & (1 << 32) is non-zero, it is SSL */
     21        char hostname[1025];
    1522        struct tw_config_entry root;
     23        struct tw_config_entry vhosts[MAX_VHOSTS];
     24        int vhost_count;
    1625};
    1726
    1827void tw_config_init(void);
    1928int tw_config_read(const char* path);
     29struct tw_config_entry* tw_vhost_match(const char* name, int port);
    2030
    2131#endif
  • trunk/Server/tw_ssl.h

    r11 r12  
    44#define __TW_SSL_H__
    55
     6#include <openssl/ssl.h>
     7
     8SSL_CTX* tw_create_ssl_ctx(uint64_t port);
     9
    610#endif
Note: See TracChangeset for help on using the changeset viewer.