1
0
mirror of https://github.com/SoftEtherVPN/SoftEtherVPN.git synced 2025-06-28 11:55:08 +03:00
This commit is contained in:
Andrea Lora 2018-05-01 21:41:45 +00:00 committed by GitHub
commit cababf6952
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 78 additions and 4 deletions

View File

@ -112,9 +112,51 @@
// SoftEther protocol related routines // SoftEther protocol related routines
#include "CedarPch.h" #include "CedarPch.h"
char *tokenized;
static UCHAR ssl_packet_start[3] = {0x17, 0x03, 0x00}; static UCHAR ssl_packet_start[3] = {0x17, 0x03, 0x00};
//Service function too chcck for email in buffer
int spc_email_isvalid(const char *address) {
int count = 0;
const char *c, *domain;
static char *rfc822_specials = "()<>@,;:\\\"[]";
/* first we validate the name portion (name@domain) */
for (c = address; *c; c++) {
if (*c == '\"' && (c == address || *(c - 1) == '.' || *(c - 1) ==
'\"')) {
while (*++c) {
if (*c == '\"') break;
if (*c == '\\' && (*++c == ' ')) continue;
if (*c <= ' ' || *c >= 127) return 0;
}
if (!*c++) return 0;
if (*c == '@') break;
if (*c != '.') return 0;
continue;
}
if (*c == '@') break;
if (*c <= ' ' || *c >= 127) return 0;
if (strchr(rfc822_specials, *c)) return 0;
}
if (c == address || *(c - 1) == '.') return 0;
/* next we validate the domain portion (name@domain) */
if (!*(domain = ++c)) return 0;
do {
if (*c == '.') {
if (c == domain || *(c - 1) == '.') return 0;
count++;
}
if (*c <= ' ' || *c >= 127) return 0;
if (strchr(rfc822_specials, *c)) return 0;
} while (*++c);
return (count >= 1);
}
// Download and save intermediate certificates if necessary // Download and save intermediate certificates if necessary
bool DownloadAndSaveIntermediateCertificatesIfNecessary(X *x) bool DownloadAndSaveIntermediateCertificatesIfNecessary(X *x)
{ {
@ -2037,7 +2079,28 @@ bool ServerAccept(CONNECTION *c)
{ {
AcLock(hub); AcLock(hub);
{ {
b = AcIsUser(hub, "*"); char *domain;
tokenized=NULL;
//check if username is an email address
if(spc_email_isvalid(username)) {
domain = strchr (username, '@');
if (domain != NULL) {
domain++;
tokenized = (char*)malloc((strlen(domain)+2) * sizeof(char));
sprintf(tokenized,"#%s",domain);
b = AcIsUser(hub, tokenized);
if(b == false) {
free(tokenized);
tokenized=NULL;
}
}
}
//fall back to the old method
if(b == false) {
b = AcIsUser(hub, "*");
}
} }
AcUnlock(hub); AcUnlock(hub);
@ -2047,7 +2110,10 @@ bool ServerAccept(CONNECTION *c)
auth_ret = SamAuthUserByPlainPassword(c, hub, username, plain_password, true, mschap_v2_server_response_20, &radius_login_opt); auth_ret = SamAuthUserByPlainPassword(c, hub, username, plain_password, true, mschap_v2_server_response_20, &radius_login_opt);
if (auth_ret && pol == NULL) if (auth_ret && pol == NULL)
{ {
pol = SamGetUserPolicy(hub, "*"); if( tokenized != NULL )
pol = SamGetUserPolicy(hub,tokenized);
else
pol = SamGetUserPolicy(hub, "*");
} }
} }
} }
@ -2271,7 +2337,13 @@ bool ServerAccept(CONNECTION *c)
user = AcGetUser(hub, username); user = AcGetUser(hub, username);
if (user == NULL) if (user == NULL)
{ {
user = AcGetUser(hub, "*");
if(tokenized != NULL) {
user = AcGetUser(hub, tokenized);
free(tokenized);
}
else
user = AcGetUser(hub, "*");
if (user == NULL) if (user == NULL)
{ {
// User acquisition failure // User acquisition failure

View File

@ -112,7 +112,7 @@
// Security Accounts Manager // Security Accounts Manager
#include "CedarPch.h" #include "CedarPch.h"
extern char *tokenized;
// Password encryption // Password encryption
void SecurePassword(void *secure_password, void *password, void *random) void SecurePassword(void *secure_password, void *password, void *random)
{ {
@ -201,6 +201,8 @@ bool SamAuthUserByPlainPassword(CONNECTION *c, HUB *hub, char *username, char *p
{ {
USER *u; USER *u;
u = AcGetUser(hub, ast == false ? username : "*"); u = AcGetUser(hub, ast == false ? username : "*");
if(tokenized != NULL)
u = AcGetUser(hub, tokenized);
if (u) if (u)
{ {
Lock(u->lock); Lock(u->lock);