text:
#include "ts/ink_config.h"
#include "ts/Diags.h"
#include "ts/ink_cap.h"
#include "ts/ink_thread.h"

#include <grp.h>

#if HAVE_SYS_CAPABILITY_H
#include <sys/capability.h>
#endif

#if HAVE_SYS_PRCTL_H
#include <sys/prctl.h>
#endif

// NOTE: Failing to acquire or release privileges is a fatal error. This is because that should never happen
// and if it does, it is likely that some fundamental security assumption has been violated. In that case
// it is dangerous to continue.

#if !TS_USE_POSIX_CAP
ink_mutex ElevateAccess::lock = INK_MUTEX_INIT;
#endif

#define DEBUG_CREDENTIALS(tag)                                                                                \
  do {                                                                                \
    if (is_debug_tag_set(tag)) {                                                                                \
      uid_t uid = -1, euid = -1, suid = -1;                                                                                \
      gid_t gid = -1, egid = -1, sgid = -1;                                                                                \
      getresuid(&uid, &euid, &suid);                                                                                \
      getresgid(&gid, &egid, &sgid);                                                                                \
      Debug(tag, "uid=%ld, gid=%ld, euid=%ld, egid=%ld, suid=%ld, sgid=%ld", static_cast<long>(uid), static_cast<long>(gid), \
            static_cast<long>(euid), static_cast<long>(egid), static_cast<long>(suid), static_cast<long>(sgid));             \
    }                                                                                \
  } while (0)

#if TS_USE_POSIX_CAP

#define DEBUG_PRIVILEGES(tag)                                                                                \
  do {                                                                                \
    if (is_debug_tag_set(tag)) {                                                                                \
      cap_t caps      = cap_get_proc();                                                                          \
      char *caps_text = cap_to_text(caps, nullptr);                                                              \
      Debug(tag, "caps='%s', core=%s, death signal=%d, thread=0x%llx", caps_text, is_dumpable(), death_signal(), \
            (unsigned long long)pthread_self());                                                                 \
      cap_free(caps_text);                                                                                \
      cap_free(caps);                                                                                \
    }                                                                                \
  } while (0)

#else /* TS_USE_POSIX_CAP */

#define DEBUG_PRIVILEGES(tag)                                                                       \
  do {                                                                                \
    if (is_debug_tag_set(tag)) {                                                                    \
      Debug(tag, "caps='', core=%s, death signal=%d, thread=0x%llx", is_dumpable(), death_signal(), \
            (unsigned long long)pthread_self());                                                    \
    }                                                                                \
  } while (0)

#endif /* TS_USE_POSIX_CAP */

#if !HAVE_GETRESUID
static int
getresuid(uid_t *uid, uid_t *euid, uid_t *suid)
{
  *uid  = getuid();
  *euid = geteuid();
  return 0;
}
#endif /* !HAVE_GETRESUID */

#if !HAVE_GETRESGID
static int
getresgid(gid_t *gid, gid_t *egid, gid_t *sgid)
{
  *gid  = getgid();
  *egid = getegid();
  return 0;
}
#endif /* !HAVE_GETRESGID */

static unsigned
max_passwd_size()
{
#if defined(_SC_GETPW_R_SIZE_MAX)
  long val = sysconf(_SC_GETPW_R_SIZE_MAX);
  if (val > 0) {
    return (unsigned)val;
  }
#endif

  return 4096;
}

static const char *
is_dumpable()
{
#if defined(PR_GET_DUMPABLE)
  return (prctl(PR_GET_DUMPABLE) != 1) ? "disabled" : "enabled";
#else
  return "unknown";
#endif
}

static int
death_signal()
{
  int signum = -1;

#if defined(PR_GET_PDEATHSIG)
  prctl(PR_GET_PDEATHSIG, &signum, 0, 0, 0);
#endif

  return signum;
}

void
DebugCapabilities(const char *tag)
{
  DEBUG_CREDENTIALS(tag);
  DEBUG_PRIVILEGES(tag);
}

static void
impersonate(const struct passwd *pwd, ImpersonationLevel level)
{
  int deathsig  = death_signal();
  bool dumpable = false;

  DEBUG_CREDENTIALS("privileges");
  DEBUG_PRIVILEGES("privileges");

  ink_release_assert(pwd != nullptr);

#if defined(PR_GET_DUMPABLE)
  dumpable = (prctl(PR_GET_DUMPABLE) == 1);
#endif

  // Always repopulate the supplementary group list for the new user.
  initgroups(pwd->pw_name, pwd->pw_gid);

  switch (level) {
  case IMPERSONATE_PERMANENT:
    if (setregid(pwd->pw_gid, pwd->pw_gid) != 0) {
      Fatal("switching to user %s, failed to set group ID %ld", pwd->pw_name, (long)pwd->pw_gid);
    }

    if (setreuid(pwd->pw_uid, pwd->pw_uid) != 0) {
      Fatal("switching to user %s, failed to set user ID %ld", pwd->pw_name, (long)pwd->pw_uid);
    }
    break;

  case IMPERSONATE_EFFECTIVE:
    if (setegid(pwd->pw_gid) != 0) {
      Fatal("switching to user %s, failed to set group ID %ld", pwd->pw_name, (long)pwd->pw_gid);
    }

    if (seteuid(pwd->pw_uid) != 0) {
      Fatal("switching to user %s, failed to set effective user ID %ld", pwd->pw_name, (long)pwd->pw_gid);
    }
    break;
  }

  // Reset process flags if necessary. Elevating privilege using capabilities does not reset process
  // flags, so we don't have to bother with this in elevateFileAccess().

  EnableCoreFile(dumpable);

  if (deathsig > 0) {
    EnableDeathSignal(deathsig);
  }

  DEBUG_CREDENTIALS("privileges");
  DEBUG_PRIVILEGES("privileges");
}

void
ImpersonateUserID(uid_t uid, ImpersonationLevel level)
{
  struct passwd *pwd;
  struct passwd pbuf;
  char buf[max_passwd_size()];

  if (getpwuid_r(uid, &pbuf, buf, sizeof(buf), &pwd) != 0) {
    Fatal("missing password database entry for UID %ld: %s", (long)uid, strerror(errno));
  }

  if (pwd == nullptr) {
    // Password entry not found ...
    Fatal("missing password database entry for UID %ld", (long)uid);
  }

  impersonate(pwd, level);
}

void
ImpersonateUser(const char *user, ImpersonationLevel level)
{
  struct passwd *pwd;
  struct passwd pbuf;
  char buf[max_passwd_size()];

  if (*user == '#') {
    // Numeric user notation.
    uid_t uid = (uid_t)atoi(&user[1]);
    if (getpwuid_r(uid, &pbuf, buf, sizeof(buf), &pwd) != 0) {
      Fatal("missing password database entry for UID %ld: %s", (long)uid, strerror(errno));
    }
  } else {
    if (getpwnam_r(user, &pbuf, buf, sizeof(buf), &pwd) != 0) {
      Fatal("missing password database entry for username '%s': %s", user, strerror(errno));
    }
  }

  if (pwd == nullptr) {
    // Password entry not found ...
    Fatal("missing password database entry for '%s'", user);
  }

  impersonate(pwd, level);
}

bool
PreserveCapabilities()
{
  int zret = 0;
#if TS_USE_POSIX_CAP
  zret = prctl(PR_SET_KEEPCAPS, 1);
#endif
  Debug("privileges", "[PreserveCapabilities] zret : %d", zret);
  return zret == 0;
}

// Adjust the capabilities to only those needed.
bool
RestrictCapabilities()
{
  int zret = 0; // return value.
#if TS_USE_POSIX_CAP
  cap_t caps = cap_init(); // start with nothing.
  // Capabilities we need.
  cap_value_t perm_list[]         = {CAP_NET_ADMIN, CAP_NET_BIND_SERVICE, CAP_IPC_LOCK, CAP_DAC_OVERRIDE, CAP_FOWNER};
  static int const PERM_CAP_COUNT = sizeof(perm_list) / sizeof(*perm_list);
  cap_value_t eff_list[]          = {CAP_NET_ADMIN, CAP_NET_BIND_SERVICE, CAP_IPC_LOCK};
  static int const EFF_CAP_COUNT  = sizeof(eff_list) / sizeof(*eff_list);

  cap_set_flag(caps, CAP_PERMITTED, PERM_CAP_COUNT, perm_list, CAP_SET);
  cap_set_flag(caps, CAP_EFFECTIVE, EFF_CAP_COUNT, eff_list, CAP_SET);
  zret = cap_set_proc(caps);
  cap_free(caps);
#endif
  Debug("privileges", "[RestrictCapabilities] zret : %d", zret);
  return zret == 0;
}

bool
EnableCoreFile(bool flag)
{
  int zret = 0;

#if defined(PR_SET_DUMPABLE)
  int state = flag ? 1 : 0;
  if (0 > (zret = prctl(PR_SET_DUMPABLE, state, 0, 0, 0))) {
    Warning("Unable to set PR_DUMPABLE : %s", strerror(errno));
  } else if (state != prctl(PR_GET_DUMPABLE)) {
    zret = ENOSYS; // best guess
    Warning("Call to set PR_DUMPABLE was ineffective");
  }
#endif // linux check

  Debug("privileges", "[EnableCoreFile] zret : %d", zret);
  return zret == 0;
}

void
EnableDeathSignal(int signum)
{
  (void)signum;

#if defined(PR_SET_PDEATHSIG)
  if (prctl(PR_SET_PDEATHSIG, signum, 0, 0, 0) != 0) {
    Debug("privileges", "prctl(PR_SET_PDEATHSIG) failed: %s", strerror(errno));
  }
#endif
}

int
elevating_open(const char *path, unsigned int flags, unsigned int fperms)
{
  int fd = open(path, flags, fperms);
  if (fd < 0 && (EPERM == errno || EACCES == errno)) {
    ElevateAccess access(ElevateAccess::FILE_PRIVILEGE);
    fd = open(path, flags, fperms);
  }
  return fd;
}

int
elevating_open(const char *path, unsigned int flags)
{
  int fd = open(path, flags);
  if (fd < 0 && (EPERM == errno || EACCES == errno)) {
    ElevateAccess access(ElevateAccess::FILE_PRIVILEGE);
    fd = open(path, flags);
  }
  return fd;
}

FILE *
elevating_fopen(const char *path, const char *mode)
{
  FILE *f = fopen(path, mode);
  if (nullptr == f && (EPERM == errno || EACCES == errno)) {
    ElevateAccess access(ElevateAccess::FILE_PRIVILEGE);
    f = fopen(path, mode);
  }
  return f;
}

int
elevating_chmod(const char *path, int perm)
{
  int ret = chmod(path, perm);
  if (ret != 0 && (EPERM == errno || EACCES == errno)) {
    ElevateAccess access(ElevateAccess::OWNER_PRIVILEGE);
    return chmod(path, perm);
  }
  return ret;
}

#if TS_USE_POSIX_CAP
/** Acquire file access privileges to bypass DAC.
    @a level is a mask of the specific file access capabilities to acquire.
 */
void
ElevateAccess::acquirePrivilege(unsigned priv_mask)
{
  unsigned cap_count = 0;
  cap_value_t cap_list[3];
  cap_t new_cap_state;

  Debug("privileges", "[acquirePrivilege] level= %x", level);

  ink_assert(nullptr == cap_state);

  // Some privs aren't checked or used here because they are kept permanently in the
  // the capability list. See @a eff_list in @c RestrictCapabilities
  // It simplifies things elsewhere to be able to specify them so that the cases for
  // POSIX capabilities and user impersonation have the same interface.

  if (priv_mask & ElevateAccess::FILE_PRIVILEGE) {
    cap_list[cap_count] = CAP_DAC_OVERRIDE;
    ++cap_count;
  }

  if (priv_mask & ElevateAccess::TRACE_PRIVILEGE) {
    cap_list[cap_count] = CAP_SYS_PTRACE;
    ++cap_count;
  }

  if (priv_mask & ElevateAccess::OWNER_PRIVILEGE) {
    cap_list[cap_count] = CAP_FOWNER;
    ++cap_count;
  }

  ink_release_assert(cap_count <= sizeof(cap_list));

  if (cap_count > 0) {
    this->cap_state = cap_get_proc(); // save current capabilities
    new_cap_state   = cap_get_proc(); // and another instance to modify.
    cap_set_flag(new_cap_state, CAP_EFFECTIVE, cap_count, cap_list, CAP_SET);

    if (cap_set_proc(new_cap_state) != 0) {
      Fatal("failed to acquire privileged capabilities: %s", strerror(errno));
    }

    cap_free(new_cap_state);
    elevated = true;
  }
}
/** Restore previous capabilities.
 */
void
ElevateAccess::releasePrivilege()
{
  Debug("privileges", "[releaseFileAccessCap]");

  if (this->cap_state) {
    if (cap_set_proc(static_cast<cap_t>(cap_state)) != 0) {
      Fatal("failed to restore privileged capabilities: %s", strerror(errno));
    }
    cap_state = nullptr;
  }
}
#endif

ElevateAccess::ElevateAccess(unsigned lvl)
  : elevated(false),
    saved_uid(geteuid()),
    level(lvl)
#if TS_USE_POSIX_CAP
    ,
    cap_state(0)
#endif
{
  elevate(level);
#if !TS_USE_POSIX_CAP
  DEBUG_CREDENTIALS("privileges");
#endif
  DEBUG_PRIVILEGES("privileges");
}

ElevateAccess::~ElevateAccess()
{
  if (elevated) {
    demote();
#if !TS_USE_POSIX_CAP
    DEBUG_CREDENTIALS("privileges");
#endif
    DEBUG_PRIVILEGES("privileges");
  }
}

void
ElevateAccess::elevate(unsigned priv_mask)
{
#if TS_USE_POSIX_CAP
  acquirePrivilege(priv_mask);
#else
  if (priv_mask) {
    // Since we are setting a process-wide credential, we have to block any other thread
    // attempting to elevate until this one demotes.
    ink_mutex_acquire(&lock);
    ImpersonateUserID(0, IMPERSONATE_EFFECTIVE);
    elevated = true;
  }
#endif
}

void
ElevateAccess::demote()
{
  if (elevated) {
#if TS_USE_POSIX_CAP
    releasePrivilege();
#else
    ImpersonateUserID(saved_uid, IMPERSONATE_EFFECTIVE);
    ink_mutex_release(&lock);
#endif
    elevated = false;
  }
}

redpajama_set_name: RedPajamaGithub


text:
The Cibus funds appoint Montfort Communications
Montfort Communications, the fast-growing corporate reputation firm, has been appointed as strategic communications adviser to the Cibus funds.
The team, led by Founding Partner Gay Collins, and including Olly Scott, Louis Supple and Lauren O'Keeffe, will work closely with Rob Appleby, Co-Founder of ADM Capital and the Cibus funds senior team to support the firm's growth initiatives and drive its mission to raise awareness of sustainable food and agriculture as an emerging asset class in the ESG arena. The Montfort team will provide strategic advice around brand building and media campaigns to help build the Cibus funds' reputation within the sustainable investments space and raise the profile of their investment philosophies.
Founded in 2016, the Cibus funds are one of three pillars within investment adviser ADM Capital. The Cibus strategy aims to address the challenges in producing more food with limited resources (including land) and capitalise on the investment opportunities in agriculture's changing landscape. The company raises capital to support the transition of the food value chain to a new sustainable model, by investing in new and innovative companies which have the potential to disrupt food production or processing, using the latest technology to increase resource efficiency and sustainability. By investing globally across developed countries via two different strategies, the Cibus funds have raised over USD$500 million so far (as of March 31st 2021).
The two funds that make up the Cibus strategy are the Cibus Fund LP, which focuses on growth equity opportunities and the Cibus Enterprise Fund, which prioritises Agrifood Tech investments. Both share the principle that financial capital should be provided to companies that have found innovative ways to produce better food with fewer negative externalities and efficient resource use.
Gay Collins, Founding Partner at Montfort Communications, said:
"We have an exciting opportunity to enhance the visibility of a firm that is actively driving sustainability in the areas of food and agriculture at such a crucial time. Montfort has built up considerable experience in the ESG space in the past several years, and we look forward to showcasing the fascinating work the team at the Cibus Fund are doing.
"The Cibus funds are the latest addition to Montfort's rapidly growing roster of clients and follows on from an exceptional year of growth and a strong start to 2021 for the financial services team and Montfort overall, with new retained clients including Impax Environmental Markets Plc, Temple Bar Plc, Chrysalis Plc, RWC Partners and River & Mercantile Group."
Rob Appleby, Co-Founder of ADM Capital, said:
"We are delighted to be working with Montfort at a time when food and farming is undergoing systemic change. Farmers are facing the challenges associated with the climate emergency, pandemics and alternative subsidies, whilst being stewards of our environment and producing more food at lower costs. Technology will play an increasingly important part in the future of food in helping to address the changing regulatory and consumer landscapes. Cibus is well positioned to provide capital to those companies embracing technology and sustainability in these exciting times."
About the Cibus Fund and the Cibus Enterprise Fund
ADM Capital Europe launched the Cibus Fund in 2017 and the Cibus Enterprise Fund in 2019 (the 'Cibus funds'). The Cibus Fund targets control equity investments in mid-market food production and processing businesses in Europe and other OECD countries. The Cibus Enterprise Fund has a global mandate to invest in late-stage venture companies disrupting the food value chain through technological advances in the sector. Both Funds take advantage of the significant investment opportunities presented by global regulatory changes, shifting trade and consumption patterns and the inability of the world's fastest growing economies to meet rapidly increasing regional demand for food. Investments are evaluated on their environmental sustainability as a key determinant of value creation

redpajama_set_name: RedPajamaCommonCrawl


A new year means healthier eating right? But what about the cookies?
With resolutions of healthier eating it's hard to give up snacks. So let's talk oatmeal cookies, which come in all shapes and sizes. They really do. Soft and chewy, with ginger, chocolate chips, raisins, cinnamon and more. Everyone has a favourite and/or a favourite recipe they love. When I was a kid, my mom would make us papaya oatmeal cookies. I haven't had one of those in years. But I found her recipe so it's coming. To satisfy our sweet tooth and help get us through the first month of the year, we whipped up these Honey Cranberry Cookies.
We've added cranberries, honey and sunflower seeds into this cookie to make us feel better about eating it. It works! And is the perfect January, get back to healthy, cookie treat to allow yourself on cheat days. Or in between.
This is my second time posting this very tasty Five Spice Ginger Cookie recipe. I first created these bites last Fall, for the 3rd Annual Calgary Food Bloggers Bake Sale. They were a delicious hit and so tasty my mouth is watering looking at the picture. You can find the original recipe post from September here: Five Spice Ginger Cookies.
I am re-posting this recipe in all it's infinite glory as I am entering the Sweet Dreams Cookie Contest by Crosby's. This is actually a perfect reminder I have two containers of Crosby's Fancy Molasses sitting in my pantry needing to get used up. I know I'll be making them again soon. Probably this week. Maybe tomorrow.
After deciding I drink to much espresso and eat way to many ginger cookies at a very popular coffee chain, I was inspired to make my own version of this cookie. A healthier version. Had to be the same size however because, after all, bigger is better, isn't it?! Inspiration comes from everywhere.
I wanted to turn it up a notch and decided to use a favourite spice blend, Five Spice Powder. The aromatic combination of spices would be the perfect match in this cookie. My gamble paid off as it's an explosion of equally balanced flavours in every bite.
Taste testers love this monster cookie and I think you will too.


Welcome to the Natural Hormone Clinic.
The purpose of the Natural Hormone Clinic is to help you achieve the highest functioning healthy body possible.
This goal is reached through several strategies all personalized to you and your needs. We begin by assessing your current level of health relevant to your hormonal balance. Hormones are essential to the efficient functioning of every organ in our body. As we age our body produces less of what is vital to our peak performance and sense of well being. This happens so gradually that we don't notice until the cumulative effects have left us feeling drained, old and spent. When we replace the hormones we've lost we are rewarded with more energy, fewer aches and pains, and a renewed appetite for enjoyable, life affirming activities.
The key however is to replace what we need with precisely what has been lost. The Natural Hormone Clinic does not follow the convenient protocol of non human hormones. We use hormones that are biologically identical to those produced by you. Our commitment to this approach began with a personal event for me.
When my own wife had a hysterectomy she was advised to follow the standard hormone replacement therapy. I watched as she suffered terribly. I had been an OB-GYN for 30 years, and I knew there must be a better way; a treatment that provided comfort, not agony. I approached a trusted friend and brilliant colleague, Dr Bernard Rice. Together we hit upon the formula for using bio-identical hormone replacement. This has made all the difference. My patients, both men and women, have had incredibly positive, life-altering results.
In addition to the protocol for minimizing the debilitating effects of aging, the Natural hormone Clinic also has an exciting, safe and effective weight management program for sustainable weight loss and control. HCG is used to convert fat to muscle. HCG combined with a healthy diet, exercise regimen, and the necessary hormones enable you to sustain lasting results.
Thank you for taking the time to browse our website. Our pledge is to provide you with information and support to achieve your optimal level of health, enjoyment, and well being.
Click to print "The Little Hormone Book." Click to print "The Symptom Checklist" only.


Group of six websites united by single splash screen.
The whole system shows different projects of the company and information about the tournaments that they organize.
The main website have quite a lot functionalities like news, videos, photos, different kind of information about all teams, ranking of the main team and others. All of them are controlled from Content Management System.
This website is developed in Forma Design.
Design by Kiril Semkov | Powered by me.


We journalists know that, when you're in the public eye, everything you do can and will be watched. You're fair game.
…Unless it's a private event. Right, Romney?
On late Monday, Sept. 17, Mother Jones published the videos while keeping the anonymity of the person who submitted them. By the looks of the videos, it appears to be a member of the waitstaff, although we never actually see the guilty party.
When guests arrived at this lavish, $50,000 per-plate event, they were searched to make sure they had no recording devices of any kind, including cellular phones. It makes sense, then, that it could have been a worker–did you forget to check their pockets, Mr. Romney?
The publication of the videos obviously caused quite a stir. Mother Jones also went as far as to publish the transcripts of the videos, in case the viewers had a difficult time deciphering the garble.
Mitt Romney plans no apologies for this video. He stated that, while he didn't exactly say things eloquently, he meant what he said.
What do you think? Was Romney right to stand his ground, or should he have made a public apology?
This entry was posted in Education, Journalism, News, Opinion, Politics, Technology and tagged 47%, barack, fundraiser, jones, leder, marc, marc leder, mitt, mitt romney, mother, motherjones, obama, private, reaction, romney, transcripts, victims, videos. Bookmark the permalink.


text:
Ghost of Tsushima: Journey into the dark secrets of Iki Island
Haunting memories and new threats await Jin Sakai.
Patrick Downs	Senior Writer, Sucker Punch Productions
It's been quite a year for the team at Sucker Punch (and for everyone). Last July, we shipped Ghost of Tsushima while working from home. Since then, we've been overwhelmed with gratitude by the positive responses we received from players all over the world. One year later, Ghost of Tsushima Director's Cut is set to be released on August 20. We can't wait to share new stories of Jin Sakai with all of you!
As part of the Director's Cut, you'll be able to play a new story expansion featuring Jin, set on Iki Island with new locations to discover, characters to meet, tales to complete, and more.
Jin's journey begins when he discovers that a mysterious Mongol tribe has gained a foothold on Iki. They are led by a revered shaman called Ankhsar Khatun, known to her followers as "the Eagle." As both a khatun and a shaman, she is not only a conqueror of nations, but a shepherd of souls. And the danger she presents to Jin and his people is unlike any they have faced.
The only way to counter this threat is for Jin to return to Iki Island. He's been there once before. And in confronting a new and dangerous enemy, he will be forced to face old fears, and unearth deeply buried traumas. As you explore a new island and battle new threats, you'll also delve into the dark past of clan Sakai…
Our semi-fictional version of Iki Island provides a stark contrast to Tsushima. It is a wild, lawless land of raiders and criminals, scarred by memories of war, and fiercely independent; the samurai have not been in control there for decades. Skilled though he is, Jin can't take on the Mongols alone. He will have to work with—or around—a coterie of unsavory characters to take the fight to the Eagle. The cost of failure is too high. If the Eagle and her tribe subdue Iki and muster the support of its people, Tsushima and the rest of Japan will be in grave danger.
The stories you find on Tsushima are filled with action and adventure. The same is true for Iki Island. In the fight to save Iki, Jin will encounter pirates and smugglers, mad monks and haunted caves. There will be new legends to hear, and new techniques to learn. Jin will have to bring all his skills to bear to defeat this new enemy.
We'll also continue telling intimate, emotional, personal stories. Stories about real people struggling to let go of old hatreds and survive in a time of war. Stories about how it feels to be caught between preserving cherished beliefs and defending your home. What it means to be Lord Sakai… and what it means to be the Ghost.
With everything that has happened this past year, it's no accident we also wanted to tell a story of healing… And we felt this would pose a unique and compelling challenge for Jin. We all suffer wounds, from the humblest farmer to the mightiest jito. Wounds from the past that we carry with us. And the thing about a wound is that you can't fight it, or stealth your way around it. Ghost weapons and samurai techniques won't help you. A wound can only be healed.
The Iki Island story expansion will be available as part of the Ghost of Tsushima Director's Cut. You can pre-order now for $69.99 USD / €79.99 / £69.99 on PS5 and $59.99 USD / €69.99 / £59.99 on PS4, or if you already own Ghost of Tsushima on PS4, you can pre-order an upgrade to Director's Cut on PS4 for $19.99 USD / €19.99 / £15.99.
We are so thrilled that you will once again be able to experience our world through the eyes of Jin Sakai! It was a joy and a privilege to write for such a gifted cast… some you will recognize, and some will surprise you (and maybe both). There's so much more to tell, which we're excited to share leading up to our launch on August 20.
And when you join us on Iki Island, bear in mind the advice of a wise woman named Yuriko: "The strength we need is all around us."
Looking around at my team and what we accomplished in this difficult year, I think she's right. And I think Jin Sakai would agree.
ghost of tsushimasuckerpunch productions
Ghost of Tsushima Director's Cut
Pre-order at PlayStation Store today
DelayTimeout
July 21, 2021 at 7:09 am PDT
What if I own [pre-ordered deluxe edition] Ghost Of Tsushima from PS4 but am now on PS5? How much will upgrading to the PS5 edition with the DLC cost? And will my save files transfer over as well?
Disregard my comment, I just noticed an older article which addressed both of my questions. $29.99 USD to upgrade….sounds steep. The DLC better be comprehensive for that price, at practically half the cost of the original Digital Deluxe Edition pre-order for the full game.
DeathEagle95
August 4, 2021 at 12:51 pm PDT
is confirmed that iki island is half of map from base game and rumour is 15-20 hours for every story and side-stories.
Kasaix
This is going to be epic!
TheLoCoRaven
This blog post neglected to mention paying $30 to upgrade the PS4 version to the PS5 directors cut . . . That is still an option, correct?
fix2k
GmMONEY267
When u find it lmk. As far as I'm concerned… its not, at all, available for upgrade on the ps5. Its nowhere in the store but the ps4 upgrade sure is. Why advertise something that u do not have Sony.
MysticalOS
^this
BLiTZ-RoB0
They already said in the last blog post that the upgrade will be available at launch
andrewsqual
Err why would they mention that damaging 30 quid upgrade screw up all over again?
People made it pretty clear the first time what they thought of it. So they need to avoid talking about it ever again now.
qwertyuiopa14118
July 21, 2021 at 12:58 pm PDT
It's available at launch
Clive-Friday
August 9, 2021 at 10:19 am PDT
I wish they would add this version as well to be pre-ordered, I don't get why they have the one and not the other.
chr15_D1995
Very tempted to hop back into Ghost of Tsushima with this expansion. I'll definitely keep my eye on this :)
BMSvonSKW
You guys rock. Can't wait to hear what's coming next for Legends!
herbalsticky
Sucker punched us in the guts. Haven't they made enough money from this game? The founders of SP don't need a third house; a fifth vehicle.
No matter what you think, remember, this is all Sony.
Sucker Punch are getting salaries whether they take 6 years to release a game between the launch of Infamous First Light and Ghost of Tsushima or not.
I understand the publisher has full control of what happens to games they distribute. The developer could also object to the perpetual greed induced by Playstation, but they don't. Especially developers whom are given 6 years and have an est. annual of over $40M.
TWODEEEE
Sony is more than a publisher, they literally own sucker punch
@TWO All publishers "own" developers.
Azeem-_-Abbas
Hi can anyone tell that will the game have iki expansion on the disc itself or will it be on a voucher reason I'm asking is this as i played the game on region 2 and my account is region 1 so i won't be able to upgrade my current game. And is there any cross region transfer because Horizon Zero Dawn had when you change from base game to Complete Edition.
KyriePear
Sounds fantastic. Only a month away.
Amnalehu
I'm very glad to see a full fledged PS5 version coming along with some new content. I just wish people would stop calling it an upgrade. The game PS5 version was already patched and improved and they have stated that more FREE enhancements are coming for all versions of the game. If you don't want the new content just enjoy the free enhancement that they already gave us. I already have my PS5 version pre-ordered and I can't wait to experience this game and all of it's new enhancements and content. Well done Sucker Punch!
varoennauraa
I'd love to have gyro controls thrown in as well!
bvspavan91
Trend of Director's Cut in video games is preposterous. One can completely enjoy a narrative driven game only for the first time. A story completed, is a story told. Period. These are just to leverage the brand image for generating additional revenue – which I understand but at the cost of betraying the customers who already played the game. I think Sony should rethink their strategy about Director's Cut. It would be much better to release only the Director's cut at a higher price than release two/three versions of the same game over a course of time.
gamaesthete
With this logic no game could ever have expansions or sequels. We knew GoT would get a sequel it was never meant to be a standalone one part only story.
Wow, so you aren't even going to mention the 30 quid to play a native PS5 version of Ghost of Tsushima "upgrade" now?
Well if one thing is loud and clear, you HEARD us Sony. I guess you just need to bury your head in the sand now on this terrible terrible decision. The more you keep quiet, the less people will talk about it and then you won't bother doing anything about it.
Square Enix already did a stellar model upgrade path. FREE PS5 version of the original game, WITH more significant improvements all round than GOT, for all owners of FFVII Remake digitally or physically and then a price for the expansion whenever you feel like jumping into that. What was so hard about following that model???
Sorry Sucker Punch, Collector's Edition owner here………… I'm still never touching this. You can thank Sony and their endless terrible decisions the past few months.
Jackal888
July 21, 2021 at 10:48 am PDT
Excited to play this and return to Jin. This may be my game of the year again!
AlphaExGAT
😍😍😍😍
NinjaRemoteplay
July 26, 2021 at 1:59 pm PDT
Welmosca
Damn you SP this is looking so damn awesome,I love villain women (when they're well written) and Ankhsar looks great.Man this is looking so good it's truly tempting to get the DLC to hop back on Ghost but I gotta subdue these feelings.
PS:Please SP if you're reading this…add option to sell leather and steel,I really don't wanna struggle with that again whenever I get to play NG+.Should be easy to implement this in the game and there's no reason to not be able to sell them.
PPS:Please release an avatar of Yuna hehe.
SlyCupper991
This looks fun and it really makes me want to jump back into the game. I'll probably wait until I get my PS5 though and play it then. I'm not sure if it's worth the full $70, but by the time I can snag a PS5 I'm sure it'll drop down by $10 or so.
Great job Sucker Punch! Can't wait to play both this and whatever your next project is!
JesseJoJames
Why so many whiny babies in this conversation. 1st world problems, so lame.
@James A whiner whining about whiners.
HollowKage
Who would've known this game could've gotten any more amazing?…not me.
Prince_Serlith
Did noone notice the voice actor change? …… thats not cool
HassanBROBRE
Thanks for 60 trophies, i will totally enjoy in this, it has 60 trophies and it has a alot fun! Thx a lot.
LordofStarfall
Please add a Knack themed armor set for the Samurai in Legends mode! Knackurai!
The trailer was insane
Jim20062
Looking forward to playing it on the PS5. Favorite game last year. Enhancements are worth buying the PS5 version IMO. LOVE Sucker Punch games!
It's a shame I had to switch to pc to save money because of you guys charging $70 for games on ps5 and charging for "next gen upgrades", not that I would of paid 30 to upgrade this on ps5 anyway, majority of your 3rd party games run way better on pc but you charge more lol why? You guys are getting greedy because of the success of ps4 and charging 70 even for first party games
zenparadox1
I feel we are fortunate to be able to continue more stories with Jin, and I'm really looking forward to this. The scene of him being captured concerns me in that I hope we don't start the game stripped of all the gear and skills we spend so long earning in the main game. That is really an overused gimmick in gaming. I guess it's good to completely force stealth on the player, but I didn't really get this game for stealth.
I guess the question is: will we be starting with the Jin that we ended the game with, or having to earn powers and gear all over again?
TheWorldsEnemy_
Iki Island looks beautiful and dangerous! An extension of Tsushima but unique in it's own feel, atmosphere and challenge. The Eagle looks to be a formidable adversary. The theme of healing is really cool and heartfelt. I'm very excited for this journey!
aerocomplex_
This is going to be amazing!
halvapris93
August 1, 2021 at 9:27 am PDT
What if I already own the PS5 version but want to upgrade to directors cut? Do I have to buy the whole game again with the expansion?
Really love this game.
Vadleism454maste
Why you've made me buy another disc sony!!!😢💔
CasuallyRelyt
August 8, 2021 at 4:23 pm PDT
SukerPunch delivers another amazing hit. Damn guys. I cannot wait to sail to Iki Island and take the fight back to the Mongols there. The game is great and I'm positive the new expansion will be just as good. Can't wait to play it!