Remoto - VFS: VFS_sessionManager Class Reference
Remoto - VFS

VFS_sessionManager manages connected clients and their session data. More...

#include <VFS_sessionManager.h>

Inheritance diagram for VFS_sessionManager:
VFS_node

Public Member Functions

Q_INVOKABLE VFS_sessionManager (QString cwd, QString userdata, qint64 ttl, QString tokendata="", QString developerGroup="", double pruneProbability=0.1)
 Create a session node, whose job is to return session data for a user. More...
 
virtual ~VFS_sessionManager ()
 
virtual VFS_nodefind (VFS_request *r)
 Find a node using a VFS_request. More...
 
virtual QString getCWD ()
 Return the manager's _cwd value. More...
 
virtual QString reportDetails ()
 Return information about any current sessions. More...
 
- Public Member Functions inherited from VFS_node
Q_INVOKABLE VFS_node ()
 The VFS_node constructor will add its instance to the VFS_node::__allNodes global node registry, observing thread safety rules. More...
 
virtual ~VFS_node ()
 VFS_node destructor. More...
 
virtual VFS_nodeappend (QString name, VFS_node *node, bool containerCheck=true, QString user="server")
 Append a VFS_node as a child of this node. More...
 
QString className ()
 Return the class name of a node. More...
 
virtual VFS_requestcreateRequest (VFS_request::requestType type, QString path, QString user="unknown", QJsonDocument data=QJsonDocument(), QJsonObject metadata=QJsonObject(), bool dontDelete=false)
 Create a new VFS_request with this object as _origin. More...
 
VFS_nodefind (QString path)
 Find a node by string path. More...
 
VFS_nodefindChildWithName (QString name)
 Check if a child with a given name exists. More...
 
virtual bool isContainer ()
 A VFS_node may have children. More...
 
virtual VFS_nodemount ()
 Mount this node. More...
 
QString uniqueChildName (QString name)
 Generate a unique child name. More...
 
virtual VFS_nodeunmount ()
 Unmount this node. More...
 
virtual bool validChildName (QString name)
 Check if a node name is valid. More...
 

Protected Slots

virtual void receiveResponse (VFS_request *t)
 VFS_sessionManager::receiveResponse. More...
 

Protected Member Functions

virtual QByteArray icon ()
 Return the user icon from VFS_icons. More...
 
virtual void read (VFS_request *r)
 Read from the sessionManager. More...
 
virtual void write (VFS_request *r)
 Write to the session manager to create a session. More...
 
- Protected Member Functions inherited from VFS_node
virtual void aclDefaults (VFS_request *r)
 Return default values and features associated wth this node. More...
 
void addACLDefault (QJsonObject &acl, bool value, QString description="")
 Add a default value to the acl object. More...
 
void addACLFeature (QJsonObject &acl, QString feature, bool value, QString description="")
 Add a feature to the acl object. More...
 
void addACLFeatureGroup (QJsonObject &acl, QString feature, QString group, bool value)
 Add a feature group to the acl object. More...
 
void addACLFeatureUser (QJsonObject &acl, QString feature, QString user, bool value)
 Add a feature user to the acl object. More...
 
void addACLGroup (QJsonObject &acl, QString group, bool value)
 Add a group to the acl object. More...
 
void addACLUser (QJsonObject &acl, QString user, bool value)
 Add a user to the acl object. More...
 
virtual void issueRequest (VFS_node *target, VFS_request *t)
 Issue a VFS_request to its target. More...
 
virtual void issueRequest (VFS_request *t)
 A convenience function. More...
 
virtual void issueResponse (VFS_request *t)
 Once a request has been completed, issue a response. More...
 
virtual void ls (VFS_request *r)
 List the contents of this node. More...
 
virtual void metadata (VFS_request *r)
 Fetch the metadata of this node. More...
 
virtual void releaseLock (VFS_request *r)
 Release a lock on this node. More...
 
virtual void report (VFS_request *r)
 Report debugging information about the current state of this node. More...
 
virtual void requestLock (VFS_request *r)
 Request a lock on this node. More...
 
virtual void rm (VFS_request *r)
 Remove a child entry from a node, or the node itself. More...
 
virtual void submit (VFS_request *r)
 Submit a diff to a node. More...
 
virtual void subscribe (VFS_request *r)
 Add an entry to this node's _subscription list. More...
 
virtual void unsubscribe (VFS_request *r)
 Remove an entry from this node's _subscription list. More...
 
virtual void unsubscribePath (QString path)
 Unsubscribe all references to a subpath. More...
 

Protected Attributes

QString _cwd
 The VFS path of this node. More...
 
QString _developerGroup
 Name of the group used for development mode. Members of this group will have additional preferences and utilities. More...
 
VFS_node_sessions
 A VFS_node to hold current sessions. More...
 
QString _tokendata
 A VFS path to store session tokens. More...
 
qint64 _ttl
 Number of seconds for sessions to live once created (time to live) More...
 
QString _userdata
 A VFS path to store user data. More...
 
- Protected Attributes inherited from VFS_node
VFS_children _children
 This node's children. More...
 
QMutex _lock
 A recursive mutex that is local to this node. More...
 
VFS_subscriptionType _subscribers
 This node's subscribers. These subscribers will receive diff notifications. More...
 

Private Member Functions

QString generateAuthtoken ()
 Generate a new unique authtoken for this session. More...
 
void pruneTokens ()
 Run a session token prune on a separate thread. More...
 

Private Attributes

double _pruneProbability
 The probability that a prune will happen. More...
 
VFS_sessionTokenPruner _pruner
 Our pruner. More...
 

Additional Inherited Members

- Public Slots inherited from VFS_node
virtual void applyDiff (VFS_request *r)
 Apply a diff received via subscription. More...
 
virtual void executeRequest (VFS_request *t)
 Based on the VFS_request::requestType, execute the function associated with an operation. More...
 
void notifySubscribers (VFS_node *origin, VFS_request *t)
 Propagate a diff to subscribers. More...
 
virtual void receiveResponse (VFS_request *t)
 Once a VFS_request has been completed, a response will be issued back to its _origin. More...
 
void remove (bool andDelete)
 Remove a child node. More...
 
virtual void remove (VFS_node *node=nullptr, QString *name=nullptr, QString user="server")
 Remove a child node from this node. More...
 
virtual void subtreeRequest (VFS_request *t)
 find() the target of a VFS_request, and execute the request More...
 
virtual void unsubscribeAll (VFS_node *n)
 Remove all references to a subscriber from this node. More...
 
- Signals inherited from VFS_node
void diff (VFS_node *origin, VFS_request *t)
 Emit a diff, which will trigger notifySubscribers() for a mounted node. More...
 
void finished (bool andDelete=false)
 Emitted if a thread fails to create its node, or a node is rm()'d, or any other reason a node has completed its lifecycle. It is deleted if andDelete==true. More...
 
void mounted ()
 Emitted when a node is mount()ed. More...
 
void unmounted (VFS_node *self)
 Emitted when a node is unmount()ed. More...
 
- Static Public Member Functions inherited from VFS_node
static bool __isNode (VFS_node *)
 Check to see if a node is in the global registry. More...
 
static QString code (QString nodename, QString libname, QString &error)
 Fetch code or any other resource from a node. More...
 

Detailed Description

VFS_sessionManager manages connected clients and their session data.

The VFS_sessionManager node will keep an entry for each logged in user. It will manage session timeouts, ACLs, and session data based on client type and authentication data.

A developer group can be specified in the constructor. Sessions with users belonging to this group will have additional preferences and options available to help the debugging process.

If tokens are used, a random value is compared against a pruneProbability to determine if the server should pruneTokens(). If the lottery is won, pruneTokens() is called on a separate thread. A pruneProbability of 1.0 will always win, where a prune probability of 0 will never run.

Tokens are stored on a VFS path.

The token format:

{
"username": "username", //must match the session being attempted
"expire": 12345678 //minutes since the epoch (presumably in the future)
}
Warning
Be sure to store tokens in a secure place where they cannot be fabricated by an external user. For instance, if using a VFS_HD, ensure that permissions allow the VFS to create these files, but not an unprivileged user. If a VFS_mongo node is being used, ensure the database requires a login and that permissions are restricted on the token collection. The most secure method is a VFS_RAM node, with the only downside being loss of all sessions if the server restarts. In any case, a proper ACL should be applied to the tokendata path.

Definition at line 53 of file VFS_sessionManager.h.

Constructor & Destructor Documentation

◆ VFS_sessionManager()

VFS_sessionManager::VFS_sessionManager ( QString  cwd,
QString  userdata,
qint64  ttl,
QString  tokendata = "",
QString  developerGroup = "",
double  pruneProbability = 0.1 
)
explicit

Create a session node, whose job is to return session data for a user.

Parameters
cwdThe VFS path to this node.
userdataA VFS path to the root of the user data.
tokendataA VFS path to store token data. If this path is empty, tokens will not be checked or used.
ttlThe number of seconds for created sessions to live, or 0 for sessions without an expiration.
developerGroupThe group that session users must belong to unlock development features.
pruneProbabilityThe probability that a prune operation will happen, on [0,1]. The default value is 0.1 == 10%.
Note
If the tokendata field is missing or empty, tokens will not be issued or checked during authentication.

This will generally be the user's preferences, interface layouts, current layout, etc. This is the mechanism used for ACL concepts in the VFS.

Todo:
DOCME

Definition at line 61 of file VFS_sessionManager.cpp.

◆ ~VFS_sessionManager()

VFS_sessionManager::~VFS_sessionManager ( )
virtual

Definition at line 79 of file VFS_sessionManager.cpp.

Member Function Documentation

◆ find()

VFS_node * VFS_sessionManager::find ( VFS_request r)
virtual

Find a node using a VFS_request.

Parameters
rThe VFS_request object
Returns
The found node, or null if not found.

This is overridden from VFS_node::find() to include an exception for the preferences.rfm and preferencesBase.rfm base files.

Reimplemented from VFS_node.

Definition at line 104 of file VFS_sessionManager.cpp.

◆ generateAuthtoken()

QString VFS_sessionManager::generateAuthtoken ( )
private

Generate a new unique authtoken for this session.

Returns
The new unique authtoken

Definition at line 397 of file VFS_sessionManager.cpp.

◆ getCWD()

QString VFS_sessionManager::getCWD ( )
virtual

Return the manager's _cwd value.

Returns
The private _cwd value

Definition at line 373 of file VFS_sessionManager.cpp.

◆ icon()

QByteArray VFS_sessionManager::icon ( )
protectedvirtual

Return the user icon from VFS_icons.

Returns
The users icon

Reimplemented from VFS_node.

Definition at line 89 of file VFS_sessionManager.cpp.

◆ pruneTokens()

void VFS_sessionManager::pruneTokens ( )
private

Run a session token prune on a separate thread.

This is a potentially long process, because we must check all entries in VFS a folder and determine if any are expired or inconsistent.

Definition at line 410 of file VFS_sessionManager.cpp.

◆ read()

void VFS_sessionManager::read ( VFS_request r)
protectedvirtual

Read from the sessionManager.

Parameters
rThe VFS_request object

This is overridden from VFS_node::read() to include an exception for the preferences.rfm and preferencesBase.rfm base files.

Reimplemented from VFS_node.

Definition at line 125 of file VFS_sessionManager.cpp.

◆ receiveResponse

void VFS_sessionManager::receiveResponse ( VFS_request r)
protectedvirtualslot

VFS_sessionManager::receiveResponse.

Parameters
rThe VFS_request object

Definition at line 242 of file VFS_sessionManager.cpp.

◆ reportDetails()

QString VFS_sessionManager::reportDetails ( )
virtual

Return information about any current sessions.

Returns
Information about each current session

Reimplemented from VFS_node.

Definition at line 386 of file VFS_sessionManager.cpp.

◆ write()

void VFS_sessionManager::write ( VFS_request r)
protectedvirtual

Write to the session manager to create a session.

Parameters
rThe VFS_request object

If the r->_requestType==VFS_request::create, create a new session and append it to the sessionManager. This will also populate r->_data with session data based on the session type.

Reimplemented from VFS_node.

Definition at line 181 of file VFS_sessionManager.cpp.

Member Data Documentation

◆ _cwd

QString VFS_sessionManager::_cwd
protected

The VFS path of this node.

Definition at line 82 of file VFS_sessionManager.h.

◆ _developerGroup

QString VFS_sessionManager::_developerGroup
protected

Name of the group used for development mode. Members of this group will have additional preferences and utilities.

Definition at line 86 of file VFS_sessionManager.h.

◆ _pruneProbability

double VFS_sessionManager::_pruneProbability
private

The probability that a prune will happen.

Definition at line 90 of file VFS_sessionManager.h.

◆ _pruner

VFS_sessionTokenPruner VFS_sessionManager::_pruner
private

Our pruner.

Definition at line 91 of file VFS_sessionManager.h.

◆ _sessions

VFS_node* VFS_sessionManager::_sessions
protected

A VFS_node to hold current sessions.

Definition at line 87 of file VFS_sessionManager.h.

◆ _tokendata

QString VFS_sessionManager::_tokendata
protected

A VFS path to store session tokens.

Definition at line 84 of file VFS_sessionManager.h.

◆ _ttl

qint64 VFS_sessionManager::_ttl
protected

Number of seconds for sessions to live once created (time to live)

Definition at line 85 of file VFS_sessionManager.h.

◆ _userdata

QString VFS_sessionManager::_userdata
protected

A VFS path to store user data.

Definition at line 83 of file VFS_sessionManager.h.


The documentation for this class was generated from the following files: