A2osX/SBIN/LOGIN.S.txt
2019-04-26 17:07:22 +02:00

500 lines
8.6 KiB
Plaintext
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

NEW
AUTO 3,1
.LIST OFF
.OP 65C02
.OR $2000
.TF SBIN/LOGIN
*--------------------------------------
.INB INC/MACROS.I
.INB INC/A2OSX.I
.INB INC/KERNEL.I
.INB INC/MLI.I
.INB INC/LIBCRYPT.I
*--------------------------------------
.DUMMY
.OR ZPBIN
ZS.START
ZPUsrID .BS 1
ZPShellPtr .BS 2
ZPRetryCnt .BS 1
ZPbValidUser .BS 1
ZPhGetLine .BS 1
ZPGetLinePtr .BS 2
ZPbGetLineSecret .BS 1
ZPGetLineLen .BS 1
ZPGetLineMax .BS 1
ZPhSID .BS 1
ZPhFile .BS 1
ZPStrPtr .BS 2
ZS.END
.ED
*--------------------------------------
* File Header (16 Bytes)
*--------------------------------------
CS.START cld
jmp (.1,x)
.DA #$61 6502,Level 1 (65c02)
.DA #1 BIN Layout Version 1
.DA #S.PS.F.EVENT S.PS.F
.DA #0
.DA CS.END-CS.START Code Size (without Constants)
.DA DS.END-DS.START Data SegmentSize
.DA #64 Stack Size
.DA #ZS.END-ZS.START Zero Page Size
.DA 0
*--------------------------------------
* Relocation Table
*--------------------------------------
.1 .DA CS.INIT
.DA CS.RUN
.DA CS.DOEVENT
.DA CS.QUIT
L.MSG.NOAUTH .DA MSG.NOAUTH
L.LIBCRYPT .DA LIBCRYPT
L.MSG.LOGIN .DA MSG.LOGIN
L.MSG.PASSWORD .DA MSG.PASSWORD
L.MSG.BAD .DA MSG.BAD
L.MSG.CRLF .DA MSG.CRLF
L.MSG.BS .DA MSG.BS
L.SESSION.ROOT .DA SESSION.ROOT
L.ETCISSUE .DA ETCISSUE
L.ETCMOTD .DA ETCMOTD
L.SHELL .DA SHELL
.DA 0
*--------------------------------------
CS.INIT clc
CS.INIT.RTS rts
*--------------------------------------
CS.RUN >LDYAI 256
>SYSCALL getmem
bcs CS.INIT.RTS
>STYA ZPGetLinePtr
stx ZPhGetLine
>LDYA L.ETCISSUE
jsr CS.RUN.DUMPFILE
>PUSHW pData PW
lda #0
>SYSCALL GetPWUID
bcc CS.RUN.AUTH
jmp CS.RUN.NOAUTH
*--------------------------------------
CS.RUN.AUTH >LDYA L.LIBCRYPT
>SYSCALL LoadLib
bcs CS.INIT.RTS
sta hLIBCRYPT
lda #3
sta ZPRetryCnt
.1 >PUSHBI 0
>LDYA L.MSG.LOGIN
>SYSCALL printf
bcs .9
lda #16
clc
jsr CS.RUN.GetLine
bcs .9
>PUSHW pData
>LDYA ZPGetLinePtr
>SYSCALL GetPWName
ror ZPbValidUser
>PUSHBI 0
>LDYA L.MSG.PASSWORD
>SYSCALL printf
bcs .9
lda #128
sec
jsr CS.RUN.GetLine
bcs .9
>PUSHBI 0
>LDYA L.MSG.CRLF
>SYSCALL printf
bcs .9
jsr CS.RUN.CHECKPWD
bcc CS.RUN.LOGIN
>PUSHBI 0
>LDYA L.MSG.BAD
>SYSCALL printf
bcs .9
dec ZPRetryCnt
bne .1
lda #E.IUSR
* sec
.9 rts
*--------------------------------------
CS.RUN.CHECKPWD rol ZPbValidUser
bcs CS.RUN.CHECK.9
>PUSHW ZPGetlinePtr
>PUSHW ZPGetlinePtr
>LIBCALL hLIBCRYPT,LIBCRYPT.MD5
>PUSHEA.G PW+S.PW.PASSWD
>LDYA ZPGetlinePtr
>SYSCALL strcmp
CS.RUN.CHECK.9 rts
*--------------------------------------
CS.RUN.LOGIN jsr CS.RUN.SetUserSession
bcc CS.RUN.EXEC
CS.RUN.LOGIN.9 rts
*--------------------------------------
CS.RUN.NOAUTH >PUSHBI 0
>LDYA L.MSG.NOAUTH
>SYSCALL printf
bcs CS.RUN.CHECK.9
jsr CS.RUN.SetRootSession
bcs CS.RUN.LOGIN.9
CS.RUN.EXEC ldx #1
.1 lda S.Table.hSession-1,x
beq .2
inx
cpx #K.USR.MAX+1
bne .1
lda #E.OOH
* sec
rts
.2 stx ZPUsrID
txa
ldy #S.PS.hSID
sta (pPS),y
lda ZPhSID
ldx ZPUsrID
sta S.Table.hSession-1,x
ldy #S.PS.hStdIn
lda (pPS),y
sta S.Table.hFILE-1,x
>LDYA L.ETCMOTD
jsr CS.RUN.DumpFile
>PUSHBI S.PS.F.HOLD
>LDYA L.SHELL
>SYSCALL ExecL
bcs .9
>SLEEP
ldx ZPUsrID
lda S.Table.hSession-1,x
stz S.Table.hSession-1,x
stz S.Table.hFILE-1,x
>SYSCALL freemem
.9 rts
*--------------------------------------
CS.RUN.SetRootSession
>LDYA L.SESSION.ROOT
>STYA ZPStrPtr
>LDYAI SESSION.ROOT.Size
>SYSCALL getmem
bcs .9
>STYA pSession
stx ZPhSID
ldy #SESSION.ROOT.Size-1
.1 lda (ZPStrPtr),y
sta (pSession),y
dey
bpl .1
* clc
.9 rts
*--------------------------------------
CS.RUN.SetUserSession
ldx #S.SESSION.NAME P+UID+GID
ldy #S.PW.NAME-1
.1 inx
iny
lda (pData),y
bne .1 NAME len
inx
ldy #S.PW.GECOS-1
.2 inx
iny
lda (pData),y
bne .2 GECOS len
inx
ldy #S.PW.DIR-1
.3 inx
iny
lda (pData),y
bne .3 DIR len
inx
ldy #S.PW.SHELL-1
.4 inx
iny
lda (pData),y
bne .4 SHELL len
txa
tay
lda #0
>SYSCALL getmem
bcs .9
>STYA pSession
>STYA ZPStrPtr
stx ZPhSID
* clc
ldy #S.PW.GID
lda (pData),y
tax
bne .5
sec
.5 ldy #S.PW.UID
lda (pData),y
bne .6
sec
.6 lda #0
ror
jsr CS.RUN.AddByte PRIV
lda (pData),y
jsr CS.RUN.AddByte UID
txa
jsr CS.RUN.AddByte GID
ldy #S.PW.NAME
jsr CS.RUN.AddStr
ldy #S.PW.GECOS
jsr CS.RUN.AddStr
ldy #S.PW.DIR
jsr CS.RUN.AddStr
ldy #S.PW.SHELL
jsr CS.RUN.AddStr
lda #0
jsr CS.RUN.AddByte
clc
.9 rts
*--------------------------------------
CS.RUN.AddStr lda (pData),y
jsr CS.RUN.AddByte
iny
tax
bne CS.RUN.AddStr
rts
*--------------------------------------
CS.RUN.AddByte sta (ZPStrPtr)
inc ZPStrPtr
bne .8
inc ZPStrPtr+1
.8 rts
*--------------------------------------
CS.RUN.GetLine sta ZPGetLineMax
ror ZPbGetLineSecret
stz ZPGetLineLen
.1 >SYSCALL getchar
bcs .9
cmp #C.SPACE
bcc .2
ldy ZPGetLineLen
cpy ZPGetLineMax
beq .1
sta (ZPGetLinePtr),y
iny
sty ZPGetLineLen
bit ZPbGetLineSecret
bmi .1
>SYSCALL putchar
bra .1
.2 cmp #3 Ctrl-C
beq .9
cmp #C.CR
beq .8
cmp #C.BS
bne .1
ldy ZPGetLineLen
beq .1
dec ZPGetLineLen
bit ZPbGetLineSecret
bmi .1
>PUSHBI 0
>LDYA L.MSG.BS
>SYSCALL printf
bra .1
.8 ldy ZPGetLineLen
lda #0
sta (ZPGetLinePtr),y
clc
.9 rts
*--------------------------------------
CS.RUN.DumpFile pha
>PUSHWI 0 Aux type
>PUSHBI S.FI.T.TXT
>PUSHBI O.RDONLY+O.TEXT
pla
>SYSCALL FOpen
bcs .9
stx ZPhFile
.1 >PUSHWI 256
>PUSHW ZPGetLinePtr
lda ZPhFile
>SYSCALL fgets
bcs .8
>LDYA ZPGetLinePtr
>SYSCALL ExpandStr
bcc .2
php
pha
jsr .8
pla
plp
rts
.2 phx
>STYA ZPStrPtr
ldy #$ff
.3 iny
lda (ZPStrPtr),y
bne .3
lda #C.CR
sta (ZPStrPtr),y
iny
lda #C.LF
sta (ZPStrPtr),y
iny
lda #0
sta (ZPStrPtr),y
>PUSHBI 0
>LDYA ZPStrPtr
>SYSCALL printf
pla
>SYSCALL freemem
bra .1
.8 lda ZPhFile
>SYSCALL fclose
.9 rts
*--------------------------------------
CS.DOEVENT
sec
rts
*--------------------------------------
CS.QUIT lda ZPhGetLine
beq .1
>SYSCALL freemem
.1 lda hLIBCRYPT
beq .8
>SYSCALL UnloadLib
.8 clc
rts
*--------------------------------------
CS.END
*--------------------------------------
LIBCRYPT .AZ "libcrypt"
hLIBCRYPT .BS 1
MSG.NOAUTH .AS "\r\n\r\nA2osX-Login:No ETC/PASSWD file present, Logged as ROOT.\r\n"
.AS "Consider adding ROOT password with USERADD command.\r\n"
MSG.CRLF .AZ "\r\n"
MSG.LOGIN .AZ "\r\nlogin:"
MSG.PASSWORD .AZ "\r\npassword:"
MSG.BAD .AZ "Bad user or password\r\n"
MSG.BS .DA #C.BS,#C.SPACE,#C.BS,#0
ETCISSUE .AZ "${ROOT}ETC/ISSUE"
ETCMOTD .AZ "${ROOT}ETC/MOTD"
SHELL .AZ "${SHELL}"
*--------------------------------------
SESSION.ROOT .DA #S.SESSION.P.ROOT
.DA #0 UID
.DA #0 GID
.AZ "ROOT" NAME
.AZ "Root User" GECOS
.AZ "${ROOT}ROOT/" DIR
.AZ "${ROOT}BIN/SH" SHELL
SESSION.ROOT.Size .EQ *-SESSION.ROOT
*--------------------------------------
.DUMMY
.OR 0
DS.START
PW .BS S.PW
DS.END
.ED
*--------------------------------------
MAN
SAVE USR/SRC/SBIN/LOGIN.S
ASM