1
0
Fork 0
mirror of https://we.phorge.it/source/phorge.git synced 2025-01-09 06:11:01 +01:00
phorge-phorge/src/applications/auth/storage/PhabricatorAuthInvite.php
epriestley 2a0af8e299 Add email invites to Phabricator (logic only)
Summary:
Ref T7152. This builds the core of email invites and implements all the hard logic for them, covering it with a pile of tests.

There's no UI to create these yet, so users can't actually get invites (and administrators can't send them).

This stuff is a complicated mess because there are so many interactions between accounts, email addresses, email verification, email primary-ness, and user verification. However, I think I got it right and got test coverage everwhere.

The degree to which this is exception-driven is a little icky, but I think it's a reasonable way to get the testability we want while still making it hard for callers to get the flow wrong. In particular, I expect there to be at least two callers (one invite flow in the upstream, and one derived invite flow in Instances) so I believe there is merit in burying as much of this logic inside the Engine as is reasonably possible.

Test Plan: Unit tests only.

Reviewers: btrahan

Reviewed By: btrahan

Subscribers: epriestley

Maniphest Tasks: T7152

Differential Revision: https://secure.phabricator.com/D11723
2015-02-09 16:12:36 -08:00

55 lines
1.4 KiB
PHP

<?php
final class PhabricatorAuthInvite
extends PhabricatorUserDAO {
protected $authorPHID;
protected $emailAddress;
protected $verificationHash;
protected $acceptedByPHID;
private $verificationCode;
protected function getConfiguration() {
return array(
self::CONFIG_COLUMN_SCHEMA => array(
'emailAddress' => 'sort128',
'verificationHash' => 'bytes12',
'acceptedByPHID' => 'phid?',
),
self::CONFIG_KEY_SCHEMA => array(
'key_address' => array(
'columns' => array('emailAddress'),
'unique' => true,
),
'key_code' => array(
'columns' => array('verificationHash'),
'unique' => true,
),
),
) + parent::getConfiguration();
}
public function getVerificationCode() {
if (!$this->getVerificationHash()) {
if ($this->verificationHash) {
throw new Exception(
pht(
'Verification code can not be regenerated after an invite is '.
'created.'));
}
$this->verificationCode = Filesystem::readRandomCharacters(16);
}
return $this->verificationCode;
}
public function save() {
if (!$this->getVerificationHash()) {
$hash = PhabricatorHash::digestForIndex($this->getVerificationCode());
$this->setVerificationHash($hash);
}
return parent::save();
}
}