Ik ben bezig met een webserver, als oefening om beter te leren programmeren.
Omdat het programma als root gestart moet worden (om rechten te hebben tot poort 80) worden alle permissies die bepaalde bestanden hebben genegeerd. Immers, root kan al jouw files lezen.
Om dit probleem op te losse wilde ik gebruik maken van seteuid(euid). Maar als ik dit in mijn code toevoeg kan het programma geen bestanden meer openen, en geeft hij een access-violation.
er zitten nog fouten in de structuur, en het programma is verre van af. (moet uiteindelijk ook http1.1 ondersteunen) maar op dit moment krijg ik allees 401 messages.
Wanneer de seteuid()'s weggehaald worden werkt alles wel, maar dan leest hij ALLE files. en niet alleen diegene met 'read'-permissies voor 'other'.
Ik heb ietwat met newlines gestrooid om de layout niet te verneuken
Omdat het programma als root gestart moet worden (om rechten te hebben tot poort 80) worden alle permissies die bepaalde bestanden hebben genegeerd. Immers, root kan al jouw files lezen.
Om dit probleem op te losse wilde ik gebruik maken van seteuid(euid). Maar als ik dit in mijn code toevoeg kan het programma geen bestanden meer openen, en geeft hij een access-violation.
C:
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
| seteuid(81); fd = open(uri,O_RDONLY); int error = errno; if(fd != -1) { strcpy(output,"HTTP/1.0 200 OK\r\n\r\n"); a = strlen(output); i = 0; lseek(fd,0,SEEK_SET); i = lseek(fd,0,SEEK_END); lseek(fd,0,SEEK_SET); output = (char *)realloc(output,i+a+5); buffer = (char *)realloc(buffer,i+1); bzero(buffer,i+1); read(fd,buffer,i); a = appendData(output,strlen(output), buffer, i); *size = appendData(output,a,"\r\n\r\n",4); } else { seteuid(getuid()); switch(error) { case(ENOENT): strcpy(output,"HTTP/1.0 404 Not Found\r\n\r\n"); a = strlen(output); fd = open("msg_htdocs/404.htm",O_RDWR | O_CREAT, S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH); if(!(errno == EEXIST) && !(errno == EACCES)) { //CREATE A DEFAULT 404-msg write(fd,DEFAULT_404_MESSAGE, strlen(DEFAULT_404_MESSAGE)); lseek(fd,0,SEEK_SET); i = lseek(fd,0,SEEK_END); lseek(fd,0,SEEK_SET); output = (char *)realloc(output,i+a+5); buffer = (char *)realloc(buffer,i+1); bzero(buffer,i+1); read(fd,buffer,i); a = appendData(output,strlen(output), buffer, i); *size = appendData(output,a,"\r\n\r\n",4); } else { if((errno == EACCES)) { output = (char *)realloc(output,i+a+5); a = appendData(output,strlen(output), DEFAULT_404_MESSAGE, strlen(DEFAULT_404_MESSAGE)); *size = appendData(output,a,"\r\n\r\n",4); } } break; case(EACCES): case(EPERM): // 401 Forbidden strcpy(output,"HTTP/1.0 401 Forbidden\r\n\r\n"); a = strlen(output); fd = open("msg_htdocs/401.htm",O_RDWR | O_CREAT, S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH); if(!(errno == EEXIST) && !(errno == EACCES)) { //CREATE A DEFAULT 401-msg write(fd,DEFAULT_401_MESSAGE, strlen(DEFAULT_404_MESSAGE)); lseek(fd,0,SEEK_SET); i = lseek(fd,0,SEEK_END); lseek(fd,0,SEEK_SET); output = (char *)realloc(output,i+a+5); buffer = (char *)realloc(buffer,i+1); bzero(buffer,i+1); read(fd,buffer,i); a = appendData(output,strlen(output), buffer, i); *size = appendData(output,a,"\r\n\r\n",4); } else { if((errno == EACCES)) { output = (char *)realloc(output,i+a+5); a = appendData(output,strlen(output), DEFAULT_401_MESSAGE, strlen(DEFAULT_401_MESSAGE)); *size = appendData(output,a,"\r\n\r\n",4); } } break; } } |
er zitten nog fouten in de structuur, en het programma is verre van af. (moet uiteindelijk ook http1.1 ondersteunen) maar op dit moment krijg ik allees 401 messages.
Wanneer de seteuid()'s weggehaald worden werkt alles wel, maar dan leest hij ALLE files. en niet alleen diegene met 'read'-permissies voor 'other'.
Ik heb ietwat met newlines gestrooid om de layout niet te verneuken