1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 // The purpose of SessionManager is to facilitate creation of chromotocol 6 // sessions. Both host and client use it to establish chromotocol 7 // sessions. JingleChromotocolServer implements this inteface using 8 // libjingle. 9 // 10 // OUTGOING SESSIONS 11 // Connect() must be used to create new session to a remote host. The 12 // returned session is initially in INITIALIZING state. Later state is 13 // changed to CONNECTED if the session is accepted by the host or 14 // CLOSED if the session is rejected. 15 // 16 // INCOMING SESSIONS 17 // The IncomingSessionCallback is called when a client attempts to connect. 18 // The callback function decides whether the session should be accepted or 19 // rejected. 20 // 21 // AUTHENTICATION 22 // Implementations of the Session and SessionManager interfaces 23 // delegate authentication to an Authenticator implementation. For 24 // incoming connections authenticators are created using an 25 // AuthenticatorFactory set via the set_authenticator_factory() 26 // method. For outgoing sessions authenticator must be passed to the 27 // Connect() method. The Session's state changes to AUTHENTICATED once 28 // authentication succeeds. 29 // 30 // SESSION OWNERSHIP AND SHUTDOWN 31 // The SessionManager must not be closed or destroyed before all sessions 32 // created by that SessionManager are destroyed. Caller owns Sessions 33 // created by a SessionManager (except rejected 34 // sessions). The SignalStrategy must outlive the SessionManager. 35 // 36 // PROTOCOL VERSION NEGOTIATION 37 // When client connects to a host it sends a session-initiate stanza with list 38 // of supported configurations for each channel. If the host decides to accept 39 // session, then it selects configuration that is supported by both sides 40 // and then replies with the session-accept stanza that contans selected 41 // configuration. The configuration specified in the session-accept is used 42 // for the session. 43 // 44 // The CandidateSessionConfig class represents list of configurations 45 // supported by an endpoint. The |candidate_config| argument in the Connect() 46 // specifies configuration supported on the client side. When the host receives 47 // session-initiate stanza, the IncomingSessionCallback is called. The 48 // configuration sent in the session-intiate staza is available via 49 // ChromotocolConnnection::candidate_config(). If an incoming session is 50 // being accepted then the IncomingSessionCallback callback function must 51 // select session configuration and then set it with Session::set_config(). 52 53 #ifndef REMOTING_PROTOCOL_SESSION_MANAGER_H_ 54 #define REMOTING_PROTOCOL_SESSION_MANAGER_H_ 55 56 #include <string> 57 58 #include "base/callback.h" 59 #include "base/memory/ref_counted.h" 60 #include "base/threading/non_thread_safe.h" 61 #include "remoting/protocol/session.h" 62 63 namespace remoting { 64 65 class SignalStrategy; 66 67 namespace protocol { 68 69 class Authenticator; 70 class AuthenticatorFactory; 71 72 // Generic interface for Chromoting session manager. 73 // 74 // TODO(sergeyu): Split this into two separate interfaces: one for the 75 // client side and one for the host side. 76 class SessionManager : public base::NonThreadSafe { 77 public: 78 SessionManager() {} 79 virtual ~SessionManager() {} 80 81 enum IncomingSessionResponse { 82 // Accept the session. 83 ACCEPT, 84 85 // Reject the session due to incompatible session configuration. 86 INCOMPATIBLE, 87 88 // Reject the session because the host is currently disabled due 89 // to previous login attempts. 90 OVERLOAD, 91 92 // Reject the session because the client is not allowed to connect 93 // to the host. 94 DECLINE, 95 }; 96 97 class Listener { 98 public: 99 Listener() {} 100 101 // Called when the session manager is ready to create outgoing 102 // sessions. May be called from Init() or after Init() 103 // returns. 104 virtual void OnSessionManagerReady() = 0; 105 106 // Called when a new session is received. If the host decides to 107 // accept the session it should set the |response| to 108 // ACCEPT. Otherwise it should set it to DECLINE, or 109 // INCOMPATIBLE. INCOMPATIBLE indicates that the session has 110 // incompatible configuration, and cannot be accepted. If the 111 // callback accepts the |session| then it must also set 112 // configuration for the |session| using Session::set_config(). 113 // The callback must take ownership of the |session| if it ACCEPTs it. 114 virtual void OnIncomingSession(Session* session, 115 IncomingSessionResponse* response) = 0; 116 117 protected: 118 ~Listener() {} 119 }; 120 121 // Initializes the session client. Caller retains ownership of the 122 // |signal_strategy| and |listener|. 123 virtual void Init(SignalStrategy* signal_strategy, 124 Listener* listener) = 0; 125 126 // Tries to create a session to the host |jid|. Must be called only 127 // after initialization has finished successfully, i.e. after 128 // Listener::OnInitialized() has been called. 129 // 130 // |host_jid| is the full jid of the host to connect to. 131 // |authenticator| is a client authenticator for the session. 132 // |config| contains the session configurations that the client supports. 133 virtual scoped_ptr<Session> Connect( 134 const std::string& host_jid, 135 scoped_ptr<Authenticator> authenticator, 136 scoped_ptr<CandidateSessionConfig> config) = 0; 137 138 // Close session manager. Can be called only after all corresponding 139 // sessions are destroyed. No callbacks are called after this method 140 // returns. 141 virtual void Close() = 0; 142 143 // Set authenticator factory that should be used to authenticate 144 // incoming connection. No connections will be accepted if 145 // authenticator factory isn't set. Must not be called more than 146 // once per SessionManager because it may not be safe to delete 147 // factory before all authenticators it created are deleted. 148 virtual void set_authenticator_factory( 149 scoped_ptr<AuthenticatorFactory> authenticator_factory) = 0; 150 151 private: 152 DISALLOW_COPY_AND_ASSIGN(SessionManager); 153 }; 154 155 } // namespace protocol 156 } // namespace remoting 157 158 #endif // REMOTING_PROTOCOL_SESSION_MANAGER_H_ 159