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# $FreeBSD: stable/11/etc/pam.d/convert.pl 330449 2018-03-05 07:26:05Z eadler $
38#
39
40use strict;
41use Fcntl;
42use vars qw(%SERVICES);
43
44MAIN:{
45    my $line;
46    my $service;
47    my $version;
48    my $type;
49    local *FILE;
50
51    while (<>) {
52	chomp();
53	s/\s*$//;
54	next unless m/^(\#*)(\w+)\s+(auth|account|session|password)\s+(\S.*)$/;
55	$line = $1.$3;
56	$line .= "\t" x ((16 - length($line) + 7) / 8);
57	$line .= $4;
58	push(@{$SERVICES{$2}->{$3}}, $line);
59    }
60
61    foreach $service (keys(%SERVICES)) {
62	$version = '$' . 'FreeBSD' . '$';
63	if (sysopen(FILE, $service, O_RDONLY)) {
64		while (<FILE>) {
65			next unless (m/(\$[F]reeBSD.*?\$)/);
66			$version = $1;
67			last;
68		}
69		close(FILE);
70	}
71	sysopen(FILE, $service, O_RDWR|O_CREAT|O_TRUNC)
72	    or die("$service: $!\n");
73	print(FILE "#\n");
74	print(FILE "# $version\n");
75	print(FILE "#\n");
76	print(FILE "# PAM configuration for the \"$service\" service\n");
77	print(FILE "#\n");
78	foreach $type (qw(auth account session password)) {
79	    next unless exists($SERVICES{$service}->{$type});
80	    print(FILE "\n");
81	    print(FILE "# $type\n");
82	    print(FILE join("\n", @{$SERVICES{$service}->{$type}}, ""));
83	}
84	close(FILE);
85	warn("$service\n");
86    }
87
88    exit(0);
89}
90