]> git.proxmox.com Git - ceph.git/blobdiff - ceph/src/rgw/rgw_torrent.cc
bump version to 18.2.4-pve3
[ceph.git] / ceph / src / rgw / rgw_torrent.cc
index c1f8aaac0bd00c35f36fc2a52bffcbb00db32e9e..e1a1417a5a6fdc08beb383167bd5866ee2d01ba3 100644 (file)
@@ -1,16 +1,22 @@
+// -*- 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;
@@ -28,17 +34,19 @@ seed::~seed()
   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);
@@ -57,31 +65,26 @@ void seed::get_torrent_file(int &op_ret, RGWRados::Object::Read &read_op, uint64
   }
 
   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()
@@ -99,7 +102,7 @@ void seed::update(bufferlist &bl)
   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);
@@ -110,10 +113,10 @@ int seed::complete()
   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;
   }
 
@@ -153,9 +156,11 @@ void seed::sha1(SHA1 *h, bufferlist &bl, off_t bl_len)
   /* 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;
   }
@@ -163,22 +168,25 @@ void seed::sha1(SHA1 *h, bufferlist &bl, off_t bl_len)
   /* 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())
@@ -196,7 +204,7 @@ void seed::set_announce()
 
   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;
   }
 
@@ -237,19 +245,15 @@ void seed::do_encode()
   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;
   }