annotate oscgroups/GroupServer.h @ 101:52e44ee1c791 tip master

enabled all scores in autostart script
author Rob Canning <rc@kiben.net>
date Tue, 21 Apr 2015 16:20:57 +0100
parents 0ae87af84e2f
children
rev   line source
rob@76 1 /*
rob@76 2 OSCgroups -- open sound control groupcasting infrastructure
rob@76 3 Copyright (C) 2005 Ross Bencina
rob@76 4
rob@76 5 This program is free software; you can redistribute it and/or
rob@76 6 modify it under the terms of the GNU General Public License
rob@76 7 as published by the Free Software Foundation; either version 2
rob@76 8 of the License, or (at your option) any later version.
rob@76 9
rob@76 10 This program is distributed in the hope that it will be useful,
rob@76 11 but WITHOUT ANY WARRANTY; without even the implied warranty of
rob@76 12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
rob@76 13 GNU General Public License for more details.
rob@76 14
rob@76 15 You should have received a copy of the GNU General Public License
rob@76 16 along with this program; if not, write to the Free Software
rob@76 17 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
rob@76 18 */
rob@76 19
rob@76 20 #ifndef INCLUDED_GROUPSERVER_H
rob@76 21 #define INCLUDED_GROUPSERVER_H
rob@76 22
rob@76 23 // GroupServer.h/cpp implements user and group admission control using passwords
rob@76 24 // Users live as long as they are sending alive messages more frequency
rob@76 25 // than the timeout value. Groups live as long as they have members.
rob@76 26 // Once Users and Groups are destroyed they can be reused with different
rob@76 27 // passwords.
rob@76 28 // This module has no dependence on the messaging protocol, although it does
rob@76 29 // assume IPV4 addresses.
rob@76 30
rob@76 31
rob@76 32 #include <ctime>
rob@76 33 #include <map>
rob@76 34 #include <set>
rob@76 35 #include <string>
rob@76 36
rob@76 37 #include "ip/IpEndpointName.h"
rob@76 38
rob@76 39 class User;
rob@76 40 class Group;
rob@76 41 class GroupServer;
rob@76 42
rob@76 43
rob@76 44 class User{
rob@76 45 friend class GroupServer;
rob@76 46
rob@76 47 std::set<Group*> groups_;
rob@76 48
rob@76 49 public:
rob@76 50 User( const char *userName, const char *userPassword )
rob@76 51 : name( userName )
rob@76 52 , password( userPassword ) {}
rob@76 53
rob@76 54 std::string name;
rob@76 55 std::string password;
rob@76 56
rob@76 57 IpEndpointName privateEndpoint;
rob@76 58 IpEndpointName publicEndpoint;
rob@76 59
rob@76 60 std::time_t lastAliveMessageArrivalTime;
rob@76 61
rob@76 62 unsigned long SecondsSinceLastAliveReceived( std::time_t currentTime )
rob@76 63 { return (unsigned long)std::difftime( currentTime, lastAliveMessageArrivalTime ); }
rob@76 64
rob@76 65 bool IsMemberOf( Group *group ) const
rob@76 66 { return groups_.count( group ) == 1; }
rob@76 67
rob@76 68 typedef std::set<Group*>::const_iterator const_group_iterator;
rob@76 69 const_group_iterator groups_begin() const { return groups_.begin(); }
rob@76 70 const_group_iterator groups_end() const { return groups_.end(); }
rob@76 71 };
rob@76 72
rob@76 73
rob@76 74 class Group{
rob@76 75 friend class GroupServer;
rob@76 76
rob@76 77 std::set<User*> users_;
rob@76 78
rob@76 79 public:
rob@76 80 Group( const char *groupName, const char *groupPassword )
rob@76 81 : name( groupName )
rob@76 82 , password( groupPassword ) {}
rob@76 83
rob@76 84 std::string name;
rob@76 85 std::string password;
rob@76 86
rob@76 87 typedef std::set<User*>::const_iterator const_user_iterator;
rob@76 88 const_user_iterator users_begin() const { return users_.begin(); }
rob@76 89 const_user_iterator users_end() const { return users_.end(); }
rob@76 90 };
rob@76 91
rob@76 92
rob@76 93 class GroupServer{
rob@76 94 const int timeoutSeconds_;
rob@76 95 const int maxUsers_;
rob@76 96 const int maxGroups_;
rob@76 97
rob@76 98 typedef std::map< std::string, User* > user_map;
rob@76 99 typedef user_map::iterator user_iterator;
rob@76 100 user_map users_;
rob@76 101 int userCount_;
rob@76 102
rob@76 103 typedef std::map< std::string, Group* > group_map;
rob@76 104 typedef group_map::iterator group_iterator;
rob@76 105 group_map groups_;
rob@76 106 int groupCount_;
rob@76 107
rob@76 108 User *CreateUser( const char *userName, const char *userPassword );
rob@76 109
rob@76 110 Group *CreateGroup( const char *groupName, const char *groupPassword );
rob@76 111 void AssociateUserWithGroup( User *user, Group* group );
rob@76 112 void RemoveUserReferenceFromGroup( User *user, Group* group );
rob@76 113 void SeparateUserFromGroup( User *user, Group* group );
rob@76 114 void SeparateUserFromAllGroups( User *user );
rob@76 115
rob@76 116 GroupServer(); // no default ctor
rob@76 117 GroupServer( const GroupServer& ); // no copy ctor
rob@76 118 GroupServer& operator=( const GroupServer& ); // no assignment operator
rob@76 119
rob@76 120 public:
rob@76 121 GroupServer( int timeoutSeconds, int maxUsers, int maxGroups );
rob@76 122 ~GroupServer();
rob@76 123
rob@76 124 enum UserStatus {
rob@76 125 USER_STATUS_UNKNOWN,
rob@76 126 USER_STATUS_OK,
rob@76 127 USER_STATUS_WRONG_PASSWORD,
rob@76 128 USER_STATUS_SERVER_LIMIT_REACHED
rob@76 129 };
rob@76 130
rob@76 131 UserStatus UserAlive( const char *userName, const char *userPassword,
rob@76 132 const IpEndpointName& privateEndpoint,
rob@76 133 const IpEndpointName& publicEndpoint,
rob@76 134 const char **groupNamesAndPasswords,
rob@76 135 UserStatus *userGroupsStatus, int groupCount );
rob@76 136
rob@76 137 typedef user_map::const_iterator const_user_iterator;
rob@76 138 const_user_iterator users_begin() const { return users_.begin(); }
rob@76 139 const_user_iterator users_end() const { return users_.end(); }
rob@76 140 User *FindUser( const char *userName );
rob@76 141
rob@76 142 typedef group_map::const_iterator const_group_iterator;
rob@76 143 const_group_iterator groups_begin() const { return groups_.begin(); }
rob@76 144 const_group_iterator groups_end() const { return groups_.end(); }
rob@76 145 Group *FindGroup( const char *groupName );
rob@76 146
rob@76 147 void PurgeStaleUsers();
rob@76 148 };
rob@76 149
rob@76 150
rob@76 151 #endif /* INCLUDED_GROUPSERVER_H */