summaryrefslogtreecommitdiff
path: root/src/acl.cc
blob: 237fe7ad305aa6d7a74a7c2e1e98cdcb8a2f1abe (plain)
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
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim: set et sw=2 ts=2: */
/***************************************************************************
 *            acl.cc
 *
 *  Sun Jul  5 17:02:31 CEST 2020
 *  Copyright 2020 Bent Bisballe Nyeng
 *  deva@aasimon.org
 ****************************************************************************/

/*
 *  This file is part of Munia.
 *
 *  Munia is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 2 of the License, or
 *  (at your option) any later version.
 *
 *  Munia is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with Munia; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA.
 */
#include "acl.h"

#include <fstream>
#include <sstream>
#include <algorithm>

#include "hash.h"

namespace
{
User parseLine(const std::string& line)
{
	User user;

	int pos{0};
	std::istringstream iss(line);
	std::string token;
	while(std::getline(iss, token, ':'))
	{
		switch(pos)
		{
		case 0: // username
			user.username = token;
			break;
		case 1: // password hash
			user.passwordHash = token;
			break;
		default:
			throw "Too many tokens.";
			break;
		}
		++pos;
	}
	return user;
}
}

ACL::ACL(const std::string& filename)
	: filename(filename)
{
}

ACL::~ACL()
{
}

bool ACL::load()
{
	std::fstream file;
	std::map<std::string, User> newUsers;

	file.open(filename, std::ios_base::in);
	if(!file.is_open())
	{
		return false;
	}

	std::string line;
	while(std::getline(file, line))
	{
		auto user = parseLine(line);
		newUsers[user.username] = user;
	}

	file.close();

	std::swap(users, newUsers);

	return true;
}

bool ACL::checkPassword(const std::string& username, const std::string& password)
{
	auto userit = users.find(username);
	if(userit == users.end())
	{
		return false;
	}

	auto& user = userit->second;
	return verifyEncoded(user.passwordHash, password);
}