MeterLogger
Functions
auth.c File Reference
#include <esp8266.h>
#include "httpd.h"
#include "auth.h"
#include "base64.h"
Include dependency graph for auth.c:

Go to the source code of this file.

Functions

int ICACHE_FLASH_ATTR authBasic (HttpdConnData *connData)
 

Function Documentation

◆ authBasic()

int ICACHE_FLASH_ATTR authBasic ( HttpdConnData connData)

Definition at line 20 of file auth.c.

References AUTH_MAX_PASS_LEN, AUTH_MAX_USER_LEN, base64_decode(), HttpdConnData::cgiArg, HttpdConnData::conn, HTTP_AUTH_REALM, HTTPD_CGI_AUTHENTICATED, HTTPD_CGI_DONE, httpdEndHeaders(), httpdGetHeader(), httpdHeader(), httpdSend(), httpdStartResponse(), NULL, os_strcmp, os_strncmp, strlen, and strncmp.

20  {
21  const char *forbidden="401 Forbidden.";
22  int no=0;
23  int r;
24  char hdr[(AUTH_MAX_USER_LEN+AUTH_MAX_PASS_LEN+2)*10];
25  char userpass[AUTH_MAX_USER_LEN+AUTH_MAX_PASS_LEN+2];
26  char user[AUTH_MAX_USER_LEN];
27  char pass[AUTH_MAX_PASS_LEN];
28  if (connData->conn==NULL) {
29  //Connection aborted. Clean up.
30  return HTTPD_CGI_DONE;
31  }
32 
33  r=httpdGetHeader(connData, "Authorization", hdr, sizeof(hdr));
34  if (r && strncmp(hdr, "Basic", 5)==0) {
35  r=base64_decode(strlen(hdr)-6, hdr+6, sizeof(userpass), (unsigned char *)userpass);
36  if (r<0) r=0; //just clean out string on decode error
37  userpass[r]=0; //zero-terminate user:pass string
38 // os_printf("Auth: %s\n", userpass);
39  while (((AuthGetUserPw)(connData->cgiArg))(connData, no,
40  user, AUTH_MAX_USER_LEN, pass, AUTH_MAX_PASS_LEN)) {
41  //Check user/pass against auth header
42  if (strlen(userpass)==strlen(user)+strlen(pass)+1 &&
43  os_strncmp(userpass, user, strlen(user))==0 &&
44  userpass[strlen(user)]==':' &&
45  os_strcmp(userpass+strlen(user)+1, pass)==0) {
46  //Authenticated. Yay!
48  }
49  no++; //Not authenticated with this user/pass. Check next user/pass combo.
50  }
51  }
52 
53  //Not authenticated. Go bug user with login screen.
54  httpdStartResponse(connData, 401);
55  httpdHeader(connData, "Content-Type", "text/plain");
56  httpdHeader(connData, "WWW-Authenticate", "Basic realm=\""HTTP_AUTH_REALM"\"");
57  httpdEndHeaders(connData);
58  httpdSend(connData, forbidden, -1);
59  //Okay, all done.
60  return HTTPD_CGI_DONE;
61 }
#define os_strncmp
Definition: osapi.h:44
#define NULL
Definition: def.h:47
#define AUTH_MAX_PASS_LEN
Definition: auth.h:14
const void * cgiArg
Definition: httpd.h:23
#define HTTPD_CGI_AUTHENTICATED
Definition: httpd.h:11
#define HTTPD_CGI_DONE
Definition: httpd.h:9
int(* AuthGetUserPw)(HttpdConnData *connData, int no, char *user, int userLen, char *pass, int passLen)
Definition: auth.h:18
#define os_strcmp
Definition: osapi.h:41
#define HTTP_AUTH_REALM
Definition: auth.h:7
#define strncmp(a, b, c)
Definition: platform.h:18
#define AUTH_MAX_USER_LEN
Definition: auth.h:13
ICACHE_FLASH_ATTR int httpdGetHeader(HttpdConnData *conn, char *header, char *ret, int retLen)
Definition: httpd.c:189
ICACHE_FLASH_ATTR void httpdStartResponse(HttpdConnData *conn, int code)
Definition: httpd.c:219
int ICACHE_FLASH_ATTR base64_decode(size_t in_len, const char *in, size_t out_len, unsigned char *out)
Definition: base64.c:42
ICACHE_FLASH_ATTR void httpdEndHeaders(HttpdConnData *conn)
Definition: httpd.c:240
ICACHE_FLASH_ATTR void httpdHeader(HttpdConnData *conn, const char *field, const char *val)
Definition: httpd.c:229
struct espconn * conn
Definition: httpd.h:20
ICACHE_FLASH_ATTR int httpdSend(HttpdConnData *conn, const char *data, int len)
Definition: httpd.c:270
#define strlen(a)
Definition: platform.h:25
Here is the call graph for this function: