1#!/usr/bin/perl -w
2#-
3# SPDX-License-Identifier: BSD-3-Clause
4#
5# Copyright (c) 2001,2002 Networks Associates Technologies, Inc.
6# All rights reserved.
7#
8# This software was developed for the FreeBSD Project by ThinkSec AS and
9# NAI Labs, the Security Research Division of Network Associates, Inc.
10# under DARPA/SPAWAR contract N66001-01-C-8035 ("CBOSS"), as part of the
11# DARPA CHATS research program.
12#
13# Redistribution and use in source and binary forms, with or without
14# modification, are permitted provided that the following conditions
15# are met:
16# 1. Redistributions of source code must retain the above copyright
17#    notice, this list of conditions and the following disclaimer.
18# 2. Redistributions in binary form must reproduce the above copyright
19#    notice, this list of conditions and the following disclaimer in the
20#    documentation and/or other materials provided with the distribution.
21# 3. The name of the author may not be used to endorse or promote
22#    products derived from this software without specific prior written
23#    permission.
24#
25# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
26# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
27# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
28# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
29# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
30# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
31# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
32# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
33# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
34# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
35# SUCH DAMAGE.
36#
37#
38
39use strict;
40use Fcntl;
41use vars qw(%SERVICES);
42
43MAIN:{
44    my $line;
45    my $service;
46    my $version;
47    my $type;
48    local *FILE;
49
50    while (<>) {
51	chomp();
52	s/\s*$//;
53	next unless m/^(\#*)(\w+)\s+(auth|account|session|password)\s+(\S.*)$/;
54	$line = $1.$3;
55	$line .= "\t" x ((16 - length($line) + 7) / 8);
56	$line .= $4;
57	push(@{$SERVICES{$2}->{$3}}, $line);
58    }
59
60    foreach $service (keys(%SERVICES)) {
61	$version = '$' . 'FreeBSD' . '$';
62	if (sysopen(FILE, $service, O_RDONLY)) {
63		while (<FILE>) {
64			next unless (m/(\$[F]reeBSD.*?\$)/);
65			$version = $1;
66			last;
67		}
68		close(FILE);
69	}
70	sysopen(FILE, $service, O_RDWR|O_CREAT|O_TRUNC)
71	    or die("$service: $!\n");
72	print(FILE "#\n");
73	print(FILE "# $version\n");
74	print(FILE "#\n");
75	print(FILE "# PAM configuration for the \"$service\" service\n");
76	print(FILE "#\n");
77	foreach $type (qw(auth account session password)) {
78	    next unless exists($SERVICES{$service}->{$type});
79	    print(FILE "\n");
80	    print(FILE "# $type\n");
81	    print(FILE join("\n", @{$SERVICES{$service}->{$type}}, ""));
82	}
83	close(FILE);
84	warn("$service\n");
85    }
86
87    exit(0);
88}
89