Path: blob/master/src/applications/auth/storage/PhabricatorAuthSession.php
12256 views
<?php12final class PhabricatorAuthSession extends PhabricatorAuthDAO3implements PhabricatorPolicyInterface {45const TYPE_WEB = 'web';6const TYPE_CONDUIT = 'conduit';78const SESSION_DIGEST_KEY = 'session.digest';910protected $userPHID;11protected $type;12protected $sessionKey;13protected $sessionStart;14protected $sessionExpires;15protected $highSecurityUntil;16protected $isPartial;17protected $signedLegalpadDocuments;1819private $identityObject = self::ATTACHABLE;2021public static function newSessionDigest(PhutilOpaqueEnvelope $session_token) {22return PhabricatorHash::digestWithNamedKey(23$session_token->openEnvelope(),24self::SESSION_DIGEST_KEY);25}2627protected function getConfiguration() {28return array(29self::CONFIG_TIMESTAMPS => false,30self::CONFIG_AUX_PHID => true,31self::CONFIG_COLUMN_SCHEMA => array(32'type' => 'text32',33'sessionKey' => 'text64',34'sessionStart' => 'epoch',35'sessionExpires' => 'epoch',36'highSecurityUntil' => 'epoch?',37'isPartial' => 'bool',38'signedLegalpadDocuments' => 'bool',39),40self::CONFIG_KEY_SCHEMA => array(41'sessionKey' => array(42'columns' => array('sessionKey'),43'unique' => true,44),45'key_identity' => array(46'columns' => array('userPHID', 'type'),47),48'key_expires' => array(49'columns' => array('sessionExpires'),50),51),52) + parent::getConfiguration();53}5455public function getApplicationName() {56// This table predates the "Auth" application, and really all applications.57return 'user';58}5960public function getTableName() {61// This is a very old table with a nonstandard name.62return PhabricatorUser::SESSION_TABLE;63}6465public function attachIdentityObject($identity_object) {66$this->identityObject = $identity_object;67return $this;68}6970public function getIdentityObject() {71return $this->assertAttached($this->identityObject);72}7374public static function getSessionTypeTTL($session_type, $is_partial) {75switch ($session_type) {76case self::TYPE_WEB:77if ($is_partial) {78return phutil_units('30 minutes in seconds');79} else {80return phutil_units('30 days in seconds');81}82case self::TYPE_CONDUIT:83return phutil_units('24 hours in seconds');84default:85throw new Exception(pht('Unknown session type "%s".', $session_type));86}87}8889public function getPHIDType() {90return PhabricatorAuthSessionPHIDType::TYPECONST;91}9293public function isHighSecuritySession() {94$until = $this->getHighSecurityUntil();9596if (!$until) {97return false;98}99100$now = PhabricatorTime::getNow();101if ($until < $now) {102return false;103}104105return true;106}107108109/* -( PhabricatorPolicyInterface )----------------------------------------- */110111112public function getCapabilities() {113return array(114PhabricatorPolicyCapability::CAN_VIEW,115);116}117118public function getPolicy($capability) {119return PhabricatorPolicies::POLICY_NOONE;120}121122public function hasAutomaticCapability($capability, PhabricatorUser $viewer) {123if (!$viewer->getPHID()) {124return false;125}126127$object = $this->getIdentityObject();128if ($object instanceof PhabricatorUser) {129return ($object->getPHID() == $viewer->getPHID());130} else if ($object instanceof PhabricatorExternalAccount) {131return ($object->getUserPHID() == $viewer->getPHID());132}133134return false;135}136137public function describeAutomaticCapability($capability) {138return pht('A session is visible only to its owner.');139}140141}142143144