sysdb_ssh.c revision 3ac7c4fe618ede980a4df8d90341ef1fd0f1f62f
8c294c1cd4d721818a59684cf7f2b36123f79163Stephen Gallagher Jan Cholasta <jcholast@redhat.com>
8c294c1cd4d721818a59684cf7f2b36123f79163Stephen Gallagher Copyright (C) 2012 Red Hat
9542512d7be40f2000298c86d3d2b728f4f0f65aStephen Gallagher This program is free software; you can redistribute it and/or modify
9542512d7be40f2000298c86d3d2b728f4f0f65aStephen Gallagher it under the terms of the GNU General Public License as published by
9542512d7be40f2000298c86d3d2b728f4f0f65aStephen Gallagher the Free Software Foundation; either version 3 of the License, or
c6e39e15178675d0779e0ae855245774a09b4eb5Nikolai Kondrashov (at your option) any later version.
c6e39e15178675d0779e0ae855245774a09b4eb5Nikolai Kondrashov This program is distributed in the hope that it will be useful,
c6e39e15178675d0779e0ae855245774a09b4eb5Nikolai Kondrashov but WITHOUT ANY WARRANTY; without even the implied warranty of
c6e39e15178675d0779e0ae855245774a09b4eb5Nikolai Kondrashov MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
fd5a4eacd56700ffb08a73121aeacdc806cb0132Sumit Bose GNU General Public License for more details.
8b1f525acd20f36c836e827de3c251088961c5d9Stephen Gallagher You should have received a copy of the GNU General Public License
8b1f525acd20f36c836e827de3c251088961c5d9Stephen Gallagher along with this program. If not, see <http://www.gnu.org/licenses/>.
df4cc3a83c5d6700b6a09ff96cb4a6b1949b1aa9Stephen Gallagherstatic struct ldb_dn *
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher return sysdb_custom_dn(mem_ctx, domain, name, SSH_HOSTS_SUBDIR);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallaghersysdb_update_ssh_host(struct sss_domain_info *domain,
8a5e793a0576250da80371e53aa3e7eba15cdb63Sumit Bose ret = sysdb_store_custom(domain, name, SSH_HOSTS_SUBDIR,
90fd1bbd6035cdab46faa3a695a2fb2be6508b17Sumit Bose "Error storing host %s [%d]: %s\n", name, ret, strerror(ret));
2a552e43581c74f51205c7141ec9f6e9542509f8Stephen Gallaghersysdb_store_ssh_host(struct sss_domain_info *domain,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher const char *search_attrs[] = { SYSDB_NAME_ALIAS, NULL };
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher unsigned int i;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher DEBUG(SSSDBG_TRACE_FUNC, "Storing host %s\n", name);
4dd615c01357b8715711aad6820ba9595d3ad377Stephen Gallagher ret = sysdb_transaction_start(domain->sysdb);
e124844907ed6973915e4d56f5442ecd07535a12Jakub Hrozek DEBUG(SSSDBG_CRIT_FAILURE, "Failed to start transaction\n");
bc13c352ba9c2877f1e9bc62e55ad60fc000a55dJakub Hrozek ret = sysdb_get_ssh_host(tmp_ctx, domain, name, search_attrs, &host);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher ret = sysdb_attrs_add_string(attrs, SYSDB_OBJECTCLASS, SYSDB_SSH_HOST_OC);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher "Could not set object class [%d]: %s\n", ret, strerror(ret));
a3d176d116ceccd6a7547c128fab5df5cdd2c2b6Michal Zidek ret = sysdb_attrs_add_string(attrs, SYSDB_NAME, name);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher "Could not set name attribute [%d]: %s\n", ret, strerror(ret));
9a3e40dc49c1e38bf58e45be5adff37615f3910bJan Cholasta /* copy aliases from the existing entry */
558998ce664055a75595371118f818084d8f2b23Jan Cholasta el = ldb_msg_find_element(host, SYSDB_NAME_ALIAS);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (strcmp((char *)el->values[i].data, alias) == 0) {
6ea6ec5cb7d9985e2730fb9d4657624d10aed4d8Nick Guay "Could not add name alias %s [%d]: %s\n",
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher /* add alias only if it is not already present */
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher ret = sysdb_attrs_add_string(attrs, SYSDB_NAME_ALIAS, alias);
1746e8b8399da2a7a8da4aace186f66055ccfec1Jakub Hrozek "Could not add name alias %s [%d]: %s\n",
e7311aec8d691e5427317442387af1bc8fff3742Jan Cholasta /* make sure sshPublicKey is present when modifying an existing host */
e7311aec8d691e5427317442387af1bc8fff3742Jan Cholasta ret = sysdb_attrs_get_el(attrs, SYSDB_SSH_PUBKEY, &el);
cb4d5b588e704114b7090678752d33512baa718eJakub Hrozek "Could not get sysdb sshPublicKey [%d]: %s\n",
f3a25949de81f80c136bb073e4a8f504b080c20cJakub Hrozek ret = sysdb_attrs_add_time_t(attrs, SYSDB_LAST_UPDATE, now);
3be9e26dcd169d44ae105f1b8a0674464c700b77Sumit Bose "Could not set sysdb lastUpdate [%d]: %s\n",
45726939a48e605b0166521f94300ae04981a3a7Sumit Bose ret = sysdb_attrs_add_time_t(attrs, SYSDB_CACHE_EXPIRE,
b9e5bd09a5ff7009537a18914dbebcf10498f592Sumit Bose DEBUG(SSSDBG_OP_FAILURE, "Could not set sysdb cache expire [%d]: %s\n",
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher ret = sysdb_update_ssh_host(domain, name, attrs);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher ret = sysdb_transaction_commit(domain->sysdb);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher DEBUG(SSSDBG_CRIT_FAILURE, "Failed to commit transaction\n");
fe60346714a73ac3987f786731389320633dd245Pavel Březina sret = sysdb_transaction_cancel(domain->sysdb);
2d257ccf620ce1b611f89cec8f0a94c88c2f2881Sumit Bose DEBUG(SSSDBG_CRIT_FAILURE, "Could not cancel transaction\n");
80314a6f3ea8d81abe73d501d5b953a256cb2167Pavel Březinasysdb_set_ssh_host_attr(struct sss_domain_info *domain,
a65a64aee968bd2ac18156ced15a1e2509a8acbaAbhishek Singh dn = sysdb_ssh_host_dn(tmp_ctx, domain, name);
777374243e15c53e7b0a7345e190c1018920be18Jakub Hrozek ret = sysdb_set_entry_attr(domain->sysdb, dn, attrs, mod_op);
7caf7ed4f2eae1ec1c0717b4ee6ce78bdacd5926Jakub Hrozeksysdb_update_ssh_known_host_expire(struct sss_domain_info *domain,
0161a3c5637a0c0092bf54c436bb3d6508d7df26Jakub Hrozek const char *name,
a5623363d6042290fe652a1ca5ce5a85a821236fPavel Březina "Updating known_hosts expire time of host %s\n", name);
99c5f2f6ba0af6ce52be0d82ec2794bacc215742Jakub Hrozek ret = sysdb_attrs_add_time_t(attrs, SYSDB_SSH_KNOWN_HOSTS_EXPIRE,
bf54fbed126ec3d459af40ea370ffadacd31c76dJakub Hrozek "Could not set known_hosts expire time [%d]: %s\n",
f92ace4a52602e8c38a34f2392bec3deeac2ddddJakub Hrozek ret = sysdb_update_ssh_host(domain, name, attrs);
150b76e13b7c4f3ccf1d709bf517ca2af6b2c9a2Jakub Hrozeksysdb_delete_ssh_host(struct sss_domain_info *domain,
9f521c61c17cecd9625ebc1b33c666fa3488622cJakub Hrozek DEBUG(SSSDBG_TRACE_FUNC, "Deleting host %s\n", name);
fb3c5cdfcda069a5fbeb7b9d200c0881911364b8Jakub Hrozek return sysdb_delete_custom(domain, name, SSH_HOSTS_SUBDIR);
bf5a808fa92007c325c3996e79694badfab201d4Stephen Gallaghersysdb_search_ssh_hosts(TALLOC_CTX *mem_ctx,
18372712592b30638772afb5b7e15bfca92c2058Lukas Slebodnik const char **attrs,
150b76e13b7c4f3ccf1d709bf517ca2af6b2c9a2Jakub Hrozek ret = sysdb_search_custom(tmp_ctx, domain, filter,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher "Error looking up host [%d]: %s\n",
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher DEBUG(SSSDBG_TRACE_FUNC, "No such host\n");
8a5e793a0576250da80371e53aa3e7eba15cdb63Sumit Bose const char *name,
8a5e793a0576250da80371e53aa3e7eba15cdb63Sumit Bose const char **attrs,
90fd1bbd6035cdab46faa3a695a2fb2be6508b17Sumit Bose const char *filter;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher filter = talloc_asprintf(tmp_ctx, "(%s=%s)", SYSDB_NAME, name);
4a5a18f489f4d19aa0571528a7f0c7a8d35ac83fLukas Slebodnik ret = sysdb_search_ssh_hosts(tmp_ctx, domain, filter, attrs,
4a5a18f489f4d19aa0571528a7f0c7a8d35ac83fLukas Slebodnik "Found more than one host with name %s\n", name);
6a6a821866091e0f722808566c25b951aa346d7cStephen Gallaghersysdb_get_ssh_known_hosts(TALLOC_CTX *mem_ctx,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher "(&(|(!(%s=*))(%s=0)(%s>=%lld))(%s>=%lld))",
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher SYSDB_SSH_KNOWN_HOSTS_EXPIRE, (long long)now + 1);