pianod2
multisource multiuser scriptable networked music player
users.h
Go to the documentation of this file.
1 
9 #pragma once
10 
11 #include <config.h>
12 
13 #include <string>
14 #include <map>
15 #include <vector>
16 #include <functional>
17 
18 #include <football/fb_public.h>
19 #include <football/football.h>
20 #include <parsnip/parsnip.h>
22 
23 #include "user.h"
24 #include "interpreter.h"
25 
26 class PianodConnection;
27 class PianodService;
28 
29 Response send_privileges (const User *user);
30 
32 class UserManager : public PianodInterpreter, private std::map<std::string, User *> {
33 private:
34  std::string shadow_user_name;
35 public:
36  enum class WhichSources {
37  User,
38  Listed,
39  Restorable
40  };
41 
43  virtual const Parsnip::Parser::Definitions &getParserDefinitions () override;
45 private:
46  virtual bool authorizedCommand (Parsnip::Parser::CommandId, PianodConnection &conn) override;
48 public:
49 
50  virtual ~UserManager ();
51 
52  using UserSelectionPredicate = std::function<bool (const User *user)>;
53  using StoredSourcePair = std::pair<User *, UserData::DataStore *>;
54  using StoredSourceList = std::vector<StoredSourcePair>;
55  static inline time_t writeTime (void) { return User::write_time; };
56  static inline bool needWrite (void) {
57  return User::write_time != 0 && User::write_time > time(nullptr);
58  };
59  const std::string &shadowUserName () const;
60  void shadowUserName (const std::string &who);
61 
62  User *addUser (User &user);
63  User *tryget (const std::string &who);
64  User *get (const std::string &who);
65  User *authenticate (const std::string &who, const std::string &password);
66  void clearPrivilege (Privilege priv);
67  bool validUserList (Football::Connection *event, char *const *username);
68 
69  std::vector<PianodConnection *> getUserConnections (PianodService &service,
70  const User *user) const;
71  UserList getUsers (UserSelectionPredicate predicate = [] (const User *) { return true; }) const;
73  bool use_attribute = false) const;
74  UserList allUsers (void) const { return getUsers (); };
76  const User *visibleBy = nullptr) const;
77  RESPONSE_CODE findStoredSource (const std::string &type,
78  const std::string &name,
79  User *forWho,
80  UserData::JSONData **found,
81  User **owner);
82  void createDefaultUser ();
83  void deleteUser (User *user);
84  bool persist ();
85  void restore ();
86  float periodic (void);
87 };
88 
89 extern /* Global */ UserManager *user_manager;
90 
C++ Connection wrapper.
Definition: football.h:68
Generic data type.
Definition: parsnip.h:81
std::vector< Definition > Definitions
Definition: parsnip_command.h:117
int CommandId
Definition: parsnip_command.h:109
Connection to a pianod client, along with context and state of that connection.
Definition: connection.h:54
Interpreter class based on Parsnip template, customized base for pianod interpreters with the additio...
Definition: interpreter.h:101
Definition: interpreter.h:57
std::map< std::string, CommandId > CommandIds
Definition: interpreter.h:59
Pianod service, a customized FootballService for Pianod connections.
Definition: connection.h:115
A response collector/aggregator.
Definition: response.h:197
Type combining RESPONSE_CODE with a value or explanation:
Definition: response.h:49
Store key-value pairs of string keys & mixed types using Parsnip::Data.
Definition: datastore.h:76
Data about each user.
Definition: user.h:53
static time_t write_time
Definition: user.h:56
Container and manager class for users.
Definition: users.h:32
static const PianodSchema::CommandIds & json_request_names(PianodSchema &schema)
Retrieve names for our JSON requests, and make schema revisions.
Definition: usercommand.cpp:205
const std::string & shadowUserName() const
Get the name of the user used as a template for shadow users.
Definition: users.cpp:66
StoredSourceList getStoredSources(WhichSources selection, const User *visibleBy=nullptr) const
Return a list of persisted datasource parameters.
Definition: users.cpp:366
std::vector< PianodConnection * > getUserConnections(PianodService &service, const User *user) const
Retrieve a list of a user's connections.
Definition: users.cpp:301
UserList getUsersPresent(PianodService &service, bool use_attribute=false) const
Retrieve a list of a users connected.
Definition: users.cpp:329
static const Parsnip::Parser::Definitions & parser_definitions()
Definition: usercommand.cpp:165
std::string shadow_user_name
Definition: users.h:34
void restore()
Resubstantiate a user from the XML userdata file.
Definition: users.cpp:92
UserList allUsers(void) const
Definition: users.h:74
virtual ResponseCollector handleCommand(Parsnip::Parser::CommandId, const Parsnip::Data &options, PianodConnection &conn) override
Command handler.
Definition: usercommand.cpp:266
static time_t writeTime(void)
Definition: users.h:55
bool validUserList(Football::Connection *event, char *const *username)
virtual const Parsnip::Parser::Definitions & getParserDefinitions() override
Retrieve the parser definitions handled by the interpreter.
Definition: usercommand.cpp:198
void createDefaultUser()
Add the default 'admin' user to the users list.
Definition: users.cpp:79
bool persist()
Persist user data to a file.
Definition: users.cpp:137
RESPONSE_CODE findStoredSource(const std::string &type, const std::string &name, User *forWho, UserData::JSONData **found, User **owner)
Find stored source parameters for use.
Definition: users.cpp:408
float periodic(void)
Execute periodic tasks:
Definition: users.cpp:172
void clearPrivilege(Privilege priv)
Disable a privilege for all users.
Definition: users.cpp:291
virtual bool authorizedCommand(Parsnip::Parser::CommandId, PianodConnection &conn) override
Check whether a command is authorized.
Definition: usercommand.cpp:235
User * authenticate(const std::string &who, const std::string &password)
Verify a user's credentials.
Definition: users.cpp:254
void deleteUser(User *user)
Remove a user from the registered list of users.
Definition: users.cpp:201
User * addUser(User &user)
Add a user to the list of known users.
Definition: users.cpp:186
WhichSources
Definition: users.h:36
@ Listed
Sources that are publicly known.
@ Restorable
Sources for automatic restore.
@ User
Sources owned by a specific user.
User * get(const std::string &who)
Retrieve a user's record.
Definition: users.cpp:240
std::vector< StoredSourcePair > StoredSourceList
Definition: users.h:54
User * tryget(const std::string &who)
Retrieve a user's record.
Definition: users.cpp:231
virtual ~UserManager()
Definition: users.cpp:433
static bool needWrite(void)
Definition: users.h:56
std::function< bool(const User *user)> UserSelectionPredicate
Definition: users.h:52
std::pair< User *, UserData::DataStore * > StoredSourcePair
Definition: users.h:53
UserList getUsers(UserSelectionPredicate predicate=[](const User *) { return true;}) const
Retrieve a list of users matching some predicate.
Definition: users.cpp:313
Football public declarations.
Football public C++ declarations.
std::vector< const class User * > UserList
Definition: fundamentals.h:348
enum server_status_t RESPONSE_CODE
pianod command processing.
Parsnip serialization.
Parsnip command-line parsing.
User data, privileges, details and preferences implementation.
Privilege
User privilege flags, corresponding to an array position.
Definition: user.h:32
UserManager * user_manager
Definition: users.cpp:437
Response send_privileges(const User *user)
Assemble a user's privileges into a response.
Definition: usercommand.cpp:35