From be63cb386b5ec72e9bb53ef6017e94761fb7959b Mon Sep 17 00:00:00 2001 From: epriestley Date: Tue, 24 Jul 2012 10:46:07 -0700 Subject: [PATCH] Remove AphrontWriteGuard from phabricator/ Summary: See D3051. Test Plan: Loaded some pages. Reviewers: btrahan, vrana Reviewed By: vrana CC: aran Maniphest Tasks: T1283 Differential Revision: https://secure.phabricator.com/D3052 --- src/__phutil_library_map__.php | 2 - .../AphrontScopedUnguardedWriteCapability.php | 28 -- src/aphront/writeguard/AphrontWriteGuard.php | 273 ------------------ 3 files changed, 303 deletions(-) delete mode 100644 src/aphront/writeguard/AphrontScopedUnguardedWriteCapability.php delete mode 100644 src/aphront/writeguard/AphrontWriteGuard.php diff --git a/src/__phutil_library_map__.php b/src/__phutil_library_map__.php index 9ff434381e..fc510b3eb9 100644 --- a/src/__phutil_library_map__.php +++ b/src/__phutil_library_map__.php @@ -98,7 +98,6 @@ phutil_register_library_map(array( 'AphrontRequestFailureView' => 'view/page/AphrontRequestFailureView.php', 'AphrontRequestTestCase' => 'aphront/__tests__/AphrontRequestTestCase.php', 'AphrontResponse' => 'aphront/response/AphrontResponse.php', - 'AphrontScopedUnguardedWriteCapability' => 'aphront/writeguard/AphrontScopedUnguardedWriteCapability.php', 'AphrontSideNavFilterView' => 'view/layout/AphrontSideNavFilterView.php', 'AphrontSideNavView' => 'view/layout/AphrontSideNavView.php', 'AphrontTableView' => 'view/control/AphrontTableView.php', @@ -108,7 +107,6 @@ phutil_register_library_map(array( 'AphrontUsageException' => 'aphront/exception/AphrontUsageException.php', 'AphrontView' => 'view/AphrontView.php', 'AphrontWebpageResponse' => 'aphront/response/AphrontWebpageResponse.php', - 'AphrontWriteGuard' => 'aphront/writeguard/AphrontWriteGuard.php', 'CelerityAPI' => 'infrastructure/celerity/CelerityAPI.php', 'CelerityResourceController' => 'infrastructure/celerity/CelerityResourceController.php', 'CelerityResourceGraph' => 'infrastructure/celerity/CelerityResourceGraph.php', diff --git a/src/aphront/writeguard/AphrontScopedUnguardedWriteCapability.php b/src/aphront/writeguard/AphrontScopedUnguardedWriteCapability.php deleted file mode 100644 index f4af8a0aff..0000000000 --- a/src/aphront/writeguard/AphrontScopedUnguardedWriteCapability.php +++ /dev/null @@ -1,28 +0,0 @@ -dispose(); - * - * Normally, you do not need to manage guards yourself -- the Aphront stack - * handles it for you. - * - * This class accepts a callback, which will be invoked when a write is - * attempted. The callback should validate the presence of a CSRF token in - * the request, or abort the request (e.g., by throwing an exception) if a - * valid token isn't present. - * - * @param callable CSRF callback. - * @return this - * @task manage - */ - public function __construct($callback) { - if (self::$instance) { - throw new Exception( - "An AphrontWriteGuard already exists. Dispose of the previous guard ". - "before creating a new one."); - } - if (self::$allowUnguardedWrites) { - throw new Exception( - "An AphrontWriteGuard is being created in a context which permits ". - "unguarded writes unconditionally. This is not allowed and indicates ". - "a serious error."); - } - $this->callback = $callback; - self::$instance = $this; - } - - - /** - * Dispose of the active write guard. You must call this method when you are - * done with a write guard. You do not normally need to call this yourself. - * - * @return void - * @task manage - */ - public function dispose() { - if ($this->allowDepth > 0) { - throw new Exception( - "Imbalanced AphrontWriteGuard: more beginUnguardedWrites() calls than ". - "endUnguardedWrites() calls."); - } - self::$instance = null; - } - - - /** - * Determine if there is an active write guard. - * - * @return bool - * @task manage - */ - public static function isGuardActive() { - return (bool)self::$instance; - } - - -/* -( Protecting Writes )-------------------------------------------------- */ - - - /** - * Declare intention to perform a write, validating that writes are allowed. - * You should call this method before executing a write whenever you implement - * a new storage engine where information can be permanently kept. - * - * Writes are permitted if: - * - * - The request has valid CSRF tokens. - * - Unguarded writes have been temporarily enabled by a call to - * @{method:beginUnguardedWrites}. - * - All write guarding has been disabled with - * @{method:allowDangerousUnguardedWrites}. - * - * If none of these conditions are true, this method will throw and prevent - * the write. - * - * @return void - * @task protect - */ - public static function willWrite() { - if (!self::$instance) { - if (!self::$allowUnguardedWrites) { - throw new Exception( - "Unguarded write! There must be an active AphrontWriteGuard to ". - "perform writes."); - } else { - // Unguarded writes are being allowed unconditionally. - return; - } - } - - $instance = self::$instance; - if ($instance->allowDepth == 0) { - call_user_func($instance->callback); - } - } - - -/* -( Disabling Write Protection )----------------------------------------- */ - - - /** - * Enter a scope which permits unguarded writes. This works like - * @{method:beginUnguardedWrites} but returns an object which will end - * the unguarded write scope when its __destruct() method is called. This - * is useful to more easily handle exceptions correctly in unguarded write - * blocks: - * - * // Restores the guard even if do_logging() throws. - * function unguarded_scope() { - * $unguarded = AphrontWriteGuard::beginScopedUnguardedWrites(); - * do_logging(); - * } - * - * @return AphrontScopedUnguardedWriteCapability Object which ends unguarded - * writes when it leaves scope. - * @task disable - */ - public static function beginScopedUnguardedWrites() { - self::beginUnguardedWrites(); - return new AphrontScopedUnguardedWriteCapability(); - } - - - /** - * Begin a block which permits unguarded writes. You should use this very - * sparingly, and only for things like logging where CSRF is not a concern. - * - * You must pair every call to @{method:beginUnguardedWrites} with a call to - * @{method:endUnguardedWrites}: - * - * AphrontWriteGuard::beginUnguardedWrites(); - * do_logging(); - * AphrontWriteGuard::endUnguardedWrites(); - * - * @return void - * @task disable - */ - public static function beginUnguardedWrites() { - if (!self::$instance) { - return; - } - self::$instance->allowDepth++; - } - - /** - * Declare that you have finished performing unguarded writes. You must - * call this exactly once for each call to @{method:beginUnguardedWrites}. - * - * @return void - * @task disable - */ - public static function endUnguardedWrites() { - if (!self::$instance) { - return; - } - if (self::$instance->allowDepth <= 0) { - throw new Exception( - "Imbalanced AphrontWriteGuard: more endUnguardedWrites() calls than ". - "beginUnguardedWrites() calls."); - } - self::$instance->allowDepth--; - } - - - /** - * Allow execution of unguarded writes. This is ONLY appropriate for use in - * script contexts or other contexts where you are guaranteed to never be - * vulnerable to CSRF concerns. Calling this method is EXTREMELY DANGEROUS - * if you do not understand the consequences. - * - * If you need to perform unguarded writes on an otherwise guarded workflow - * which is vulnerable to CSRF, use @{method:beginUnguardedWrites}. - * - * @return void - * @task disable - */ - public static function allowDangerousUnguardedWrites($allow) { - if (self::$instance) { - throw new Exception( - "You can not unconditionally disable AphrontWriteGuard by calling ". - "allowDangerousUnguardedWrites() while a write guard is active. Use ". - "beginUnguardedWrites() to temporarily allow unguarded writes."); - } - self::$allowUnguardedWrites = true; - } - - -/* -( Internals )---------------------------------------------------------- */ - - - /** - * When the object is destroyed, make sure @{method:dispose} was called. - * - * @task internal - */ - public function __destruct() { - if (isset(self::$instance)) { - throw new Exception( - "AphrontWriteGuard was not properly disposed of! Call dispose() on ". - "every AphrontWriteGuard object you instantiate."); - } - } -}