115 lines
1.8 KiB
C
115 lines
1.8 KiB
C
/******************************************************************************
|
|
*
|
|
* Copyright (c) 2017-2019 by Löwenware Ltd
|
|
* Please, refer LICENSE file for legal information
|
|
*
|
|
******************************************************************************/
|
|
|
|
/**
|
|
* @file validate.c
|
|
* @author Ilja Kartašov <ik@lowenware.com>
|
|
* @brief Validation component source file
|
|
*
|
|
* @see https://lowenware.com/aisl/
|
|
*/
|
|
|
|
#include <ctype.h>
|
|
#include <stddef.h>
|
|
#include <stdlib.h>
|
|
#include "validate.h"
|
|
|
|
|
|
int
|
|
aislx_validate_email(const char *value)
|
|
{
|
|
const char *at = NULL,
|
|
*dot = NULL,
|
|
*i = value;
|
|
char c;
|
|
|
|
while ( (c = *i) != 0 ) {
|
|
switch(c) {
|
|
case '@':
|
|
if (at || i == value)
|
|
break;
|
|
|
|
at = i++;
|
|
dot = NULL;
|
|
continue;
|
|
|
|
case '"':
|
|
case '(':
|
|
case ')':
|
|
case ',':
|
|
case ';':
|
|
case ':':
|
|
case '<':
|
|
case '>':
|
|
case '[':
|
|
case '\\':
|
|
case ']':
|
|
case ' ':
|
|
/* These characters are allowed in double quotes only, but it is not
|
|
* implemented in this validator, so we count them as forbidden
|
|
*/
|
|
break;
|
|
|
|
case '!':
|
|
case '#':
|
|
case '$':
|
|
case '%':
|
|
case '&':
|
|
case '\'':
|
|
case '*':
|
|
case '+':
|
|
case '/':
|
|
case '=':
|
|
case '?':
|
|
case '^':
|
|
case '_':
|
|
case '`':
|
|
case '{':
|
|
case '|':
|
|
case '}':
|
|
case '~':
|
|
/* Allowed special local-part characters */
|
|
if (!at) {
|
|
i++;
|
|
continue;
|
|
}
|
|
break;
|
|
|
|
case '-':
|
|
/* Allowed characters */
|
|
i++;
|
|
continue;
|
|
|
|
case '.':
|
|
if (dot && i == dot+1)
|
|
break;
|
|
|
|
if (at) {
|
|
if (i == at+1 || *(i+1) == 0)
|
|
break;
|
|
} else {
|
|
if (i == value || *(i+1) == '@')
|
|
break;
|
|
}
|
|
|
|
dot = i++;
|
|
continue;
|
|
|
|
default:
|
|
if ( isalnum(c) == 0 )
|
|
continue;
|
|
break;
|
|
}
|
|
return (int)(i-value)+1;
|
|
}
|
|
|
|
if (!at || !dot)
|
|
return -1;
|
|
|
|
return 0;
|
|
}
|