8 releases (breaking)

0.8.0 May 18, 2024
0.7.0 Apr 24, 2024
0.6.0 Feb 17, 2024
0.5.0 Aug 22, 2023
0.1.0 Jun 9, 2019

#210 in Database interfaces

Download history 5448/week @ 2024-09-07 6165/week @ 2024-09-14 5869/week @ 2024-09-21 6239/week @ 2024-09-28 6466/week @ 2024-10-05 6850/week @ 2024-10-12 6706/week @ 2024-10-19 6694/week @ 2024-10-26 7230/week @ 2024-11-02 6086/week @ 2024-11-09 6792/week @ 2024-11-16 5736/week @ 2024-11-23 6939/week @ 2024-11-30 6616/week @ 2024-12-07 6484/week @ 2024-12-14 1214/week @ 2024-12-21

21,907 downloads per month
Used in 2 crates

LGPL-3.0

38KB
823 lines

libnss-rs

Rust bindings for creating libnss modules.

Currently supports the following databases:

  • passwd
  • shadow
  • group
  • hosts

Getting started

  • Create a new library

    cargo new nss_example --lib
    
  • Change library type to cdylib in your Cargo.toml

    [lib]
    name = "nss_example"
    crate-type = [ "cdylib" ]
    

    *** NOTE *** The name of the crate itself is not important, however the library itself must follow the nss_xxx pattern.

  • Add libnss to your Cargo.toml

    [dependencies]
    libc = "0.2.0"
    libnss = "0.8.0"
    
  • Implement a passwd database

    use libnss::passwd::{PasswdHooks, Passwd};
    use libnss::libnss_passwd_hooks;
    
    struct ExamplePasswd;
    libnss_passwd_hooks!(example, ExamplePasswd);
    

    It is important that the first param of libnss_passwd_hooks is the name of your final library libnss_example.so.2

    impl PasswdHooks for HardcodedPasswd {
        fn get_all_entries() -> Vec<Passwd> {
            vec![
                Passwd {
                    name: "test".to_string(),
                    passwd: "x".to_string(),
                    uid: 1005,
                    gid: 1005,
                    gecos: "Test Account".to_string(),
                    dir: "/home/test".to_string(),
                    shell: "/bin/bash".to_string(),
                }
            ]
        }
    
        fn get_entry_by_uid(uid: libc::uid_t) -> Option<Passwd> {
            if uid == 1005 {
                return Some(Passwd {
                    name: "test".to_string(),
                    passwd: "x".to_string(),
                    uid: 1005,
                    gid: 1005,
                    gecos: "Test Account".to_string(),
                    dir: "/home/test".to_string(),
                    shell: "/bin/bash".to_string(),
                });
            }
    
            None
        }
    
        fn get_entry_by_name(name: String) -> Option<Passwd> {
            if name == "test" {
                return Some(Passwd {
                    name: "test".to_string(),
                    passwd: "x".to_string(),
                    uid: 1005,
                    gid: 1005,
                    gecos: "Test Account".to_string(),
                    dir: "/home/test".to_string(),
                    shell: "/bin/bash".to_string(),
                });
            }
    
            None
        }
    }
    
  • Build

    cargo build --release
    
  • Install the library

    cd target/release
    cp libnss_example.so libnss_example.so.2
    sudo install -m 0644 libnss_example.so.2 /lib
    sudo /sbin/ldconfig -n /lib /usr/lib
    
  • Enable your nss module in /etc/nsswitch.conf eg:

    passwd:         example files systemd
    

    The name in here must follow the final library name libnss_example.so.2

  • Look at the examples for more information

Dependencies

~56KB