scp_server.h
Go to the documentation of this file.
1 /**
2  * @file scp_server.h
3  * @brief SCP server
4  *
5  * @section License
6  *
7  * SPDX-License-Identifier: GPL-2.0-or-later
8  *
9  * Copyright (C) 2019-2026 Oryx Embedded SARL. All rights reserved.
10  *
11  * This file is part of CycloneSSH Open.
12  *
13  * This program is free software; you can redistribute it and/or
14  * modify it under the terms of the GNU General Public License
15  * as published by the Free Software Foundation; either version 2
16  * of the License, or (at your option) any later version.
17  *
18  * This program is distributed in the hope that it will be useful,
19  * but WITHOUT ANY WARRANTY; without even the implied warranty of
20  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21  * GNU General Public License for more details.
22  *
23  * You should have received a copy of the GNU General Public License
24  * along with this program; if not, write to the Free Software Foundation,
25  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
26  *
27  * @author Oryx Embedded SARL (www.oryx-embedded.com)
28  * @version 2.6.6
29  **/
30 
31 #ifndef _SCP_SERVER_H
32 #define _SCP_SERVER_H
33 
34 //Dependencies
35 #include "ssh/ssh_server.h"
36 #include "scp/scp_common.h"
37 #include "fs_port.h"
38 
39 //SCP server support
40 #ifndef SCP_SERVER_SUPPORT
41  #define SCP_SERVER_SUPPORT DISABLED
42 #elif (SCP_SERVER_SUPPORT != ENABLED && SCP_SERVER_SUPPORT != DISABLED)
43  #error SCP_SERVER_SUPPORT parameter is not valid
44 #endif
45 
46 //Stack size required to run the SCP server
47 #ifndef SCP_SERVER_STACK_SIZE
48  #define SCP_SERVER_STACK_SIZE 650
49 #elif (SCP_SERVER_STACK_SIZE < 1)
50  #error SCP_SERVER_STACK_SIZE parameter is not valid
51 #endif
52 
53 //Priority at which the SCP server should run
54 #ifndef SCP_SERVER_PRIORITY
55  #define SCP_SERVER_PRIORITY OS_TASK_PRIORITY_NORMAL
56 #endif
57 
58 //Maximum number of simultaneous SCP sessions
59 #ifndef SCP_SERVER_MAX_SESSIONS
60  #define SCP_SERVER_MAX_SESSIONS 10
61 #elif (SCP_SERVER_MAX_SESSIONS < 1)
62  #error SCP_SERVER_MAX_SESSIONS parameter is not valid
63 #endif
64 
65 //SCP server tick interval
66 #ifndef SCP_SERVER_TICK_INTERVAL
67  #define SCP_SERVER_TICK_INTERVAL 1000
68 #elif (SCP_SERVER_TICK_INTERVAL < 100)
69  #error SCP_SERVER_TICK_INTERVAL parameter is not valid
70 #endif
71 
72 //Size of buffer used for input/output operations
73 #ifndef SCP_SERVER_BUFFER_SIZE
74  #define SCP_SERVER_BUFFER_SIZE 512
75 #elif (SCP_SERVER_BUFFER_SIZE < 128)
76  #error SCP_SERVER_BUFFER_SIZE parameter is not valid
77 #endif
78 
79 //Maximum length of root directory
80 #ifndef SCP_SERVER_MAX_ROOT_DIR_LEN
81  #define SCP_SERVER_MAX_ROOT_DIR_LEN 63
82 #elif (SCP_SERVER_MAX_ROOT_DIR_LEN < 7)
83  #error SCP_SERVER_MAX_ROOT_DIR_LEN parameter is not valid
84 #endif
85 
86 //Maximum length of home directory
87 #ifndef SCP_SERVER_MAX_HOME_DIR_LEN
88  #define SCP_SERVER_MAX_HOME_DIR_LEN 63
89 #elif (SCP_SERVER_MAX_HOME_DIR_LEN < 7)
90  #error SCP_SERVER_MAX_HOME_DIR_LEN parameter is not valid
91 #endif
92 
93 //Maximum path length
94 #ifndef SCP_SERVER_MAX_PATH_LEN
95  #define SCP_SERVER_MAX_PATH_LEN 255
96 #elif (SCP_SERVER_MAX_PATH_LEN < 7)
97  #error SCP_SERVER_MAX_PATH_LEN parameter is not valid
98 #endif
99 
100 //Maximum recursion depth
101 #ifndef SCP_SERVER_MAX_RECURSION_LEVEL
102  #define SCP_SERVER_MAX_RECURSION_LEVEL 4
103 #elif (SCP_SERVER_MAX_RECURSION_LEVEL < 1)
104  #error SCP_SERVER_MAX_RECURSION_LEVEL parameter is not valid
105 #endif
106 
107 //Application specific context
108 #ifndef SCP_SERVER_CONTEXT_PRIVATE
109  #define SCP_SERVER_CONTEXT_PRIVATE
110 #endif
111 
112 //Application specific context
113 #ifndef SCP_SERVER_SESSION_PRIVATE
114  #define SCP_SERVER_SESSION_PRIVATE
115 #endif
116 
117 //Forward declaration of ScpServerContext structure
118 struct _ScpServerContext;
119 #define ScpServerContext struct _ScpServerContext
120 
121 //Forward declaration of ScpServerSession structure
122 struct _ScpServerSession;
123 #define ScpServerSession struct _ScpServerSession
124 
125 //C++ guard
126 #ifdef __cplusplus
127 extern "C" {
128 #endif
129 
130 
131 /**
132  * @brief Access status
133  **/
134 
135 typedef enum
136 {
140 
141 
142 /**
143  * @brief File permissions
144  **/
145 
146 typedef enum
147 {
150  SCP_FILE_PERM_WRITE = 0x04
152 
153 
154 /**
155  * @brief SCP session state
156  **/
157 
158 typedef enum
159 {
176 
177 
178 /**
179  * @brief User verification callback function
180  **/
181 
183  const char_t *user);
184 
185 
186 /**
187  * @brief Callback used to retrieve file permissions
188  **/
189 
191  const char_t *user, const char_t *path);
192 
193 
194 /**
195  * @brief SCP server settings
196  **/
197 
198 typedef struct
199 {
200  OsTaskParameters task; ///<Task parameters
201  SshServerContext *sshServerContext; ///<SSH server context
202  uint_t numSessions; ///<Maximum number of SCP sessions
203  ScpServerSession *sessions; ///<SCP sessions
204  const char_t *rootDir; ///<Root directory
205  ScpServerCheckUserCallback checkUserCallback; ///<User verification callback function
206  ScpServerGetFilePermCallback getFilePermCallback; ///<Callback used to retrieve file permissions
208 
209 
210 /**
211  * @brief SCP session
212  **/
213 
215 {
216  ScpServerSessionState state; ///<Session state
217  ScpServerContext *context; ///<SCP server context
218  SshChannel *channel; ///<Underlying SSH channel
219  char_t rootDir[SCP_SERVER_MAX_ROOT_DIR_LEN + 1]; ///<Root directory
220  char_t homeDir[SCP_SERVER_MAX_HOME_DIR_LEN + 1]; ///<Home directory
221  char_t path[SCP_SERVER_MAX_PATH_LEN + 1]; ///<Path name
222  bool_t recursive; ///<Recursive copy
223  bool_t targetIsDir; ///<The target is a directory
224  uint_t dirLevel; ///<Current level of recursion
225  FsDir *dir[SCP_SERVER_MAX_RECURSION_LEVEL]; ///<Directory pointers
226  FsFile *file; ///<File pointer
227  uint32_t fileMode; ///<File access rights
228  uint64_t fileSize; ///<Size of the file, in bytes
229  uint64_t fileOffset; ///<Offset within the file
230  char_t buffer[SCP_SERVER_BUFFER_SIZE]; ///<Memory buffer for input/output operations
231  size_t bufferPos; ///<Current position in the buffer
232  size_t bufferLen; ///<Actual length of the buffer, in bytes
233  error_t statusCode; ///<Status code
234  SCP_SERVER_SESSION_PRIVATE ///<Application specific context
235 };
236 
237 
238 /**
239  * @brief SCP server context
240  **/
241 
243 {
244  SshServerContext *sshServerContext; ///<SSH server context
245  uint_t numSessions; ///<Maximum number of SCP sessions
246  ScpServerSession *sessions; ///<SCP sessions
247  char_t rootDir[SCP_SERVER_MAX_ROOT_DIR_LEN + 1]; ///<Root directory
248  ScpServerCheckUserCallback checkUserCallback; ///<User verification callback function
249  ScpServerGetFilePermCallback getFilePermCallback; ///<Callback used to retrieve file permissions
250  bool_t running; ///<Operational state of the FTP server
251  bool_t stop; ///<Stop request
252  OsEvent event; ///<Event object used to poll the channels
253  OsTaskParameters taskParams; ///<Task parameters
254  OsTaskId taskId; ///<Task identifier
255  SshChannelEventDesc eventDesc[SCP_SERVER_MAX_SESSIONS]; ///<The events the application is interested in
256  char_t path[SCP_SERVER_MAX_PATH_LEN + 1]; ///<Path name
257  SCP_SERVER_CONTEXT_PRIVATE ///<Application specific context
258 };
259 
260 
261 //SCP server related functions
263 
265  const ScpServerSettings *settings);
266 
269 
270 error_t scpServerSetRootDir(ScpServerSession *session, const char_t *rootDir);
271 error_t scpServerSetHomeDir(ScpServerSession *session, const char_t *homeDir);
272 
273 void scpServerTask(void *param);
274 
275 void scpServerDeinit(ScpServerContext *context);
276 
277 //C++ guard
278 #ifdef __cplusplus
279 }
280 #endif
281 
282 #endif
ScpServerSession * sessions
SCP sessions.
Definition: scp_server.h:246
int bool_t
Definition: compiler_port.h:63
char_t path[SCP_SERVER_MAX_PATH_LEN+1]
Path name.
Definition: scp_server.h:256
@ SCP_SERVER_SESSION_STATE_WRITE_STATUS
Definition: scp_server.h:165
SshServerContext * sshServerContext
SSH server context.
Definition: scp_server.h:201
uint_t(* ScpServerGetFilePermCallback)(ScpServerSession *session, const char_t *user, const char_t *path)
Callback used to retrieve file permissions.
Definition: scp_server.h:190
SshChannelEventDesc eventDesc[SCP_SERVER_MAX_SESSIONS]
The events the application is interested in.
Definition: scp_server.h:255
#define SCP_SERVER_CONTEXT_PRIVATE
Definition: scp_server.h:109
char_t buffer[SCP_SERVER_BUFFER_SIZE]
Memory buffer for input/output operations.
Definition: scp_server.h:230
@ SCP_ACCESS_DENIED
Definition: scp_server.h:137
Event object.
#define SCP_SERVER_BUFFER_SIZE
Definition: scp_server.h:74
@ SCP_SERVER_SESSION_STATE_WRITE_COMMAND
Definition: scp_server.h:162
#define SCP_SERVER_MAX_RECURSION_LEVEL
Definition: scp_server.h:102
ScpAccessStatus(* ScpServerCheckUserCallback)(ScpServerSession *session, const char_t *user)
User verification callback function.
Definition: scp_server.h:182
uint32_t fileMode
File access rights.
Definition: scp_server.h:227
ScpServerSessionState state
Session state.
Definition: scp_server.h:216
ScpFilePerm
File permissions.
Definition: scp_server.h:147
OsTaskId taskId
Task identifier.
Definition: scp_server.h:254
#define ScpServerSession
Definition: scp_server.h:123
@ SCP_SERVER_SESSION_STATE_WRITE_INIT
Definition: scp_server.h:161
Directory descriptor.
Definition: fs_port_posix.h:60
uint_t numSessions
Maximum number of SCP sessions.
Definition: scp_server.h:202
@ SCP_FILE_PERM_READ
Definition: scp_server.h:149
#define SCP_SERVER_MAX_SESSIONS
Definition: scp_server.h:60
uint64_t fileSize
Size of the file, in bytes.
Definition: scp_server.h:228
bool_t recursive
Recursive copy.
Definition: scp_server.h:222
#define SCP_SERVER_MAX_PATH_LEN
Definition: scp_server.h:95
ScpAccessStatus
Access status.
Definition: scp_server.h:136
bool_t running
Operational state of the FTP server.
Definition: scp_server.h:250
SshServerContext * sshServerContext
SSH server context.
Definition: scp_server.h:244
@ SCP_SERVER_SESSION_STATE_CLOSING
Definition: scp_server.h:174
SCP session.
Definition: scp_server.h:215
@ SCP_SERVER_SESSION_STATE_WRITE_ACK
Definition: scp_server.h:163
error_t
Error codes.
Definition: error.h:43
void scpServerDeinit(ScpServerContext *context)
Release SCP server context.
Definition: scp_server.c:438
FsFile * file
File pointer.
Definition: scp_server.h:226
@ SCP_SERVER_SESSION_STATE_READ_STATUS
Definition: scp_server.h:171
uint_t dirLevel
Current level of recursion.
Definition: scp_server.h:224
ScpServerContext * context
SCP server context.
Definition: scp_server.h:217
@ SCP_SERVER_SESSION_STATE_ERROR
Definition: scp_server.h:173
SSH server context.
Definition: ssh_server.h:121
error_t statusCode
Status code.
Definition: scp_server.h:233
#define SCP_SERVER_SESSION_PRIVATE
Definition: scp_server.h:114
#define ScpServerContext
Definition: scp_server.h:119
void scpServerTask(void *param)
SCP server task.
Definition: scp_server.c:341
char_t rootDir[SCP_SERVER_MAX_ROOT_DIR_LEN+1]
Root directory.
Definition: scp_server.h:247
#define SCP_SERVER_MAX_ROOT_DIR_LEN
Definition: scp_server.h:81
error_t scpServerSetHomeDir(ScpServerSession *session, const char_t *homeDir)
Set user's home directory.
Definition: scp_server.c:312
Task parameters.
uint64_t fileOffset
Offset within the file.
Definition: scp_server.h:229
SshChannel * channel
Underlying SSH channel.
Definition: scp_server.h:218
@ SCP_FILE_PERM_WRITE
Definition: scp_server.h:150
OsTaskParameters task
Task parameters.
Definition: scp_server.h:200
File system abstraction layer.
Definitions common to SCP client and server.
@ SCP_SERVER_SESSION_STATE_WRITE_FIN
Definition: scp_server.h:166
@ SCP_SERVER_SESSION_STATE_READ_COMMAND
Definition: scp_server.h:168
ScpServerGetFilePermCallback getFilePermCallback
Callback used to retrieve file permissions.
Definition: scp_server.h:206
size_t bufferLen
Actual length of the buffer, in bytes.
Definition: scp_server.h:232
error_t scpServerInit(ScpServerContext *context, const ScpServerSettings *settings)
Initialize SCP server context.
Definition: scp_server.c:81
SCP server settings.
Definition: scp_server.h:199
bool_t stop
Stop request.
Definition: scp_server.h:251
char char_t
Definition: compiler_port.h:55
@ SCP_SERVER_SESSION_STATE_CLOSED
Definition: scp_server.h:160
#define SCP_SERVER_MAX_HOME_DIR_LEN
Definition: scp_server.h:88
const char_t * rootDir
Root directory.
Definition: scp_server.h:204
void scpServerGetDefaultSettings(ScpServerSettings *settings)
Initialize settings with default values.
Definition: scp_server.c:50
Structure describing channel events.
Definition: ssh.h:1620
@ SCP_FILE_PERM_LIST
Definition: scp_server.h:148
@ SCP_SERVER_SESSION_STATE_READ_INIT
Definition: scp_server.h:167
SSH server.
bool_t targetIsDir
The target is a directory.
Definition: scp_server.h:223
ScpServerSessionState
SCP session state.
Definition: scp_server.h:159
char_t path[SCP_SERVER_MAX_PATH_LEN+1]
Path name.
Definition: scp_server.h:221
char_t rootDir[SCP_SERVER_MAX_ROOT_DIR_LEN+1]
Root directory.
Definition: scp_server.h:219
SCP server context.
Definition: scp_server.h:243
OsEvent event
Event object used to poll the channels.
Definition: scp_server.h:252
size_t bufferPos
Current position in the buffer.
Definition: scp_server.h:231
uint_t numSessions
Maximum number of SCP sessions.
Definition: scp_server.h:245
@ SCP_SERVER_SESSION_STATE_WRITE_DATA
Definition: scp_server.h:164
thread_t * OsTaskId
Task identifier.
OsTaskParameters taskParams
Task parameters.
Definition: scp_server.h:253
unsigned int uint_t
Definition: compiler_port.h:57
ScpServerSession * sessions
SCP sessions.
Definition: scp_server.h:203
ScpServerCheckUserCallback checkUserCallback
User verification callback function.
Definition: scp_server.h:248
char_t homeDir[SCP_SERVER_MAX_HOME_DIR_LEN+1]
Home directory.
Definition: scp_server.h:220
@ SCP_SERVER_SESSION_STATE_READ_ACK
Definition: scp_server.h:169
FsDir * dir[SCP_SERVER_MAX_RECURSION_LEVEL]
Directory pointers.
Definition: scp_server.h:225
ScpServerCheckUserCallback checkUserCallback
User verification callback function.
Definition: scp_server.h:205
error_t scpServerStop(ScpServerContext *context)
Stop SCP server.
Definition: scp_server.c:223
@ SCP_SERVER_SESSION_STATE_READ_FIN
Definition: scp_server.h:172
error_t scpServerSetRootDir(ScpServerSession *session, const char_t *rootDir)
Set user's root directory.
Definition: scp_server.c:278
@ SCP_SERVER_SESSION_STATE_READ_DATA
Definition: scp_server.h:170
#define SshChannel
Definition: ssh.h:939
error_t scpServerStart(ScpServerContext *context)
Start SCP server.
Definition: scp_server.c:164
void FsFile
File descriptor.
Definition: fs_port_fatfs.h:60
ScpServerGetFilePermCallback getFilePermCallback
Callback used to retrieve file permissions.
Definition: scp_server.h:249
@ SCP_ACCESS_ALLOWED
Definition: scp_server.h:138