Skip to content

Commit 58ff948

Browse files
authored
Merge pull request #45 from mathstuf/ci-no-warnings
api: make updating a key safer
2 parents 15dfd6f + 7441ec5 commit 58ff948

File tree

4 files changed

+68
-7
lines changed

4 files changed

+68
-7
lines changed

src/api.rs

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -533,12 +533,22 @@ impl Key {
533533
.map(Self::new_impl)
534534
}
535535

536+
/// Determine whether the key is of a specific implementation or not.
537+
pub fn is_keytype<K>(&self) -> Result<bool>
538+
where
539+
K: KeyType,
540+
{
541+
let desc = self.description()?;
542+
Ok(desc.type_ == K::name())
543+
}
544+
536545
/// Update the payload in the key.
537-
pub fn update<D>(&mut self, data: D) -> Result<()>
546+
pub fn update<K, P>(&mut self, payload: P) -> Result<()>
538547
where
539-
D: AsRef<[u8]>,
548+
K: KeyType,
549+
P: Borrow<K::Payload>,
540550
{
541-
keyctl_update(self.id, data.as_ref())
551+
keyctl_update(self.id, &payload.borrow().payload())
542552
}
543553

544554
/// Revokes the key. Requires `write` permission on the key.

src/tests/keytype.rs

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
// Copyright (c) 2020, Ben Boeckel
2+
// All rights reserved.
3+
//
4+
// Redistribution and use in source and binary forms, with or without modification,
5+
// are permitted provided that the following conditions are met:
6+
//
7+
// * Redistributions of source code must retain the above copyright notice,
8+
// this list of conditions and the following disclaimer.
9+
// * Redistributions in binary form must reproduce the above copyright notice,
10+
// this list of conditions and the following disclaimer in the documentation
11+
// and/or other materials provided with the distribution.
12+
// * Neither the name of this project nor the names of its contributors
13+
// may be used to endorse or promote products derived from this software
14+
// without specific prior written permission.
15+
//
16+
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
17+
// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18+
// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19+
// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
20+
// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21+
// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22+
// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
23+
// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24+
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25+
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26+
27+
use crate::keytypes::{Keyring, User};
28+
29+
use super::utils;
30+
31+
#[test]
32+
fn test_keyring_is_keytype() {
33+
let keyring = utils::new_test_keyring();
34+
let key = utils::keyring_as_key(&keyring);
35+
36+
assert!(!key.is_keytype::<User>().unwrap());
37+
assert!(key.is_keytype::<Keyring>().unwrap());
38+
}
39+
40+
#[test]
41+
fn test_key_is_keytype() {
42+
let mut keyring = utils::new_test_keyring();
43+
let payload = &b"payload"[..];
44+
let key = keyring
45+
.add_key::<User, _, _>("test_key_is_keytype", payload)
46+
.unwrap();
47+
48+
assert!(key.is_keytype::<User>().unwrap());
49+
assert!(!key.is_keytype::<Keyring>().unwrap());
50+
}

src/tests/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ mod clear;
3333
mod describe;
3434
mod instantiate;
3535
mod invalidate;
36+
mod keytype;
3637
mod link;
3738
mod newring;
3839
mod permitting;

src/tests/update.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ fn keyring() {
3434
let mut key = utils::keyring_as_key(&keyring);
3535

3636
let payload = &b"payload"[..];
37-
let err = key.update(payload).unwrap_err();
37+
let err = key.update::<User, _>(payload).unwrap_err();
3838
assert_eq!(err, errno::Errno(libc::EOPNOTSUPP));
3939
}
4040

@@ -43,7 +43,7 @@ fn invalid_key() {
4343
let mut key = utils::invalid_key();
4444

4545
let payload = &b"payload"[..];
46-
let err = key.update(payload).unwrap_err();
46+
let err = key.update::<User, _>(payload).unwrap_err();
4747
assert_eq!(err, errno::Errno(libc::EINVAL));
4848
}
4949

@@ -59,7 +59,7 @@ fn unlinked_key() {
5959
utils::wait_for_key_gc(&key);
6060

6161
let payload = &b"payload"[..];
62-
let err = key.update(payload).unwrap_err();
62+
let err = key.update::<User, _>(payload).unwrap_err();
6363
assert_eq!(err, errno::Errno(libc::ENOKEY));
6464
}
6565

@@ -73,7 +73,7 @@ fn user_key() {
7373
assert_eq!(payload, actual_payload.as_slice());
7474

7575
let payload = &b"updated_payload"[..];
76-
key.update(payload).unwrap();
76+
key.update::<User, _>(payload).unwrap();
7777

7878
let actual_payload = key.read().unwrap();
7979
assert_eq!(payload, actual_payload.as_slice());

0 commit comments

Comments
 (0)