blob: 2bb369c0f06187eac1bbdbe8e309953dbb0d9ef7 [file] [log] [blame]
Michal Vasko45f298f2016-01-29 10:26:26 +01001/**
2 * \file session_server_ch.h
3 * \author Michal Vasko <mvasko@cesnet.cz>
4 * \brief libnetconf2 Call Home session server manipulation
5 *
6 * Copyright (c) 2015 CESNET, z.s.p.o.
7 *
Radek Krejci9b81f5b2016-02-24 13:14:49 +01008 * This source code is licensed under BSD 3-Clause License (the "License").
9 * You may not use this file except in compliance with the License.
10 * You may obtain a copy of the License at
Michal Vaskoafd416b2016-02-25 14:51:46 +010011 *
Radek Krejci9b81f5b2016-02-24 13:14:49 +010012 * https://opensource.org/licenses/BSD-3-Clause
Michal Vasko45f298f2016-01-29 10:26:26 +010013 */
14
15#ifndef NC_SESSION_SERVER_CH_H_
16#define NC_SESSION_SERVER_CH_H_
17
18#include <stdint.h>
19#include <libyang/libyang.h>
20
21#include "session.h"
22#include "netconf.h"
23
Michal Vasko2e6defd2016-10-07 15:48:15 +020024#if defined(NC_ENABLED_SSH) || defined(NC_ENABLED_TLS)
Michal Vasko45f298f2016-01-29 10:26:26 +010025
26/**
Michal Vasko2e6defd2016-10-07 15:48:15 +020027 * @brief Add a new Call Home client.
Michal Vasko45f298f2016-01-29 10:26:26 +010028 *
Michal Vasko2e6defd2016-10-07 15:48:15 +020029 * @param[in] name Arbitrary unique client name.
30 * @param[in] ti Transport protocol to use.
31 * @return 0 on success, -1 on error.
Michal Vasko45f298f2016-01-29 10:26:26 +010032 */
Michal Vasko2e6defd2016-10-07 15:48:15 +020033int nc_server_ch_add_client(const char *name, NC_TRANSPORT_IMPL ti);
34
35/**
36 * @brief Drop any connections, stop connecting and remove a client.
37 *
38 * @param[in] name Client name. NULL matches all the clients.
Michal Vasko59050372016-11-22 14:33:55 +010039 * @param[in] ti Client transport protocol. NULL matches any protocol.
40 * Redundant to set if \p name is set, client names are
41 * unique disregarding their protocol.
Michal Vasko2e6defd2016-10-07 15:48:15 +020042 * @return 0 on success, -1 on not finding any match.
43 */
Michal Vasko59050372016-11-22 14:33:55 +010044int nc_server_ch_del_client(const char *name, NC_TRANSPORT_IMPL ti);
Michal Vasko2e6defd2016-10-07 15:48:15 +020045
46/**
47 * @brief Add a new Call Home client endpoint.
48 *
49 * @param[in] client_name Existing client name.
50 * @param[in] endpt_name Arbitrary unique (within the client) endpoint name.
51 * @return 0 on success, -1 on error.
52 */
53int nc_server_ch_client_add_endpt(const char *client_name, const char *endpt_name);
54
55/**
56 * @brief Remove a Call Home client endpoint.
57 *
58 * @param[in] client_name Existing client name.
59 * @param[in] endpt_name Existing endpoint of \p client_name. NULL matches all endpoints.
60 * @return 0 on success, -1 on error.
61 */
62int nc_server_ch_client_del_endpt(const char *client_name, const char *endpt_name);
63
64/**
65 * @brief Change Call Home client endpoint listening address.
66 *
67 * On error the previous listening socket (if any) is left untouched.
68 *
69 * @param[in] client_name Existing Call Home client name.
70 * @param[in] endpt_name Existing endpoint name of \p client_name.
71 * @param[in] address New listening address.
72 * @return 0 on success, -1 on error.
73 */
74int nc_server_ch_client_endpt_set_address(const char *client_name, const char *endpt_name, const char *address);
75
76/**
77 * @brief Change Call Home client endpoint listening port.
78 *
79 * On error the previous listening socket (if any) is left untouched.
80 *
81 * @param[in] client_name Existing Call Home client name.
82 * @param[in] endpt_name Existing endpoint name of \p client_name.
83 * @param[in] port New listening port.
84 * @return 0 on success, -1 on error.
85 */
86int nc_server_ch_client_endpt_set_port(const char *client_name, const char *endpt_name, uint16_t port);
87
88/**
89 * @brief Set Call Home client connection type.
90 *
91 * @param[in] client_name Existing Call Home client name.
92 * @param[in] conn_type Call Home connection type.
93 * @return 0 on success, -1 on error.
94 */
95int nc_server_ch_client_set_conn_type(const char *client_name, NC_CH_CONN_TYPE conn_type);
96
97/**
98 * @brief Set Call Home client persistent connection idle timeout.
99 *
100 * @param[in] client_name Existing Call Home client name.
101 * @param[in] idle_timeout Call Home persistent idle timeout.
102 * @return 0 on success, -1 on error.
103 */
104int nc_server_ch_client_persist_set_idle_timeout(const char *client_name, uint32_t idle_timeout);
105
106/**
107 * @brief Set Call Home client persistent connection keep-alive max wait time.
108 *
109 * @param[in] client_name Existing Call Home client name.
110 * @param[in] max_wait Call Home persistent max wait time for keep-alive reply.
111 * @return 0 on success, -1 on error.
112 */
113int nc_server_ch_client_persist_set_keep_alive_max_wait(const char *client_name, uint16_t max_wait);
114
115/**
116 * @brief Set Call Home client persistent connection keep-alive max attempts.
117 *
118 * @param[in] client_name Existing Call Home client name.
119 * @param[in] max_attempts Call Home persistent keep-alive maximum contact attempts.
120 * @return 0 on success, -1 on error.
121 */
122int nc_server_ch_client_persist_set_keep_alive_max_attempts(const char *client_name, uint8_t max_attempts);
123
124/**
125 * @brief Set Call Home client periodic connection idle timeout.
126 *
127 * @param[in] client_name Existing Call Home client name.
128 * @param[in] idle_timeout Call Home periodic idle timeout.
129 * @return 0 on success, -1 on error.
130 */
131int nc_server_ch_client_period_set_idle_timeout(const char *client_name, uint16_t idle_timeout);
132
133/**
134 * @brief Set Call Home client periodic reconnect timeout.
135 *
136 * @param[in] client_name Existing Call Home client name.
137 * @param[in] reconnect_timeout Call Home periodic reconnect timeout.
138 * @return 0 on success, -1 on error.
139 */
140int nc_server_ch_client_period_set_reconnect_timeout(const char *client_name, uint16_t reconnect_timeout);
141
142/**
143 * @brief Set Call Home client start-with policy.
144 *
145 * @param[in] client_name Existing Call Home client name.
146 * @param[in] start_with Call Home client start-with.
147 * @return 0 on success, -1 on error.
148 */
149int nc_server_ch_client_set_start_with(const char *client_name, NC_CH_START_WITH start_with);
150
151/**
152 * @brief Set Call Home client overall max attempts.
153 *
154 * @param[in] client_name Existing Call Home client name.
Michal Vasko50d2a5c2017-02-14 10:29:49 +0100155 * @param[in] max_attempts Call Home overall max reconnect attempts.
Michal Vasko2e6defd2016-10-07 15:48:15 +0200156 * @return 0 on success, -1 on error.
157 */
158int nc_server_ch_client_set_max_attempts(const char *client_name, uint8_t max_attempts);
159
160/**
161 * @brief Establish a Call Home connection with a listening NETCONF client.
162 *
163 * @param[in] client_name Existing client name.
164 * @param[out] session_clb Function that is called for every established session on the client. \p new_session
165 * pointer is internally discarded afterwards.
166 * @return 0 if the thread was successfully created, -1 on error.
167 */
168int nc_connect_ch_client_dispatch(const char *client_name,
169 void (*session_clb)(const char *client_name, struct nc_session *new_session));
170
171#endif /* NC_ENABLED_SSH || NC_ENABLED_TLS */
172
173#ifdef NC_ENABLED_SSH
Michal Vasko45f298f2016-01-29 10:26:26 +0100174
175/**
Michal Vasko4c1fb492017-01-30 14:31:07 +0100176 * @brief Add Call Home SSH host keys the server will identify itself with. Only the name is set, the key itself
177 * wil be retrieved using a callback.
Michal Vaskoe2713da2016-08-22 16:06:40 +0200178 *
Michal Vasko2e6defd2016-10-07 15:48:15 +0200179 * @param[in] client_name Existing Call Home client name.
Michal Vasko4c1fb492017-01-30 14:31:07 +0100180 * @param[in] name Arbitrary name of the host key.
Michal Vasko7d255882017-02-09 13:35:08 +0100181 * @param[in] idx Optional index where to add the key. -1 adds at the end.
Michal Vaskoe2713da2016-08-22 16:06:40 +0200182 * @return 0 on success, -1 on error.
183 */
Michal Vasko7d255882017-02-09 13:35:08 +0100184int nc_server_ssh_ch_client_add_hostkey(const char *client_name, const char *name, int16_t idx);
Michal Vaskoe2713da2016-08-22 16:06:40 +0200185
186/**
187 * @brief Delete Call Home SSH host keys. Their order is preserved.
Michal Vasko45f298f2016-01-29 10:26:26 +0100188 *
Michal Vasko2e6defd2016-10-07 15:48:15 +0200189 * @param[in] client_name Existing Call Home client name.
Michal Vasko7d255882017-02-09 13:35:08 +0100190 * @param[in] name Name of the host key. NULL matches all the keys, but if \p idx != -1 then this must be NULL.
191 * @param[in] idx Index of the hostkey. -1 matches all indices, but if \p name != NULL then this must be -1.
Michal Vasko45f298f2016-01-29 10:26:26 +0100192 * @return 0 on success, -1 on error.
193 */
Michal Vasko7d255882017-02-09 13:35:08 +0100194int nc_server_ssh_ch_client_del_hostkey(const char *client_name, const char *name, int16_t idx);
Michal Vasko45f298f2016-01-29 10:26:26 +0100195
196/**
Michal Vaskofbfe8b62017-02-14 10:22:30 +0100197 * @brief Move Call Home SSH host key.
198 *
Michal Vasko50d2a5c2017-02-14 10:29:49 +0100199 * @param[in] client_name Exisitng Call Home client name.
Michal Vaskofbfe8b62017-02-14 10:22:30 +0100200 * @param[in] key_mov Name of the host key that will be moved.
201 * @param[in] key_after Name of the key that will preceed \p key_mov. NULL if \p key_mov is to be moved at the beginning.
202 * @return 0 in success, -1 on error.
203 */
204int nc_server_ssh_ch_client_mov_hostkey(const char *client_name, const char *key_mov, const char *key_after);
205
206/**
207 * @brief Modify Call Home SSH host key.
208 *
209 * @param[in] endpt_name Exisitng endpoint name.
210 * @param[in] name Name of an existing host key.
211 * @param[in] new_name New name of the host key \p name.
212 * @return 0 in success, -1 on error.
213 */
214int nc_server_ssh_ch_client_mod_hostkey(const char *endpt_name, const char *name, const char *new_name);
215
216/**
Michal Vasko45f298f2016-01-29 10:26:26 +0100217 * @brief Set Call Home SSH banner the server will send to every client.
218 *
Michal Vasko2e6defd2016-10-07 15:48:15 +0200219 * @param[in] client_name Existing Call Home client name.
Michal Vasko45f298f2016-01-29 10:26:26 +0100220 * @param[in] banner SSH banner.
221 * @return 0 on success, -1 on error.
222 */
Michal Vasko2e6defd2016-10-07 15:48:15 +0200223int nc_server_ssh_ch_client_set_banner(const char *client_name, const char *banner);
Michal Vasko45f298f2016-01-29 10:26:26 +0100224
225/**
226 * @brief Set accepted Call Home SSH authentication methods. All (publickey, password, interactive)
Michal Vaskof0537d82016-01-29 14:42:38 +0100227 * are supported by default.
Michal Vasko45f298f2016-01-29 10:26:26 +0100228 *
Michal Vasko2e6defd2016-10-07 15:48:15 +0200229 * @param[in] client_name Existing Call Home client name.
Michal Vasko45f298f2016-01-29 10:26:26 +0100230 * @param[in] auth_methods Accepted authentication methods bit field of NC_SSH_AUTH_TYPE.
231 * @return 0 on success, -1 on error.
232 */
Michal Vasko2e6defd2016-10-07 15:48:15 +0200233int nc_server_ssh_ch_client_set_auth_methods(const char *client_name, int auth_methods);
Michal Vasko45f298f2016-01-29 10:26:26 +0100234
235/**
236 * @brief Set Call Home SSH authentication attempts of every client. 3 by default.
237 *
Michal Vasko2e6defd2016-10-07 15:48:15 +0200238 * @param[in] client_name Existing Call Home client name.
Michal Vasko45f298f2016-01-29 10:26:26 +0100239 * @param[in] auth_attempts Failed authentication attempts before a client is dropped.
240 * @return 0 on success, -1 on error.
241 */
Michal Vasko2e6defd2016-10-07 15:48:15 +0200242int nc_server_ssh_ch_client_set_auth_attempts(const char *client_name, uint16_t auth_attempts);
Michal Vasko45f298f2016-01-29 10:26:26 +0100243
244/**
245 * @brief Set Call Home SSH authentication timeout. 10 seconds by default.
246 *
Michal Vasko2e6defd2016-10-07 15:48:15 +0200247 * @param[in] client_name Existing Call Home client name.
Michal Vasko45f298f2016-01-29 10:26:26 +0100248 * @param[in] auth_timeout Number of seconds before an unauthenticated client is dropped.
249 * @return 0 on success, -1 on error.
250 */
Michal Vasko2e6defd2016-10-07 15:48:15 +0200251int nc_server_ssh_ch_client_set_auth_timeout(const char *client_name, uint16_t auth_timeout);
Michal Vasko45f298f2016-01-29 10:26:26 +0100252
Radek Krejci53691be2016-02-22 13:58:37 +0100253#endif /* NC_ENABLED_SSH */
Michal Vasko45f298f2016-01-29 10:26:26 +0100254
Radek Krejci53691be2016-02-22 13:58:37 +0100255#ifdef NC_ENABLED_TLS
Michal Vasko45f298f2016-01-29 10:26:26 +0100256
257/**
Michal Vasko4c1fb492017-01-30 14:31:07 +0100258 * @brief Set the server Call Home TLS certificate. Only the name is set, the certificate itself
259 * wil be retrieved using a callback.
Michal Vasko45f298f2016-01-29 10:26:26 +0100260 *
Michal Vasko2e6defd2016-10-07 15:48:15 +0200261 * @param[in] client_name Existing Call Home client name.
Michal Vasko4c1fb492017-01-30 14:31:07 +0100262 * @param[in] name Arbitrary certificate name.
Michal Vasko45f298f2016-01-29 10:26:26 +0100263 * @return 0 on success, -1 on error.
264 */
Michal Vasko4c1fb492017-01-30 14:31:07 +0100265int nc_server_tls_ch_client_set_server_cert(const char *client_name, const char *name);
Michal Vasko45f298f2016-01-29 10:26:26 +0100266
267/**
Michal Vasko4c1fb492017-01-30 14:31:07 +0100268 * @brief Add a Call Home trusted certificate list. Can be both a CA or a client one.
Michal Vasko45f298f2016-01-29 10:26:26 +0100269 *
Michal Vasko2e6defd2016-10-07 15:48:15 +0200270 * @param[in] client_name Existing Call Home client name.
Michal Vasko4c1fb492017-01-30 14:31:07 +0100271 * @param[in] name Arbitary name identifying this certificate list.
Michal Vasko45f298f2016-01-29 10:26:26 +0100272 * @return 0 on success, -1 on error.
273 */
Michal Vasko4c1fb492017-01-30 14:31:07 +0100274int nc_server_tls_ch_client_add_trusted_cert_list(const char *client_name, const char *name);
Michal Vasko45f298f2016-01-29 10:26:26 +0100275
276/**
Michal Vasko4c1fb492017-01-30 14:31:07 +0100277 * @brief Remove a set Call Home trusted certificate list. CRLs and CTN entries are not affected.
Michal Vasko45f298f2016-01-29 10:26:26 +0100278 *
Michal Vasko2e6defd2016-10-07 15:48:15 +0200279 * @param[in] client_name Existing Call Home client name.
Michal Vasko4c1fb492017-01-30 14:31:07 +0100280 * @param[in] name Name of the certificate list to delete. NULL deletes all the lists.
281 * @return 0 on success, -1 on not found.
Michal Vasko45f298f2016-01-29 10:26:26 +0100282 */
Michal Vasko4c1fb492017-01-30 14:31:07 +0100283int nc_server_tls_ch_client_del_trusted_cert_list(const char *client_name, const char *name);
Michal Vasko45f298f2016-01-29 10:26:26 +0100284
285/**
286 * @brief Set trusted Call Home Certificate Authority certificate locations. There
Michal Vaskof0537d82016-01-29 14:42:38 +0100287 * can only be one file and one directory, they are replaced if already set.
Michal Vasko45f298f2016-01-29 10:26:26 +0100288 *
Michal Vasko2e6defd2016-10-07 15:48:15 +0200289 * @param[in] client_name Existing Call Home client name.
Michal Vaskob34b3e82016-02-26 15:04:58 +0100290 * @param[in] ca_file Path to a trusted CA cert store file in PEM format.
291 * Can be NULL.
292 * @param[in] ca_dir Path to a trusted CA cert store hashed directory
293 * (c_rehash utility can be used to create hashes)
294 * with PEM files. Can be NULL.
Michal Vasko45f298f2016-01-29 10:26:26 +0100295 * @return 0 on success, -1 on error.
296 */
Michal Vasko2e6defd2016-10-07 15:48:15 +0200297int nc_server_tls_ch_client_set_trusted_ca_paths(const char *client_name, const char *ca_file, const char *ca_dir);
Michal Vasko45f298f2016-01-29 10:26:26 +0100298
299/**
Michal Vasko45f298f2016-01-29 10:26:26 +0100300 * @brief Set Call Home Certificate Revocation List locations. There can only be
Michal Vaskof0537d82016-01-29 14:42:38 +0100301 * one file and one directory, they are replaced if already set.
Michal Vasko45f298f2016-01-29 10:26:26 +0100302 *
Michal Vasko2e6defd2016-10-07 15:48:15 +0200303 * @param[in] client_name Existing Call Home client name.
Michal Vaskob34b3e82016-02-26 15:04:58 +0100304 * @param[in] crl_file Path to a CRL store file in PEM format. Can be NULL.
305 * @param[in] crl_dir Path to a CRL store hashed directory (c_rehash utility
306 * can be used to create hashes) with PEM files. Can be NULL.
Michal Vasko45f298f2016-01-29 10:26:26 +0100307 * @return 0 on success, -1 on error.
308 */
Michal Vasko2e6defd2016-10-07 15:48:15 +0200309int nc_server_tls_ch_client_set_crl_paths(const char *client_name, const char *crl_file, const char *crl_dir);
Michal Vasko45f298f2016-01-29 10:26:26 +0100310
311/**
312 * @brief Destroy and clean Call Home CRLs. Call Home certificates, private keys,
Michal Vaskof0537d82016-01-29 14:42:38 +0100313 * and CTN entries are not affected.
Michal Vasko2e6defd2016-10-07 15:48:15 +0200314 *
315 * @param[in] client_name Existing Call Home client name.
Michal Vasko45f298f2016-01-29 10:26:26 +0100316 */
Michal Vasko2e6defd2016-10-07 15:48:15 +0200317void nc_server_tls_ch_client_clear_crls(const char *client_name);
Michal Vasko45f298f2016-01-29 10:26:26 +0100318
319/**
Michal Vasko3cf4aaa2017-02-01 15:03:36 +0100320 * @brief Add a cert-to-name entry.
Michal Vasko45f298f2016-01-29 10:26:26 +0100321 *
Michal Vasko3cf4aaa2017-02-01 15:03:36 +0100322 * It is possible to add an entry step-by-step, specifying first only \p ip and in later calls
323 * \p fingerprint, \p map_type, and optionally \p name spearately.
324 *
Michal Vasko50d2a5c2017-02-14 10:29:49 +0100325 * @param[in] client_name Existing Call Home client name.
Michal Vasko3cf4aaa2017-02-01 15:03:36 +0100326 * @param[in] id Priority of the entry. It must be unique. If already exists, the entry with this id
327 * is modified.
328 * @param[in] fingerprint Matching certificate fingerprint. If NULL, kept temporarily unset.
329 * @param[in] map_type Type of username-certificate mapping. If 0, kept temporarily unset.
330 * @param[in] name Specific username used only if \p map_type == NC_TLS_CTN_SPECIFED.
Michal Vasko45f298f2016-01-29 10:26:26 +0100331 * @return 0 on success, -1 on error.
332 */
Michal Vasko2e6defd2016-10-07 15:48:15 +0200333int nc_server_tls_ch_client_add_ctn(const char *client_name, uint32_t id, const char *fingerprint,
334 NC_TLS_CTN_MAPTYPE map_type, const char *name);
Michal Vasko45f298f2016-01-29 10:26:26 +0100335
336/**
Michal Vasko58c22a22016-11-23 13:49:53 +0100337 * @brief Remove a Call Home cert-to-name entry.
Michal Vasko45f298f2016-01-29 10:26:26 +0100338 *
Michal Vasko2e6defd2016-10-07 15:48:15 +0200339 * @param[in] client_name Existing Call Home client name.
Michal Vasko45f298f2016-01-29 10:26:26 +0100340 * @param[in] id Priority of the entry. -1 matches all the priorities.
341 * @param[in] fingerprint Fingerprint fo the entry. NULL matches all the fingerprints.
342 * @param[in] map_type Mapping type of the entry. 0 matches all the mapping types.
343 * @param[in] name Specific username for the entry. NULL matches all the usernames.
344 * @return 0 on success, -1 on not finding any match.
345 */
Michal Vasko2e6defd2016-10-07 15:48:15 +0200346int nc_server_tls_ch_client_del_ctn(const char *client_name, int64_t id, const char *fingerprint,
347 NC_TLS_CTN_MAPTYPE map_type, const char *name);
Michal Vasko45f298f2016-01-29 10:26:26 +0100348
Michal Vaskodf5e6af2016-11-23 13:50:56 +0100349/**
350 * @brief Get a Call Home cert-to-name entry.
351 *
352 * If a parameter is NULL, it is ignored. If its dereferenced value is NULL,
353 * it is filled and returned. If the value is set, it is used as a filter.
354 * Returns first matching entry.
355 *
356 * @param[in] client_name Existing Call Home client name.
357 * @param[in,out] id Priority of the entry.
358 * @param[in,out] fingerprint Fingerprint fo the entry.
359 * @param[in,out] map_type Mapping type of the entry.
360 * @param[in,out] name Specific username for the entry.
361 * @return 0 on success, -1 on not finding any match.
362 */
Michal Vaskof585ac72016-11-25 15:16:38 +0100363int nc_server_tls_ch_client_get_ctn(const char *client_name, uint32_t *id, char **fingerprint,
364 NC_TLS_CTN_MAPTYPE *map_type, char **name);
Michal Vaskodf5e6af2016-11-23 13:50:56 +0100365
Radek Krejci53691be2016-02-22 13:58:37 +0100366#endif /* NC_ENABLED_TLS */
Michal Vasko45f298f2016-01-29 10:26:26 +0100367
368#endif /* NC_SESSION_SERVER_CH_H_ */