forked from shaba/openuds
Merge remote-tracking branch 'origin/v3.5'
This commit is contained in:
commit
9c6a72d3ac
@ -37,6 +37,7 @@ import typing
|
|||||||
class LocalLogger: # pylint: disable=too-few-public-methods
|
class LocalLogger: # pylint: disable=too-few-public-methods
|
||||||
linux = False
|
linux = False
|
||||||
windows = True
|
windows = True
|
||||||
|
serviceLogger = False
|
||||||
|
|
||||||
logger: typing.Optional[logging.Logger]
|
logger: typing.Optional[logging.Logger]
|
||||||
|
|
||||||
|
@ -366,17 +366,19 @@ class CommonService: # pylint: disable=too-many-instance-attributes
|
|||||||
'''
|
'''
|
||||||
hostName = platform.operations.getComputerName()
|
hostName = platform.operations.getComputerName()
|
||||||
|
|
||||||
if hostName.lower() == name.lower():
|
|
||||||
logger.info('Computer name is already {}'.format(hostName))
|
|
||||||
return
|
|
||||||
|
|
||||||
# Check for password change request for an user
|
# Check for password change request for an user
|
||||||
if userName and newPassword:
|
if userName and newPassword:
|
||||||
|
changed = True
|
||||||
logger.info('Setting password for configured user')
|
logger.info('Setting password for configured user')
|
||||||
try:
|
try:
|
||||||
platform.operations.changeUserPassword(userName, oldPassword or '', newPassword)
|
platform.operations.changeUserPassword(userName, oldPassword or '', newPassword)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
raise Exception('Could not change password for user {} (maybe invalid current password is configured at broker): {} '.format(userName, str(e)))
|
# Logs error, but continue renaming computer
|
||||||
|
logger.error('Could not change password for user {}: {}'.format(userName, e))
|
||||||
|
|
||||||
|
if hostName.lower() == name.lower():
|
||||||
|
logger.info('Computer name is already {}'.format(hostName))
|
||||||
|
return
|
||||||
|
|
||||||
if platform.operations.renameComputer(name):
|
if platform.operations.renameComputer(name):
|
||||||
self.reboot()
|
self.reboot()
|
||||||
|
@ -34,7 +34,8 @@ import os
|
|||||||
import tempfile
|
import tempfile
|
||||||
import typing
|
import typing
|
||||||
|
|
||||||
import servicemanager # pylint: disable=import-error
|
import servicemanager
|
||||||
|
from udsactor import service # pylint: disable=import-error
|
||||||
|
|
||||||
# Valid logging levels, from UDS Broker (uds.core.utils.log).
|
# Valid logging levels, from UDS Broker (uds.core.utils.log).
|
||||||
from .. import loglevel
|
from .. import loglevel
|
||||||
@ -42,6 +43,7 @@ from .. import loglevel
|
|||||||
class LocalLogger: # pylint: disable=too-few-public-methods
|
class LocalLogger: # pylint: disable=too-few-public-methods
|
||||||
linux = False
|
linux = False
|
||||||
windows = True
|
windows = True
|
||||||
|
serviceLogger = False
|
||||||
|
|
||||||
logger: typing.Optional[logging.Logger]
|
logger: typing.Optional[logging.Logger]
|
||||||
|
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
#!/usr/bin/env python3
|
#!/usr/bin/env python3 -s
|
||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
#
|
#
|
||||||
# Copyright (c) 2014-2021 Virtual Cable S.L.U.
|
# Copyright (c) 2014-2021 Virtual Cable S.L.U.
|
||||||
|
@ -198,6 +198,9 @@ class Users(DetailHandler):
|
|||||||
'staff_member',
|
'staff_member',
|
||||||
'is_admin',
|
'is_admin',
|
||||||
]
|
]
|
||||||
|
if self._params.get('name', '') == '':
|
||||||
|
raise RequestError(_('Username cannot be empty'))
|
||||||
|
|
||||||
if 'password' in self._params:
|
if 'password' in self._params:
|
||||||
valid_fields.append('password')
|
valid_fields.append('password')
|
||||||
self._params['password'] = cryptoManager().hash(self._params['password'])
|
self._params['password'] = cryptoManager().hash(self._params['password'])
|
||||||
@ -239,6 +242,8 @@ class Users(DetailHandler):
|
|||||||
raise RequestError(str(e))
|
raise RequestError(str(e))
|
||||||
except ValidationError as e:
|
except ValidationError as e:
|
||||||
raise RequestError(str(e.message))
|
raise RequestError(str(e.message))
|
||||||
|
except RequestError:
|
||||||
|
raise
|
||||||
except Exception:
|
except Exception:
|
||||||
logger.exception('Saving user')
|
logger.exception('Saving user')
|
||||||
raise self.invalidRequestException()
|
raise self.invalidRequestException()
|
||||||
@ -421,6 +426,8 @@ class Groups(DetailHandler):
|
|||||||
logger.debug('Meta any %s', meta_if_any)
|
logger.debug('Meta any %s', meta_if_any)
|
||||||
logger.debug('Pools: %s', pools)
|
logger.debug('Pools: %s', pools)
|
||||||
valid_fields = ['name', 'comments', 'state']
|
valid_fields = ['name', 'comments', 'state']
|
||||||
|
if self._params.get('name', '') == '':
|
||||||
|
raise RequestError(_('Group name is required'))
|
||||||
fields = self.readFieldsFromParams(valid_fields)
|
fields = self.readFieldsFromParams(valid_fields)
|
||||||
is_pattern = fields.get('name', '').find('pat:') == 0
|
is_pattern = fields.get('name', '').find('pat:') == 0
|
||||||
auth = parent.getInstance()
|
auth = parent.getInstance()
|
||||||
@ -463,6 +470,8 @@ class Groups(DetailHandler):
|
|||||||
raise RequestError(_('User already exists (duplicate key error)'))
|
raise RequestError(_('User already exists (duplicate key error)'))
|
||||||
except AuthenticatorException as e:
|
except AuthenticatorException as e:
|
||||||
raise RequestError(str(e))
|
raise RequestError(str(e))
|
||||||
|
except RequestError:
|
||||||
|
raise
|
||||||
except Exception:
|
except Exception:
|
||||||
logger.exception('Saving group')
|
logger.exception('Saving group')
|
||||||
raise self.invalidRequestException()
|
raise self.invalidRequestException()
|
||||||
|
5
ssh-tunnel/pam-http/.gitignore
vendored
5
ssh-tunnel/pam-http/.gitignore
vendored
@ -1,5 +0,0 @@
|
|||||||
CMakeCache.txt
|
|
||||||
CMakeFiles
|
|
||||||
*.cmake
|
|
||||||
Makefile
|
|
||||||
*.so
|
|
@ -1,5 +0,0 @@
|
|||||||
cmake_minimum_required(VERSION 2.8)
|
|
||||||
set(CMAKE_BUILD_TYPE Release)
|
|
||||||
project (UDS_PAM)
|
|
||||||
|
|
||||||
add_subdirectory(src)
|
|
@ -1,34 +0,0 @@
|
|||||||
# Very simple setup file
|
|
||||||
# We suppose that we already have pam develompent files & curl development files installed
|
|
||||||
set(pam_uds_SRCS
|
|
||||||
pam_uds.c
|
|
||||||
http.c
|
|
||||||
http.h
|
|
||||||
)
|
|
||||||
|
|
||||||
set(nss_uds_SRCS
|
|
||||||
shadow.c
|
|
||||||
passwd.c
|
|
||||||
group.c
|
|
||||||
http.c
|
|
||||||
http.h
|
|
||||||
)
|
|
||||||
|
|
||||||
add_library(pam_uds SHARED ${pam_uds_SRCS})
|
|
||||||
set_target_properties(pam_uds PROPERTIES
|
|
||||||
OUTPUT_NAME pam_uds
|
|
||||||
PREFIX ""
|
|
||||||
SUFFIX ".so"
|
|
||||||
)
|
|
||||||
target_link_libraries(pam_uds curl pam)
|
|
||||||
|
|
||||||
|
|
||||||
add_library(nss_uds SHARED ${nss_uds_SRCS})
|
|
||||||
|
|
||||||
set_target_properties(nss_uds PROPERTIES
|
|
||||||
OUTPUT_NAME nss_uds
|
|
||||||
PREFIX "lib"
|
|
||||||
)
|
|
||||||
# Remember, nss libs needs to have ".so.2" symlink to .so
|
|
||||||
|
|
||||||
target_link_libraries(nss_uds curl)
|
|
@ -1,42 +0,0 @@
|
|||||||
#define _GNU_SOURCE 1
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <nss.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <sys/types.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
#include <errno.h>
|
|
||||||
#include <ctype.h>
|
|
||||||
#include <grp.h>
|
|
||||||
|
|
||||||
|
|
||||||
enum nss_status _nss_uds_setgrent (void);
|
|
||||||
enum nss_status _nss_uds_endgrent (void);
|
|
||||||
enum nss_status _nss_uds_getgrent_r (struct group *gr,
|
|
||||||
char * buffer, size_t buflen,int * errnop);
|
|
||||||
enum nss_status _nss_uds_getgrnam_r (const char * name, struct group *gr,
|
|
||||||
char * buffer, size_t buflen,int *errnop);
|
|
||||||
enum nss_status _nss_uds_getgrgid_r (const gid_t gid, struct group *gr,
|
|
||||||
char * buffer, size_t buflen,int *errnop);
|
|
||||||
|
|
||||||
|
|
||||||
enum nss_status _nss_uds_setgrent (void) {
|
|
||||||
}
|
|
||||||
|
|
||||||
enum nss_status _nss_uds_endgrent (void) {
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
enum nss_status _nss_uds_getgrent_r (struct group *gr,
|
|
||||||
char * buffer, size_t buflen,int * errnop) {
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
enum nss_status _nss_uds_getgrnam_r (const char * name, struct group *gr,
|
|
||||||
char * buffer, size_t buflen,int *errnop) {
|
|
||||||
}
|
|
||||||
|
|
||||||
enum nss_status _nss_uds_getgrgid_r (const gid_t gid, struct group *gr,
|
|
||||||
char * buffer, size_t buflen,int *errnop) {
|
|
||||||
}
|
|
@ -1,138 +0,0 @@
|
|||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
#include <ctype.h>
|
|
||||||
|
|
||||||
#include <curl/curl.h>
|
|
||||||
#include <curl/easy.h>
|
|
||||||
|
|
||||||
#define DATASIZE 256
|
|
||||||
#define UID "uid"
|
|
||||||
#define NAME "name"
|
|
||||||
#define AUTHID "id"
|
|
||||||
#define AUTHPASS "pass"
|
|
||||||
|
|
||||||
struct OutputData {
|
|
||||||
char* buffer;
|
|
||||||
size_t size;
|
|
||||||
size_t pos;
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
static size_t authenticatorData(void *buffer, size_t size, size_t nmemb, void *userp) {
|
|
||||||
struct OutputData* data = (struct OutputData*)userp;
|
|
||||||
size_t realSize = size * nmemb;
|
|
||||||
if( data->pos + realSize >= data->size )
|
|
||||||
return 0;
|
|
||||||
memcpy( data->buffer + data->pos, buffer, realSize );
|
|
||||||
data->pos += realSize;
|
|
||||||
return realSize;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int getUrl(const char* url, char* buffer, size_t size ) {
|
|
||||||
CURL *curl = curl_easy_init();
|
|
||||||
CURLcode res = -1;
|
|
||||||
|
|
||||||
struct OutputData* data = malloc(sizeof(struct OutputData));
|
|
||||||
data->buffer = buffer;
|
|
||||||
data->size = size;
|
|
||||||
data->pos = 0;
|
|
||||||
|
|
||||||
if (!curl) return -1;
|
|
||||||
|
|
||||||
curl_easy_setopt(curl, CURLOPT_URL, url);
|
|
||||||
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, authenticatorData);
|
|
||||||
curl_easy_setopt(curl, CURLOPT_WRITEDATA, data );
|
|
||||||
/* provide no progress indicator */
|
|
||||||
curl_easy_setopt(curl, CURLOPT_NOPROGRESS, 1);
|
|
||||||
/* fail on HTTP errors */
|
|
||||||
curl_easy_setopt(curl, CURLOPT_FAILONERROR, 1);
|
|
||||||
|
|
||||||
curl_easy_setopt(curl, CURLOPT_RANDOM_FILE, "/dev/urandom");
|
|
||||||
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0);
|
|
||||||
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0 );
|
|
||||||
|
|
||||||
res = curl_easy_perform(curl);
|
|
||||||
|
|
||||||
cleanup:
|
|
||||||
curl_easy_cleanup(curl);
|
|
||||||
buffer[data->pos] = '\0';
|
|
||||||
free(data);
|
|
||||||
|
|
||||||
return res;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
int isValid(const char* str)
|
|
||||||
{
|
|
||||||
const int len = strnlen(str, DATASIZE);
|
|
||||||
int i;
|
|
||||||
for( i = 0; i < len; i++ ) {
|
|
||||||
if ( !isalnum(str[i]) && str[i] != '-' ) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
int httpAuthenticate(const char* username, const char* password, const char* authHost)
|
|
||||||
{
|
|
||||||
char* buffer = malloc(DATASIZE);
|
|
||||||
char* url = malloc(256);
|
|
||||||
int res;
|
|
||||||
|
|
||||||
/* Ensure username & passwords are valid */
|
|
||||||
if (!isValid(username) || !isValid(password)) {
|
|
||||||
return -1; /* no valid data, injecting? */
|
|
||||||
}
|
|
||||||
|
|
||||||
sprintf( url, "%s?%s=%s&%s=%s", authHost, AUTHID, username, AUTHPASS, password );
|
|
||||||
res = getUrl( url, buffer, DATASIZE );
|
|
||||||
free(url);
|
|
||||||
|
|
||||||
if( res == 0 && buffer[0] == '0' )
|
|
||||||
res = -1;
|
|
||||||
|
|
||||||
|
|
||||||
free(buffer);
|
|
||||||
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int getUserData( const char* host, const char* kind, const char* id, char* username, int* uid ) {
|
|
||||||
char* buffer = malloc(DATASIZE);
|
|
||||||
char* url = malloc(256);
|
|
||||||
int res;
|
|
||||||
|
|
||||||
*username = '\0';
|
|
||||||
*uid = -1;
|
|
||||||
|
|
||||||
sprintf( url, "%s?%s=%s", host, kind, id );
|
|
||||||
res = getUrl( url, buffer, DATASIZE );
|
|
||||||
free(url);
|
|
||||||
|
|
||||||
if( res == 0 ) {
|
|
||||||
if( *buffer == '*' )
|
|
||||||
res = -1;
|
|
||||||
else {
|
|
||||||
sscanf( buffer, "%d %s", uid, username );
|
|
||||||
if( *uid == -1 )
|
|
||||||
res = -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
free(buffer);
|
|
||||||
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
|
|
||||||
int getUID( const char* host, const char* name, char* username, int* uid ) {
|
|
||||||
return getUserData( host, UID, name, username, uid );
|
|
||||||
}
|
|
||||||
|
|
||||||
int getName( const char* host, int id, char* username, int* uid ) {
|
|
||||||
char tmp[32];
|
|
||||||
sprintf( tmp, "%d", id );
|
|
||||||
return getUserData( host, NAME, tmp, username, uid );
|
|
||||||
}
|
|
@ -1,13 +0,0 @@
|
|||||||
#ifndef __HTTP_H_DK__
|
|
||||||
#define __HTTP_H_DK__
|
|
||||||
|
|
||||||
|
|
||||||
int httpAuthenticate(const char* username, const char* password, const char* authHost);
|
|
||||||
|
|
||||||
int getUID( const char* host, const char* name, char* username, int* uid );
|
|
||||||
|
|
||||||
|
|
||||||
int getName( const char* host, int id, char* username, int* uid );
|
|
||||||
|
|
||||||
|
|
||||||
#endif
|
|
@ -1,109 +0,0 @@
|
|||||||
/* (c) 2020 Adolfo Gómez */
|
|
||||||
|
|
||||||
#include <features.h>
|
|
||||||
#include <syslog.h>
|
|
||||||
#include <stdarg.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <errno.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
|
|
||||||
#include "http.h"
|
|
||||||
|
|
||||||
#define PAM_SM_AUTH
|
|
||||||
#include <security/pam_modules.h>
|
|
||||||
#include <security/_pam_macros.h>
|
|
||||||
|
|
||||||
#define UDS_DEBUG 020 /* keep quiet about things */
|
|
||||||
#define UDS_QUIET 040 /* keep quiet about things */
|
|
||||||
|
|
||||||
/* some syslogging */
|
|
||||||
static void _log_err(int err, const char *format, ...)
|
|
||||||
{
|
|
||||||
va_list args;
|
|
||||||
|
|
||||||
va_start(args, format);
|
|
||||||
openlog("PAM-uds", LOG_CONS|LOG_PID, LOG_AUTH);
|
|
||||||
vsyslog(err, format, args);
|
|
||||||
va_end(args);
|
|
||||||
closelog();
|
|
||||||
}
|
|
||||||
|
|
||||||
static char baseUrl[128] = "";
|
|
||||||
|
|
||||||
static int _pam_parse(int flags, int argc, const char **argv)
|
|
||||||
{
|
|
||||||
int ctrl = 0;
|
|
||||||
|
|
||||||
/* does the appliction require quiet? */
|
|
||||||
if ((flags & PAM_SILENT) == PAM_SILENT)
|
|
||||||
ctrl |= UDS_QUIET;
|
|
||||||
|
|
||||||
/* step through arguments */
|
|
||||||
for (; argc-- > 0; ++argv)
|
|
||||||
{
|
|
||||||
if (!strcmp(*argv, "silent")) {
|
|
||||||
ctrl |= UDS_QUIET;
|
|
||||||
} else if (!strncmp(*argv,"base=",5)) {
|
|
||||||
strncpy(baseUrl,*argv+5,sizeof(baseUrl));
|
|
||||||
baseUrl[sizeof(baseUrl)-1] = '\0';
|
|
||||||
_log_err(LOG_ERR, "option base: %s", baseUrl);
|
|
||||||
} else {
|
|
||||||
_log_err(LOG_ERR, "unknown option; %s", *argv);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
D(("ctrl = %o", ctrl));
|
|
||||||
return ctrl;
|
|
||||||
}
|
|
||||||
|
|
||||||
/********************
|
|
||||||
* PAM
|
|
||||||
********************/
|
|
||||||
|
|
||||||
|
|
||||||
PAM_EXTERN int pam_sm_authenticate(pam_handle_t *pamh, int flags,
|
|
||||||
int argc, const char **argv)
|
|
||||||
{
|
|
||||||
const char *username;
|
|
||||||
const char* passwd;
|
|
||||||
int res;
|
|
||||||
|
|
||||||
int rv = PAM_SUCCESS, ctrl;
|
|
||||||
|
|
||||||
ctrl = _pam_parse(flags, argc, argv);
|
|
||||||
|
|
||||||
if (strlen(baseUrl) == 0)
|
|
||||||
{
|
|
||||||
_log_err(LOG_ERR, "Need a host for authentication" );
|
|
||||||
return PAM_AUTH_ERR;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (pam_get_user(pamh, &username, 0) != PAM_SUCCESS) {
|
|
||||||
_log_err( LOG_ERR, "Couldn't get username");
|
|
||||||
return PAM_AUTH_ERR;
|
|
||||||
}
|
|
||||||
|
|
||||||
if( pam_get_item(pamh, PAM_AUTHTOK, (const void **)&passwd) != PAM_SUCCESS ) {
|
|
||||||
_log_err( LOG_ERR, "Couldn't get password" );
|
|
||||||
return PAM_AUTH_ERR;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( (res = httpAuthenticate(username, passwd, baseUrl)) != 0 ) {
|
|
||||||
_log_err( LOG_ERR, "Failed to check credentials., base = %s, Result = %d", baseUrl, res );
|
|
||||||
rv = PAM_AUTH_ERR;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
rv = PAM_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
return rv;
|
|
||||||
}
|
|
||||||
|
|
||||||
PAM_EXTERN int pam_sm_setcred(pam_handle_t *pamh, int flags,
|
|
||||||
int argc, const char **argv)
|
|
||||||
{
|
|
||||||
return PAM_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
@ -1,113 +0,0 @@
|
|||||||
#define _GNU_SOURCE 1
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <stdarg.h>
|
|
||||||
#include <nss.h>
|
|
||||||
#include <pwd.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <sys/types.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
#include <errno.h>
|
|
||||||
#include <ctype.h>
|
|
||||||
#include <fcntl.h>
|
|
||||||
|
|
||||||
#include <syslog.h>
|
|
||||||
|
|
||||||
#include "http.h"
|
|
||||||
|
|
||||||
char baseUrl[256] = { '\0' };
|
|
||||||
|
|
||||||
enum nss_status _nss_uds_getpwuid_r(uid_t,struct passwd *,char *, size_t,int *);
|
|
||||||
enum nss_status _nss_uds_setpwent (void);
|
|
||||||
enum nss_status _nss_uds_endpwent (void);
|
|
||||||
enum nss_status _nss_uds_getpwnam_r(const char *,struct passwd *,char *,size_t,int *);
|
|
||||||
enum nss_status _nss_uds_getpwent_r(struct passwd *, char *, size_t,int *);
|
|
||||||
|
|
||||||
static enum nss_status p_search(FILE *f,const char *name,const uid_t uid,struct passwd *pw, int *errnop,char *buffer, size_t buflen);
|
|
||||||
|
|
||||||
|
|
||||||
static void read_config(char* host, size_t size) {
|
|
||||||
int n;
|
|
||||||
FILE* f = fopen("/etc/uds.conf", "r");
|
|
||||||
if( f != NULL ) {
|
|
||||||
fgets( host, size-1, f );
|
|
||||||
n = strlen(host) - 1;
|
|
||||||
if( host[n] == '\n' )
|
|
||||||
host[n] = '\0';
|
|
||||||
fclose(f);
|
|
||||||
} else {
|
|
||||||
host[0] = '\0';
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
enum nss_status _nss_uds_getpwuid_r(
|
|
||||||
uid_t uid,
|
|
||||||
struct passwd *result,
|
|
||||||
char *buf,
|
|
||||||
size_t buflen,
|
|
||||||
int *errnop
|
|
||||||
) {
|
|
||||||
char host[256];
|
|
||||||
char *dir;
|
|
||||||
read_config( host, sizeof(host) );
|
|
||||||
|
|
||||||
if (result == NULL || buflen < 128 || *host == '\0')
|
|
||||||
return NSS_STATUS_UNAVAIL;
|
|
||||||
|
|
||||||
*errnop = getName( host, uid, buf, &result->pw_uid );
|
|
||||||
|
|
||||||
if( *errnop != 0 )
|
|
||||||
return NSS_STATUS_NOTFOUND;
|
|
||||||
|
|
||||||
dir = buf + strlen(buf) + 1;
|
|
||||||
sprintf( dir, "/var/udstmp", buf );
|
|
||||||
result->pw_name = buf;
|
|
||||||
result->pw_passwd = "*"; // This is really not used in our environment :)
|
|
||||||
result->pw_gid = 65534; // Nogroup
|
|
||||||
result->pw_gecos = "bugoma";
|
|
||||||
result->pw_dir = dir;
|
|
||||||
result->pw_shell = "/bin/false";
|
|
||||||
return NSS_STATUS_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
enum nss_status _nss_uds_getpwnam_r(const char *name, struct passwd *result,
|
|
||||||
char *buf, size_t buflen, int *errnop) {
|
|
||||||
char host[256];
|
|
||||||
char *dir;
|
|
||||||
read_config( host, sizeof(host) );
|
|
||||||
|
|
||||||
if (result == NULL || buflen < 128 || *host == '\0')
|
|
||||||
return NSS_STATUS_UNAVAIL;
|
|
||||||
|
|
||||||
*errnop = getUID( host, name, buf, &result->pw_uid );
|
|
||||||
|
|
||||||
if( *errnop != 0 )
|
|
||||||
return NSS_STATUS_NOTFOUND;
|
|
||||||
|
|
||||||
dir = buf + strlen(buf) + 1;
|
|
||||||
strcpy( dir, "/var/udstmp");
|
|
||||||
result->pw_name = buf;
|
|
||||||
result->pw_passwd = "*"; // This is really not used in our environment :)
|
|
||||||
result->pw_gid = 65534; // Nogroup
|
|
||||||
result->pw_gecos = "bugoma";
|
|
||||||
result->pw_dir = dir;
|
|
||||||
result->pw_shell = "/bin/false";
|
|
||||||
return NSS_STATUS_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
enum nss_status _nss_uds_setpwent (void) {
|
|
||||||
|
|
||||||
return NSS_STATUS_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
enum nss_status _nss_uds_endpwent (void) {
|
|
||||||
return NSS_STATUS_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
enum nss_status _nss_uds_getpwent_r (struct passwd *pw,
|
|
||||||
char * buffer, size_t buflen,int * errnop) {
|
|
||||||
return NSS_STATUS_UNAVAIL;
|
|
||||||
}
|
|
||||||
|
|
@ -1,49 +0,0 @@
|
|||||||
/*
|
|
||||||
Copyright (C) 2001,2002 Bernhard R. Link <brlink@debian.org>
|
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
|
||||||
it under the terms of the GNU General Public License version 2 as
|
|
||||||
published by the Free Software Foundation.
|
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
GNU General Public License for more details.
|
|
||||||
|
|
||||||
Please tell me, if you find errors or mistakes.
|
|
||||||
|
|
||||||
Based on parts of the GNU C Library:
|
|
||||||
|
|
||||||
Common code for file-based database parsers in nss_files module.
|
|
||||||
Copyright (C) 1996, 1997, 1998, 1999, 2000 Free Software Foundation, Inc.
|
|
||||||
This file is part of the GNU C Library.
|
|
||||||
|
|
||||||
The GNU C Library is free software; you can redistribute it and/or
|
|
||||||
modify it under the terms of the GNU Lesser General Public
|
|
||||||
License as published by the Free Software Foundation; either
|
|
||||||
version 2.1 of the License, or (at your option) any later version.
|
|
||||||
|
|
||||||
The GNU C Library is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
Lesser General Public License for more details.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define _GNU_SOURCE 1
|
|
||||||
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <nss.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <shadow.h>
|
|
||||||
#include <time.h>
|
|
||||||
#include <sys/types.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
#include <errno.h>
|
|
||||||
#include <ctype.h>
|
|
||||||
|
|
||||||
|
|
||||||
enum nss_status _nss_uds_getspnam_r (const char *name, struct spwd *spw,
|
|
||||||
char *buffer, size_t buflen,int * errnop)
|
|
||||||
{
|
|
||||||
}
|
|
@ -1,29 +0,0 @@
|
|||||||
/*
|
|
||||||
* test.c
|
|
||||||
*
|
|
||||||
* Created on: Jan 4, 2012
|
|
||||||
* Author: dkmaster
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include "http.h"
|
|
||||||
|
|
||||||
int main(int argc, char** argv)
|
|
||||||
{
|
|
||||||
int id;
|
|
||||||
char username[128];
|
|
||||||
const char* baseUrl = "http://172.27.0.1:8000/pam";
|
|
||||||
|
|
||||||
|
|
||||||
printf("Authenticate: %d\n", httpAuthenticate("pepito", "juanito", baseUrl));
|
|
||||||
|
|
||||||
int res = getUID(baseUrl,"pepito", username, &id);
|
|
||||||
printf("GetUID:res: %d, username: %s, id: %d\n", res, username, id);
|
|
||||||
|
|
||||||
*username = '\0';
|
|
||||||
res = getName(baseUrl, 10000, username, &id);
|
|
||||||
printf("GetName:res: %d, username: %s, id: %d\n", res, username, id);
|
|
||||||
|
|
||||||
}
|
|
Loading…
Reference in New Issue
Block a user