File: logic.cpp

package info (click to toggle)
bibledit-cloud 5.1.036-1
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 250,636 kB
  • sloc: xml: 915,934; ansic: 261,349; cpp: 92,628; javascript: 32,542; sh: 4,915; makefile: 586; php: 69
file content (142 lines) | stat: -rw-r--r-- 5,369 bytes parent folder | download | duplicates (3)
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
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
/*
Copyright (©) 2003-2025 Teus Benschop.

This program 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 3 of the License, or
(at your option) any later version.

This program 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 this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/


#include <user/logic.h>
#include <filter/string.h>
#include <filter/url.h>
#include <filter/md5.h>
#include <filter/date.h>
#include <filter/roles.h>
#include <database/users.h>
#include <database/config/user.h>
#include <database/config/general.h>
#include <database/logs.h>
#include <database/privileges.h>
#include <database/login.h>
#include <database/noteassignment.h>
#include <email/send.h>
#include <ldap/logic.h>
#include <webserver/request.h>


void user_logic_optional_ldap_authentication (Webserver_Request& webserver_request, std::string user, std::string pass)
{
  if (ldap_logic_is_on ()) {
    // Query the LDAP server and log the response.
    bool ldap_okay;
    std::string email;
    int role;
    ldap_logic_fetch (user, pass, ldap_okay, email, role, true);
    if (ldap_okay) {
      if (webserver_request.database_users ()->usernameExists (user)) {
        // Verify and/or update the fields for the user in the local database.
        if (webserver_request.database_users ()->get_md5 (user) != md5 (pass)) {
          webserver_request.database_users ()->set_password (user, pass);
        }
        if (webserver_request.database_users ()->get_level (user) != role) {
          webserver_request.database_users ()->set_level (user, role);
        }
        if (webserver_request.database_users ()->get_email (user) != email) {
          webserver_request.database_users ()->updateUserEmail (user, email);
        }
        if (!webserver_request.database_users ()->get_enabled (user)) {
          webserver_request.database_users ()->set_enabled (user, true);
        }
      } else {
        // Enter the user into the database.
        webserver_request.database_users ()->add_user (user, pass, role, email);
      }
    }
  }
}


int user_logic_login_failure_time = 0;


bool user_logic_login_failure_check_okay ()
{
  // No time set yet: OK.
  if (!user_logic_login_failure_time) return true;
  // A login failure was recorded during this very second: Check fails.
  if (user_logic_login_failure_time == filter::date::seconds_since_epoch ()) return false;
  // Default: OK.
  return true;
}


void user_logic_login_failure_register ()
{
  // Register a login failure for the current second.
  user_logic_login_failure_time = filter::date::seconds_since_epoch ();
}


void user_logic_login_failure_clear ()
{
  // Clear login failure tracker.
  user_logic_login_failure_time = 0;
}


void user_logic_store_account_creation (std::string username)
{
  std::vector <std::string> account_creation_times = database::config::general::get_account_creation_times ();
  std::string account_creation_time = std::to_string (filter::date::seconds_since_epoch()) + "|" + username;
  account_creation_times.push_back(account_creation_time);
  database::config::general::set_account_creation_times(account_creation_times);
}


void user_logic_delete_account (std::string user, std::string role, std::string email, std::string & feedback)
{
  feedback = "Deleted user " + user + " with role " + role + " and email " + email;
  Database_Logs::log (feedback, roles::admin);
  Database_Users database_users;
  database_users.removeUser (user);
  database_privileges_client_remove (user);
  // Also remove any privileges for this user.
  // In particular for the Bible privileges this is necessary,
  // beause if old users remain in the privileges storage,
  // then a situation where no user has any privileges to any Bible,
  // and thus all relevant users have all privileges,
  // can never be achieved again.
  DatabasePrivileges::remove_user (user);
  // Remove any login tokens the user might have had: Just to clean things up.
  Database_Login::removeTokens (user);
  // Remove any settings for the user.
  // The advantage of this is that when a user is removed, all settings are gone,
  // so when the same user would be created again, all settings will go back to their defaults.
  Webserver_Request webserver_request;
  Database_Config_User database_config_user (webserver_request);
  database_config_user.remove (user);
  // Remove note assignments for clients for this user.
  Database_NoteAssignment database_noteassignment;
  database_noteassignment.remove (user);
  // Remove the account creation time.
  std::vector <std::string> updated;
  std::vector <std::string> existing = database::config::general::get_account_creation_times ();
  for (auto line : existing) {
    std::vector <std::string> bits = filter::strings::explode(line, '|');
    if (bits.size() != 2) continue;
    if (bits[1] == user) continue;
    updated.push_back(line);
  }
  database::config::general::set_account_creation_times(updated);
}