Chromium Code Reviews| OLD | NEW |
|---|---|
| (Empty) | |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | |
| 2 // Use of this source code is governed by a BSD-style license that can be | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 #ifndef EXTENSIONS_BROWSER_CONTENT_VERIFY_JOB_H_ | |
| 6 #define EXTENSIONS_BROWSER_CONTENT_VERIFY_JOB_H_ | |
| 7 | |
| 8 #include <string> | |
| 9 | |
| 10 #include "base/callback.h" | |
| 11 #include "base/memory/ref_counted.h" | |
| 12 #include "base/memory/scoped_ptr.h" | |
| 13 | |
| 14 namespace base { | |
| 15 class FilePath; | |
| 16 } | |
| 17 | |
| 18 namespace extensions { | |
| 19 | |
| 20 class ContentHashReader; | |
| 21 | |
| 22 // Objects of this class are responsible for verifying that the actual content | |
| 23 // read from an extension file matches an expected set of hashes. This class | |
| 24 // can be created on any thread but the rest of the methods should be called | |
| 25 // from only one thread. | |
|
Yoyo Zhou
2014/05/07 02:25:59
consider using a ThreadChecker
asargent_no_longer_on_chrome
2014/05/07 06:56:42
Good idea. Done.
| |
| 26 class ContentVerifyJob : public base::RefCountedThreadSafe<ContentVerifyJob> { | |
| 27 public: | |
| 28 enum FailureReason { | |
| 29 // No failure. | |
| 30 NONE, | |
| 31 | |
| 32 // Failed because there were no expected hashes. | |
| 33 NO_HASHES, | |
| 34 | |
| 35 // Some of the content read did not match the expected hash. | |
| 36 HASH_MISMATCH | |
| 37 }; | |
| 38 typedef base::Callback<void(FailureReason)> FailureCallback; | |
| 39 | |
| 40 // The |failure_callback| will be called at most once if there was a failure. | |
| 41 // | |
| 42 // IMPORTANT NOTE: this class is still a stub right now - in the future this | |
| 43 // constructor will also be passed information to let it lookup expected | |
| 44 // block hashes for the file being read. | |
| 45 ContentVerifyJob(const std::string& extension_id, | |
| 46 const FailureCallback& failure_callback); | |
| 47 | |
| 48 // This begins the process of getting expected hashes, so it should be called | |
| 49 // as early as possible. | |
| 50 void Start(); | |
| 51 | |
| 52 // Call this to add more bytes to verify. If at any point the read bytes | |
| 53 // don't match the expected hashes, this will dispatch the failure | |
| 54 // callback. The failure callback will only be run once even if more bytes | |
| 55 // are read. Make sure to call DoneReading so that any final bytes that were | |
| 56 // read that didn't align exactly on a block size boundary get their hash | |
| 57 // checked as well. | |
| 58 void BytesRead(int count, const char* data); | |
| 59 | |
| 60 // Call once when finished adding bytes via BytesRead. | |
| 61 void DoneReading(); | |
| 62 | |
| 63 class TestDelegate { | |
| 64 public: | |
| 65 // These methods will be called inside BytesRead/DoneReading respectively. | |
| 66 // If either return something other than NONE, then the failure callback | |
| 67 // will be dispatched with that reason. | |
| 68 virtual FailureReason BytesRead(const std::string& extension_id, | |
| 69 int count, | |
| 70 const char* data) = 0; | |
| 71 virtual FailureReason DoneReading(const std::string& extension_id) = 0; | |
| 72 }; | |
| 73 | |
| 74 static void SetDelegateForTests(TestDelegate* delegate); | |
| 75 | |
| 76 private: | |
| 77 DISALLOW_COPY_AND_ASSIGN(ContentVerifyJob); | |
| 78 | |
| 79 virtual ~ContentVerifyJob(); | |
| 80 friend class base::RefCountedThreadSafe<ContentVerifyJob>; | |
| 81 | |
| 82 void DispatchFailureCallback(FailureReason reason); | |
| 83 | |
| 84 // The id of the extension for the file being verified. | |
| 85 std::string extension_id_; | |
| 86 | |
| 87 // Called once if verification fails. | |
| 88 FailureCallback failure_callback_; | |
| 89 }; | |
| 90 | |
| 91 } // namespace extensions | |
| 92 | |
| 93 #endif // EXTENSIONS_BROWSER_CONTENT_VERIFY_JOB_H_ | |
| OLD | NEW |