+// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
+// vim: ts=8 sw=2 smarttab ft=cpp
+
#include <errno.h>
#include <stdlib.h>
#include <sstream>
#include "rgw_torrent.h"
+#include "rgw_sal.h"
+#include "rgw_sal_rados.h"
#include "include/str_list.h"
#include "include/rados/librados.hpp"
+#include "services/svc_sys_obj.h"
+
#define dout_subsys ceph_subsys_rgw
using namespace std;
-using ceph::crypto::MD5;
using namespace librados;
using namespace boost;
using ceph::crypto::SHA1;
seed::info.sha1_bl.clear();
bl.clear();
s = NULL;
- store = NULL;
+ driver = NULL;
}
-void seed::init(struct req_state *p_req, RGWRados *p_store)
+void seed::init(req_state *_req, rgw::sal::Driver* _driver)
{
- s = p_req;
- store = p_store;
+ s = _req;
+ driver = _driver;
}
-void seed::get_torrent_file(int &op_ret, RGWRados::Object::Read &read_op, uint64_t &total_len,
- bufferlist &bl_data, rgw_obj &obj)
+int seed::get_torrent_file(rgw::sal::Object* object,
+ uint64_t &total_len,
+ ceph::bufferlist &bl_data,
+ rgw_obj &obj)
{
/* add other field if config is set */
dencode.bencode_dict(bl);
}
string oid, key;
- map<string, bufferlist> m;
- set<string> obj_key;
get_obj_bucket_and_oid_loc(obj, oid, key);
- ldout(s->cct, 0) << "NOTICE: head obj oid= " << oid << dendl;
+ ldpp_dout(s, 20) << "NOTICE: head obj oid= " << oid << dendl;
- obj_key.insert(RGW_OBJ_TORRENT);
- op_ret = read_op.state.io_ctx.omap_get_vals_by_keys(oid, obj_key, &m);
- if (op_ret < 0)
- {
- ldout(s->cct, 0) << "ERROR: failed to omap_get_vals_by_keys op_ret = " << op_ret << dendl;
- return;
+ const set<string> obj_key{RGW_OBJ_TORRENT};
+ map<string, bufferlist> m;
+ const int r = object->omap_get_vals_by_keys(s, oid, obj_key, &m);
+ if (r < 0) {
+ ldpp_dout(s, 0) << "ERROR: omap_get_vals_by_keys failed: " << r << dendl;
+ return r;
}
-
- map<string, bufferlist>::iterator iter;
- for (iter = m.begin(); iter != m.end(); ++iter)
- {
- bufferlist bl_tmp = iter->second;
- char *pbuff = bl_tmp.c_str();
- bl.append(pbuff, bl_tmp.length());
+ if (m.size() != 1) {
+ ldpp_dout(s, 0) << "ERROR: omap key " RGW_OBJ_TORRENT " not found" << dendl;
+ return -EINVAL;
}
+ bl.append(std::move(m.begin()->second));
dencode.bencode_end(bl);
bl_data = bl;
total_len = bl.length();
- return;
+ return 0;
}
bool seed::get_flag()
sha1(&h, bl, bl.length());
}
-int seed::complete()
+int seed::complete(optional_yield y)
{
uint64_t remain = info.len%info.piece_length;
uint8_t remain_len = ((remain > 0)? 1 : 0);
do_encode();
/* save torrent data into OMAP */
- ret = save_torrent_file();
+ ret = save_torrent_file(y);
if (0 != ret)
{
- ldout(s->cct, 0) << "ERROR: failed to save_torrent_file() ret= "<< ret << dendl;
+ ldpp_dout(s, 0) << "ERROR: failed to save_torrent_file() ret= "<< ret << dendl;
return ret;
}
/* get sha1 */
for (off_t i = 0; i < num; i++)
{
+ // FIPS zeroization audit 20191116: this memset is not intended to
+ // wipe out a secret after use.
memset(sha, 0x00, sizeof(sha));
- h->Update((byte *)pstr, info.piece_length);
- h->Final((byte *)sha);
+ h->Update((unsigned char *)pstr, info.piece_length);
+ h->Final((unsigned char *)sha);
set_info_pieces(sha);
pstr += info.piece_length;
}
/* process remain */
if (0 != remain)
{
+ // FIPS zeroization audit 20191116: this memset is not intended to
+ // wipe out a secret after use.
memset(sha, 0x00, sizeof(sha));
- h->Update((byte *)pstr, remain);
- h->Final((byte *)sha);
+ h->Update((unsigned char *)pstr, remain);
+ h->Final((unsigned char *)sha);
set_info_pieces(sha);
}
+ ::ceph::crypto::zeroize_for_security(sha, sizeof(sha));
}
int seed::get_params()
{
is_torrent = true;
- info.piece_length = g_conf->rgw_torrent_sha_unit;
- create_by = g_conf->rgw_torrent_createby;
- encoding = g_conf->rgw_torrent_encoding;
- origin = g_conf->rgw_torrent_origin;
- comment = g_conf->rgw_torrent_comment;
- announce = g_conf->rgw_torrent_tracker;
+ info.piece_length = g_conf()->rgw_torrent_sha_unit;
+ create_by = g_conf()->rgw_torrent_createby;
+ encoding = g_conf()->rgw_torrent_encoding;
+ origin = g_conf()->rgw_torrent_origin;
+ comment = g_conf()->rgw_torrent_comment;
+ announce = g_conf()->rgw_torrent_tracker;
/* tracker and tracker list is empty, set announce to origin */
if (announce.empty() && !origin.empty())
if (announce_list.empty())
{
- ldout(s->cct, 5) << "NOTICE: announce_list is empty " << dendl;
+ ldpp_dout(s, 5) << "NOTICE: announce_list is empty " << dendl;
return;
}
dencode.bencode_end(bl);
}
-int seed::save_torrent_file()
+int seed::save_torrent_file(optional_yield y)
{
int op_ret = 0;
string key = RGW_OBJ_TORRENT;
- rgw_obj obj(s->bucket, s->object.name);
-
- rgw_raw_obj raw_obj;
- store->obj_to_raw(s->bucket_info.placement_rule, obj, &raw_obj);
- op_ret = store->omap_set(raw_obj, key, bl);
+ op_ret = s->object->omap_set_val_by_key(s, key, bl, false, y);
if (op_ret < 0)
{
- ldout(s->cct, 0) << "ERROR: failed to omap_set() op_ret = " << op_ret << dendl;
+ ldpp_dout(s, 0) << "ERROR: failed to omap_set() op_ret = " << op_ret << dendl;
return op_ret;
}