pianod2
multisource multiuser scriptable networked music player
user.h
Go to the documentation of this file.
1 
9 #pragma once
10 
11 #include <config.h>
12 
13 #include <string>
14 #include <unordered_map>
15 
16 #include <parsnip/parsnip.h>
17 
18 #include "logging.h"
19 #include "fundamentals.h"
20 #include "enumeratedarray.h"
21 #include "datastore.h"
22 
24 enum class Rank {
25  None,
26  Listener,
27  Standard,
29 };
30 
32 enum class Privilege {
33  Service,
34  Queue,
35  Influence,
36  Tuner,
37  Shadow,
38  Present,
39  Count
40 };
41 
43 static inline Privilege operator++(Privilege &p, int) {
44  Privilege prior = p;
45  p = static_cast<Privilege>(int (prior) + 1);
46  return prior;
47 }
48 
49 
50 class PianodService;
51 
53 class User {
54  friend class UserManager;
55  static bool shadow_mode;
56  static time_t write_time;
57 private:
58  typedef enum user_write_priority_t {
59  CRITICAL = 1,
60  IMPORTANT = 10,
61  NOMINAL = 60,
62  TRIVIAL = 300
64  std::string name;
65  std::string password;
68  // Note: effective privileges may be different, an effect of rank.
69 
70  using UserDataPair = std::pair <std::string, UserData::DataStore *>;
71  using UserDataMap = std::unordered_map <std::string, UserData::DataStore *>;
73 
74  static void scheduleWrite (WritePriority priority);
75 public:
76  User (const std::string &username, const std::string &pass, bool encrypt = false);
77  User (const User &) = delete;
78  User &operator=(const User &) = delete;
79  User (User &&) = default;
80  User &operator=(User &&) = default;
81  ~User ();
82  inline const std::string &username (void) const { return name; };
83  void setPassword (const std::string &pass);
84  bool authenticate (const char *trypass) const;
85  bool authenticate (const std::string &trypass) const { return authenticate (trypass.c_str()); };
86  bool changePassword (const std::string &old, const std::string &pass);
87 #ifdef SHADOW_CAPABLE
88  bool assumeShadowPassword (const std::string &old, const std::string &pass);
89 #endif
90  // Rank stuff
91  void assignRank (Rank newrank);
92  bool assignRank (const std::string &newrank);
93  bool haveRank (const Rank rank) const;
94  inline Rank getRank (void) const { return rank; };
95  const char *getRankName (void) const;
96  // Privilege stuff
97  void setPrivilege (const Privilege priv, bool setting);
98  bool havePrivilege (const Privilege priv) const;
99  // Other statusy things
100  bool online (const PianodService &service) const;
102  inline void updateData (void) { scheduleWrite (TRIVIAL); };
103  UserData::DataStore *getData (const std::string &datatype, const std::string &dataid = "") const;
104  void removeData (const std::string &datatype, const std::string &dataid = "");
105 protected:
106  inline bool operator < (const User &other) {
107  return name.compare (other.name);
108  }
109  inline bool operator < (const std::string &other) {
110  return name.compare (other);
111  }
112  Parsnip::Data persist () const;
113 
114  // Static methods & Variables
116 public:
117  static void shadow (bool mode);
118  static bool shadow () { return (shadow_mode); };
119  static const Privilege getPrivilege (const std::string &privilege);
120  static const Rank getRank (const std::string &rank);
121  static const char *getRankName (Rank rank);
122  static const char *getPrivilegeName (Privilege privilege);
123  static inline Rank getVisitorRank () {
124  return visitor_rank;
125  }
126  static void setVisitorRank (const std::string &rank);
127  static User *getStartscriptUser (void);
128 private:
129  static bool reconstituteUserData (User &user, const Parsnip::Data &data);
130  static User reconstitute_user (const Parsnip::Data &data);
131 };
132 
133 class PianodConnection;
134 
135 namespace Football {
136  class ServiceBase;
137 }
138 
140 
C++ Service wrapper Manages the service's connections.
Definition: football.h:115
Generic data type.
Definition: parsnip.h:81
Connection to a pianod client, along with context and state of that connection.
Definition: connection.h:54
Pianod service, a customized FootballService for Pianod connections.
Definition: connection.h:115
Storage mechanism for user data.
Definition: datastore.h:56
Data about each user.
Definition: user.h:53
bool havePrivilege(const Privilege priv) const
Definition: user.cpp:293
UserData::DataStore * getData(const std::string &datatype, const std::string &dataid="") const
Get data associated with a user.
Definition: user.cpp:346
User(const std::string &username, const std::string &pass, bool encrypt=false)
Create a new user with the username and password.
Definition: user.cpp:131
std::string name
User's login name.
Definition: user.h:64
bool operator<(const User &other)
Definition: user.h:106
void updateData(void)
Definition: user.h:102
std::unordered_map< std::string, UserData::DataStore * > UserDataMap
Definition: user.h:71
UserDataMap data
Data sets attached to the user.
Definition: user.h:72
void removeData(const std::string &datatype, const std::string &dataid="")
Remove data associated with a user.
Definition: user.cpp:354
EnumeratedArray< Privilege, bool > privileges
Assigned privileges.
Definition: user.h:67
std::pair< std::string, UserData::DataStore * > UserDataPair
Definition: user.h:70
const std::string & username(void) const
Definition: user.h:82
static User * getStartscriptUser(void)
Retrieve a user for processing the startup script.
Definition: user.cpp:491
void assignRank(Rank newrank)
Set a user's rank.
Definition: user.cpp:265
Rank rank
Assigned rank.
Definition: user.h:66
void setPassword(const std::string &pass)
Change the password in a user's record.
Definition: user.cpp:149
void setPrivilege(const Privilege priv, bool setting)
Definition: user.cpp:288
const char * getRankName(void) const
Get the rank name for the current user.
Definition: user.cpp:475
bool authenticate(const char *trypass) const
Validate a user's credentials (username/password).
Definition: user.cpp:210
User & operator=(User &&)=default
static time_t write_time
Definition: user.h:56
User(const User &)=delete
bool attachData(UserData::DataStore *)
Attach some data to a user.
Definition: user.cpp:321
bool changePassword(const std::string &old, const std::string &pass)
Change a user's password, authenticating the old one.
Definition: user.cpp:231
static bool shadow_mode
Definition: user.h:55
Parsnip::Data persist() const
Prepare data for persistence.
Definition: user.cpp:365
bool online(const PianodService &service) const
Determine if a user is online.
Definition: user.cpp:300
~User()
Definition: user.cpp:140
static bool shadow()
Definition: user.h:118
std::string password
Encrypted password.
Definition: user.h:65
user_write_priority_t
Definition: user.h:58
@ IMPORTANT
User creation.
Definition: user.h:60
@ TRIVIAL
Ratings.
Definition: user.h:62
@ CRITICAL
User removal, privilege change, etc.
Definition: user.h:59
@ NOMINAL
Sources, preferences, data attachments, etc.
Definition: user.h:61
static User reconstitute_user(const Parsnip::Data &data)
Create (restore) a user from a Parsnip object.
Definition: user.cpp:404
Rank getRank(void) const
Definition: user.h:94
static const Privilege getPrivilege(const std::string &privilege)
Translate a privilege to its enumerator.
Definition: user.cpp:453
static void scheduleWrite(WritePriority priority)
Definition: user.cpp:57
static void setVisitorRank(const std::string &rank)
Definition: user.cpp:485
static bool reconstituteUserData(User &user, const Parsnip::Data &data)
static Rank visitor_rank
Rank for users that have not authenticated.
Definition: user.h:115
User(User &&)=default
static Rank getVisitorRank()
Definition: user.h:123
bool authenticate(const std::string &trypass) const
Definition: user.h:85
enum User::user_write_priority_t WritePriority
bool haveRank(const Rank rank) const
Determine if a user has a rank or better.
Definition: user.cpp:284
static const char * getPrivilegeName(Privilege privilege)
Translate a privilege enumerator to its text.
Definition: user.cpp:481
User & operator=(const User &)=delete
Container and manager class for users.
Definition: users.h:32
User data storage mechanism.
Enumerated array type.
Essential data structures and support.
Debug/event logging interface.
Football C++ connections, services and parsers.
Definition: fb_arena.cpp:23
Parsnip serialization.
Privilege
User privilege flags, corresponding to an array position.
Definition: user.h:32
@ Tuner
User may set other users' presence, for autotuning.
@ Shadow
Attribute: User was created automatically, shadowing a user account.
@ Queue
User may queue or cancel songs. (Automatic for standard rank.)
@ Service
User may add or remove sources. (Automatic for admin rank.)
@ Influence
User's playlist preferences influence autotuning selections.
@ Present
Attribute: Consider user present, even if not logged in.
void register_user_commands(Football::ServiceBase *service)
static Privilege operator++(Privilege &p, int)
Postfix increment operator to allow Privilege iteration.
Definition: user.h:43
Rank
User types in ascending ranks/level of authority.
Definition: user.h:24
@ Listener
User can query and view song-related data, but not change selections.
@ None
User is unauthorized to do anything except log in.
@ Administrator
User has full authorization, except for accessing others' private data.
@ Standard
User can query, choose playlist, request music, change volume.