// Copyright 2020 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef SMBFS_MOJOM_PASSWORD_MOJOM_TRAITS_H_
#define SMBFS_MOJOM_PASSWORD_MOJOM_TRAITS_H_

#include <memory>
#include <utility>

#include <base/files/file_util.h>
#include <base/files/scoped_file.h>
#include <base/numerics/safe_conversions.h>
#include <libpasswordprovider/password.h>
#include <mojo/public/cpp/system/platform_handle.h>

#include "smbfs/mojom/smbfs.mojom.h"

namespace mojo {

template <>
struct StructTraits<smbfs::mojom::PasswordDataView,
                    std::unique_ptr<password_provider::Password>> {
  static mojo::ScopedHandle fd(
      const std::unique_ptr<password_provider::Password>& password) {
    int fds[2];
    CHECK(base::CreateLocalNonBlockingPipe(fds));
    base::ScopedFD read_fd(fds[0]);
    base::ScopedFD write_fd(fds[1]);
    CHECK(base::WriteFileDescriptor(write_fd.get(), password->GetRaw(),
                                    password->size()));
    return mojo::WrapPlatformHandle(mojo::PlatformHandle(std::move(read_fd)));
  }

  static int32_t length(
      const std::unique_ptr<password_provider::Password>& password) {
    return base::checked_cast<int32_t>(password->size());
  }

  static bool Read(smbfs::mojom::PasswordDataView data,
                   std::unique_ptr<password_provider::Password>* password) {
    if (data.length() > smbfs::mojom::Password::kMaxLength) {
      return false;
    }

    base::ScopedFD fd = mojo::UnwrapPlatformHandle(data.TakeFd()).TakeFD();
    *password = password_provider::Password::CreateFromFileDescriptor(
        fd.get(), data.length());
    return true;
  }
};

}  // namespace mojo

#endif  // SMBFS_MOJOM_PASSWORD_MOJOM_TRAITS_H_
