1.\" Copyright (c) 1995 David Nugent <davidn@blaze.net.au> 2.\" All rights reserved. 3.\" 4.\" Redistribution and use in source and binary forms, with or without 5.\" modification, is permitted provided that the following conditions 6.\" are met: 7.\" 1. Redistributions of source code must retain the above copyright 8.\" notice immediately at the beginning of the file, without modification, 9.\" this list of conditions, and the following disclaimer. 10.\" 2. Redistributions in binary form must reproduce the above copyright 11.\" notice, this list of conditions and the following disclaimer in the 12.\" documentation and/or other materials provided with the distribution. 13.\" 3. This work was done expressly for inclusion into FreeBSD. Other use 14.\" is permitted provided this notation is included. 15.\" 4. Absolutely no warranty of function or purpose is made by the author 16.\" David Nugent. 17.\" 5. Modifications may be freely made to this file providing the above 18.\" conditions are met. 19.\" 20.\" $FreeBSD$ 21.\" 22.Dd December 27, 1996 23.Os 24.Dt LOGIN_CAP 3 25.Sh NAME 26.Nm login_close , 27.Nm login_getcapbool , 28.Nm login_getcaplist , 29.Nm login_getcapnum , 30.Nm login_getcapstr , 31.Nm login_getcapsize , 32.Nm login_getcaptime , 33.Nm login_getclass , 34.Nm login_getclassbyname , 35.Nm login_getpwclass , 36.Nm login_getstyle , 37.Nm login_getuserclass , 38.Nm login_setcryptfmt 39.Nd "functions for accessing the login class capabilities database" 40.Sh LIBRARY 41.Lb libutil 42.Sh SYNOPSIS 43.In sys/types.h 44.In login_cap.h 45.Ft void 46.Fn login_close "login_cap_t *lc" 47.Ft login_cap_t * 48.Fn login_getclassbyname "const char *nam" "const struct passwd *pwd" 49.Ft login_cap_t * 50.Fn login_getclass "const char *nam" 51.Ft login_cap_t * 52.Fn login_getpwclass "const struct passwd *pwd" 53.Ft login_cap_t * 54.Fn login_getuserclass "const struct passwd *pwd" 55.Ft "const char *" 56.Fn login_getcapstr "login_cap_t *lc" "const char *cap" "const char *def" "const char *error" 57.Ft char ** 58.Fn login_getcaplist "login_cap_t *lc" "const char *cap" "const char *chars" 59.Ft "const char *" 60.Fn login_getpath "login_cap_t *lc" "const char *cap" "const char *error" 61.Ft rlim_t 62.Fn login_getcaptime "login_cap_t *lc" "const char *cap" "rlim_t def" "rlim_t error" 63.Ft rlim_t 64.Fn login_getcapnum "login_cap_t *lc" "const char *cap" "rlim_t def" "rlim_t error" 65.Ft rlim_t 66.Fn login_getcapsize "login_cap_t *lc" "const char *cap" "rlim_t def" "rlim_t error" 67.Ft int 68.Fn login_getcapbool "login_cap_t *lc" "const char *cap" "int def" 69.Ft "const char *" 70.Fn login_getstyle "login_cap_t *lc" "const char *style" "const char *auth" 71.Ft const char * 72.Fn login_setcryptfmt "login_cap_t *lc" "const char *def" "const char *error" 73.Sh DESCRIPTION 74These functions represent a programming interface to the login 75classes database provided in 76.Xr login.conf 5 . 77This database contains capabilities, attributes and default environment 78and accounting settings for users and programs running as specific users, 79as determined by the login class field within entries in 80.Pa /etc/master.passwd . 81.Pp 82Entries in 83.Xr login.conf 5 84consist of colon 85.Ql \&: 86separated fields, the first field in each record being one or more 87identifiers for the record (which must be unique for the entire database), 88each separated by a '|', and may optionally include a description as 89the last 'name'. 90Remaining fields in the record consist of keyword/data pairs. 91Long lines may be continued with a backslash within empty entries, 92with the second and subsequent lines optionally indented for readability. 93This is similar to the format used in 94.Xr termcap 5 , 95except that keywords are not limited to two significant characters, 96and are usually longer for improved readability. 97As with termcap entries, multiple records can be linked together 98(one record including another) using a field containing tc=<recordid>. 99The result is that the entire record referenced by <recordid> replaces 100the tc= field at the point at which it occurs. 101See 102.Xr getcap 3 103for further details on the format and use of a capabilities database. 104.Pp 105The 106.Nm login_cap 107interface provides a convenient means of retrieving login class 108records with all tc= references expanded. 109A program will typically call one of 110.Fn login_getclass , 111.Fn login_getpwclass , 112.Fn login_getuserclass 113or 114.Fn login_getclassbyname 115according to its requirements. 116Each of these functions returns a login capabilities structure, 117.Ft login_cap_t , 118which may subsequently be used to interrogate the database for 119specific values using the rest of the API. 120Once the login_cap_t is of no further use, the 121.Fn login_close 122function should be called to free all resources used. 123.Pp 124The structure of login_cap_t is defined in login_cap.h, as: 125.Bd -literal -offset indent 126typedef struct { 127 char *lc_class; 128 char *lc_cap; 129 char *lc_style; 130} login_cap_t; 131.Ed 132.Pp 133The 134.Ar lc_class 135member contains a pointer to the name of the login class 136retrieved. 137This may not necessarily be the same as the one requested, 138either directly via 139.Fn login_getclassbyname , 140indirectly via a user's login record using 141.Fn login_getpwclass , 142by class name using 143.Fn login_getclass , 144or 145.Fn login_getuserclass . 146If the referenced user has no login class specified in 147.Pa /etc/master.passwd , 148the class name is NULL or an empty string. 149If the class 150specified does not exist in the database, each of these 151functions will search for a record with an id of "default", 152with that name returned in the 153.Ar lc_class 154field. 155In addition, if the referenced user has a UID of 0 (normally, 156"root", although the user name is not considered) then 157.Fn login_getpwclass 158will search for a record with an id of "root" before it searches 159for the record with the id of "default". 160.Pp 161The 162.Ar lc_cap 163field is used internally by the library to contain the 164expanded login capabilities record. 165Programs with unusual requirements may wish to use this 166with the lower-level 167.Fn getcap 168style functions to access the record directly. 169.Pp 170The 171.Ar lc_style 172field is set by the 173.Fn login_getstyle 174function to the authorisation style, according to the requirements 175of the program handling a login itself. 176.Pp 177As noted above, the 178.Fn login_get*class 179functions return a login_cap_t object which is used to access 180the matching or default record in the capabilities database. 181The 182.Fn login_getclassbyname 183function accepts two arguments: the first one is the record identifier of the 184record to be retrieved, the second is an optional pointer to a 185.Li passwd 186structure. 187If the first 188.Ar name 189argument is NULL, an empty string, or a class that does not exist 190in the supplemental or system login class database, then the system 191.Em default 192record is returned instead. 193If the second 194.Ar pwd 195parameter is NULL, then only the system login class database is 196used. 197However, 198if the 199.Ar pwd 200parameter and the value of 201.Ar pwd->pw_dir 202are both not NULL, then the directory contained in 203.Ar pwd->pw_dir 204is searched for 205a login database file called ".login_conf", and capability records 206contained within it may override the system defaults. 207This scheme allows users to override some login settings from 208those in the system login class database by creating class records 209for their own private class with a record id of `me'. 210In the context of a 211.Em login , 212it should be noted that some options cannot by overridden by 213users for two reasons; many options, such as resource settings 214and default process priorities, require root privileges 215in order to take effect, and other fields in the user's file are 216not be consulted at all during the early phases of login for 217security or administrative reasons. 218See 219.Xr login.conf 5 220for more information on which settings a user is able to override. 221Typically, these are limited purely to the user's default login 222environment which might otherwise have been overridden in shell 223startup scripts in any case. 224The user's 225.Pa .login_conf 226merely provides a convenient way for a user to set up their preferred 227login environment before the shell is invoked on login. 228Note that access to the 229.Pa /etc/login.conf 230and 231.Pa .login_conf 232files will only be performed subject to the security checks documented in 233.Xr _secure_path 3 234for the uids 0 and 235.Ar pwd->pw_uid 236respectively. 237.Pp 238If the specified record is NULL, empty or does not exist, and the 239system has no "default" record available to fall back to, there is a 240memory allocation error or for some reason 241.Xr cgetent 3 242is unable to access the login capabilities database, this function 243returns NULL. 244.Pp 245The functions 246.Fn login_getpwclass , 247.Fn login_getclass 248and 249.Fn login_getuserclass 250retrieve the applicable login class record for the user's passwd 251entry or class name by calling 252.Fn login_getclassbyname . 253On failure, NULL is returned. 254The difference between these functions is that 255.Fn login_getuserclass 256includes the user's overriding 257.Pa .login_conf 258that exists in the user's home directory, and 259.Fn login_getpwclass 260and 261.Fn login_getclass 262restrict lookup only to the system login class database in 263.Pa /etc/login.conf . 264As explained earlier, 265.Fn login_getpwclass 266only differs from 267.Fn login_getclass 268in that it allows the default class for user 'root' as "root" 269if none has been specified in the password database. 270Otherwise, if the passwd pointer is NULL, or the user record 271has no login class, then the system "default" entry is retrieved. 272.Pp 273Once a program no longer wishes to use a login_cap_t object, 274.Fn login_close 275may be called to free all resources used by the login class. 276The 277.Fn login_close 278function may be passed a NULL pointer with no harmful side-effects. 279.Pp 280The remaining functions may be used to retrieve individual 281capability records. 282Each function takes a login_cap_t object as its first parameter, 283a capability tag as the second, and remaining parameters being 284default and error values that are returned if the capability is 285not found. 286The type of the additional parameters passed and returned depend 287on the 288.Em type 289of capability each deals with, be it a simple string, a list, 290a time value, a file or memory size value, a path (consisting of 291a colon-separated list of directories) or a boolean flag. 292The manpage for 293.Xr login.conf 5 294deals in specific tags and their type. 295.Pp 296Note that with all functions in this group, you should not call 297.Xr free 3 298on any pointers returned. 299Memory allocated during retrieval or processing of capability 300tags is automatically reused by subsequent calls to functions 301in this group, or deallocated on calling 302.Fn login_close . 303.Bl -tag -width "login_getcaplist()" 304.It Fn login_getcapstr 305This function returns a simple string capability. 306If the string is not found, then the value in 307.Ar def 308is returned as the default value, or if an error 309occurs, the value in the 310.Ar error 311parameter is returned. 312.It Fn login_getcaplist 313This function returns the value corresponding to the named 314capability tag as a list of values in a NULL terminated 315array. 316Within the login class database, some tags are of type 317.Em list , 318which consist of one or more comma- or space separated 319values. 320Usually, this function is not called directly from an 321application, but is used indirectly via 322.Fn login_getstyle . 323.It Fn login_getpath 324This function returns a list of directories separated by colons 325.Ql \&: . 326Capability tags for which this function is called consist of a list of 327directories separated by spaces. 328.It Fn login_getcaptime 329This function returns a 330.Em time value 331associated with a particular capability tag with the value expressed 332in seconds (the default), minutes, hours, days, weeks or (365 day) 333years or any combination of these. 334A suffix determines the units used: S for seconds, M for minutes, 335H for hours, D for days, W for weeks and Y for 365 day years. 336Case of the units suffix is ignored. 337.Pp 338Time values are normally used for setting resource, accounting and 339session limits. 340If supported by the operating system and compiler (which is true of 341.Fx ) , 342the value returned is a quad (long long), of type 343.Em rlim_t . 344A value "inf" or "infinity" may be used to express an infinite 345value, in which case RLIM_INFINITY is returned. 346.It Fn login_getcapnum 347This function returns a numeric value for a tag, expressed either as 348tag=<value> or the standard 349.Fn cgetnum 350format tag#<value>. 351The first format should be used in preference to the second, the 352second format is provided for compatibility and consistency with the 353.Xr getcap 3 354database format where numeric types use the 355.Ql \&# 356as the delimiter for numeric values. 357If in the first format, then the value given may be "inf" or 358"infinity" which results in a return value of RLIM_INFINITY. 359If the given capability tag cannot be found, the 360.Ar def 361parameter is returned, and if an error occurs, the 362.Ar error 363parameter is returned. 364.It Fn login_getcapsize 365.Fn login_getcapsize 366returns a value representing a size (typically, file or memory) 367which may be expressed as bytes (the default), 512 byte blocks, 368kilobytes, megabytes, gigabytes, and on systems that support the 369.Ar long long 370type, terabytes. 371The suffix used determines the units, and multiple values and 372units may be used in combination (e.g.\& 1m500k = 1.5 megabytes). 373A value with no suffix is interpreted as bytes, B as 512-byte 374blocks, K as kilobytes, M as megabytes, G as gigabytes and T as 375terabytes. 376Case is ignored. 377The error value is returned if there is a login capabilities database 378error, if an invalid suffix is used, or if a numeric value cannot be 379interpreted. 380.It Fn login_getcapbool 381This function returns a boolean value tied to a particular flag. 382It returns 0 if the given capability tag is not present or is 383negated by the presence of a "tag@" (See 384.Xr getcap 3 385for more information on boolean flags), and returns 1 if the tag 386is found. 387.It Fn login_getstyle 388This function is used by the login authorisation system to determine 389the style of login available in a particular case. 390The function accepts three parameters, the login_cap entry itself and 391two optional parameters, and authorisation type 'auth' and 'style', and 392applies these to determine the authorisation style that best suites 393these rules. 394.Bl -bullet 395.It 396If 'auth' is neither NULL nor an empty string, look for a tag of type 397"auth-<auth>" in the capability record. 398If not present, then look for the default tag "auth=". 399.It 400If no valid authorisation list was found from the previous step, then 401default to "passwd" as the authorisation list. 402.It 403If 'style' is not NULL or empty, look for it in the list of authorisation 404methods found from the previous step. 405If 'style' is NULL or an empty string, then default to "passwd" 406authorisation. 407.It 408If 'style' is found in the chosen list of authorisation methods, then 409return that, otherwise return NULL. 410.El 411.Pp 412This scheme allows the administrator to determine the types of 413authorisation methods accepted by the system, depending on the 414means by which the access occurs. 415For example, the administrator may require skey or kerberos as 416the authentication method used for access to the system via the 417network, and standard methods via direct dialup or console 418logins, significantly reducing the risk of password discovery 419by "snooping" network packets. 420.It Fn login_setcryptfmt 421The 422.Fn login_setcryptfmt 423function is used to set the 424.Xr crypt 3 425format using the 426.Ql passwd_format 427configuration entry. 428If no entry is found, 429.Fa def 430is taken to be used as the fallback. 431If calling 432.Xr crypt_set_format 3 433on the specifier fails, 434.Fa error 435is returned to indicate this. 436.El 437.Sh SEE ALSO 438.Xr crypt 3 , 439.Xr getcap 3 , 440.Xr login_class 3 , 441.Xr login.conf 5 , 442.Xr termcap 5 443