• File: writeln() and line endings

    From Nightfox@VERT/DIGDIST to Digital Man on Saturday, April 26, 2025 13:45:04
    Hi DM,

    Recently I've been working on trying to get SlyEdit to behave in a way that it could be used to edit general files (and specifically, SSH keys & such, as it seems that might be useful at some point). I'm at a point where I've started doing a test to make sure SlyEdit is saving the file correctly:

    There's a system set up where I have an SSH key shared with it so that I can SSH to it without entering a password, and my test is basically this:
    1. Move my local ~/.ssh/id_rsa to a different place, and open it in a text editor (so I can copy it)
    2. Edit ~/.ssh/id_rsa with SlyEdit (which at this point is a new file), then copy the contents of id_rsa from the text editor and paste it into my terminal session with SlyEdit, and save the file
    3. Try to SSH to that remote system from my BBS machine and see if it's successful

    After this, id_rsa looks fine, but SSH authentication fails (ssh says it loads id_rsa but it says "error in libcrypto" and prompts me for a password). I've found that the reason seems to be id_rsa has DOS-style line endings (with \r\n) - I verified with a hex editor and saw that was indeed the case. If I convert id_rsa with dos2unix, I'm able to successfully SSH to the other PC.

    SlyEdit is writing the lines using the File.writeln() function. I'm running my BBS on Linux; should writeln() be expected to write with \n line endings on Linux?

    As a test, I tried having SlyEdit use write() (instead of writln() and append "\n" at the end of each line, but the lines in id_rsa still end with \r\n. I also tried opening the file with binary (as "wb") but the file still had \r\n line endings.

    Taking a step back, should I even be worrying about the line endings when saving files with SlyEdit? I'm not sure what the best course of action is here.

    Nightfox

    ---
    þ Synchronet þ Digital Distortion: digitaldistortionbbs.com
  • From nelgin@VERT/EOTLBBS to All on Saturday, April 26, 2025 19:34:21
    On Sat, 26 Apr 2025 13:45:04 -0700
    "Nightfox" (VERT/DIGDIST) <VERT/DIGDIST!Nightfox@endofthelinebbs.com>
    wrote:

    Hi DM,

    Recently I've been working on trying to get SlyEdit to behave in a
    way that it could be used to edit general files (and specifically,
    SSH keys & such, as it seems that might be useful at some point).
    I'm at a point where I've started doing a test to make sure SlyEdit
    is saving the file correctly:

    There's a system set up where I have an SSH key shared with it so
    that I can SSH to it without entering a password, and my test is
    basically this: 1. Move my local ~/.ssh/id_rsa to a different place,
    and open it in a text editor (so I can copy it) 2. Edit ~/.ssh/id_rsa
    with SlyEdit (which at this point is a new file), then copy the
    contents of id_rsa from the text editor and paste it into my terminal
    session with SlyEdit, and save the file 3. Try to SSH to that remote
    system from my BBS machine and see if it's successful

    After this, id_rsa looks fine, but SSH authentication fails (ssh says
    it loads id_rsa but it says "error in libcrypto" and prompts me for a password). I've found that the reason seems to be id_rsa has
    DOS-style line endings (with \r\n) - I verified with a hex editor and
    saw that was indeed the case. If I convert id_rsa with dos2unix, I'm
    able to successfully SSH to the other PC.

    SlyEdit is writing the lines using the File.writeln() function. I'm
    running my BBS on Linux; should writeln() be expected to write with
    \n line endings on Linux?

    As a test, I tried having SlyEdit use write() (instead of writln()
    and append "\n" at the end of each line, but the lines in id_rsa
    still end with \r\n. I also tried opening the file with binary (as
    "wb") but the file still had \r\n line endings.

    Taking a step back, should I even be worrying about the line endings
    when saving files with SlyEdit? I'm not sure what the best course of
    action is here.

    I'm not sure if this helps, but I have a modified version of
    user_settings.js that allows you to create/edit/delete ssh keys. I just
    took the rsa key from my Linux box and used the option in the setting
    editor which used FSEditor to save the file.

    If you want to try, I put it at https://www.endofthelinebbs.com/user_settings.js

    You'll want to create a text.ini entry so you can see the option. I
    have all of mine modified but you can try this.

    UserDefaultsPassword: " @~\1n\1h\1y(W)~W@ \1bChange Password or Signature @~\x01n\x01h\x01y(O)~O@ \x01bAdd, Change, or Delete SSH Key\r\n"


    and, of course, alter it to suit.

    I think I remember the SlyEdit saves the text already wrapped but
    FSEditor doesn't? You'll maybe want to check the user's sshkey file.
    --
    End Of The Line BBS - Plano, TX
    telnet endofthelinebbs.com 23
    ---
    þ Synchronet þ End Of The Line BBS - endofthelinebbs.com
  • From Digital Man@VERT to Nightfox on Saturday, April 26, 2025 18:26:04
    Re: File: writeln() and line endings
    By: Nightfox to Digital Man on Sat Apr 26 2025 01:45 pm

    After this, id_rsa looks fine, but SSH authentication fails (ssh says it loads id_rsa but it says "error in libcrypto" and prompts me for a password). I've found that the reason seems to be id_rsa has DOS-style line endings (with \r\n) - I verified with a hex editor and saw that was indeed the case. If I convert id_rsa with dos2unix, I'm able to successfully SSH to the other PC.

    SlyEdit is writing the lines using the File.writeln() function. I'm running my BBS on Linux; should writeln() be expected to write with \n line endings on Linux?

    On Windows, File.writeln() will append either "\n" or "\r\n" depending on how the file was opened. If it was opened in text mode (the "t" open flag), then "\r\n" is used.

    On Linux, the "t" open mode flag is ignored and File.writeln() will always save the text with "\n" appended. Example:

    var f = new File("test.blah");
    f.open("w");
    f.writeln();

    Creates a file with a single byte:

    $ hd /sbbs/ctrl/test.blah
    00000000 0a |.|
    00000001

    If your edited file is ending up with CRLF terminated lines, that could just be the function of the console.editfile() method (if you're using that) and the underlying C++ methods that post-process the edited the file.
    --
    digital man (rob)

    Breaking Bad quote #7:
    [Want another beer?] "Does the Pope shit in his hat?" - Hank Schrader
    Norco, CA WX: 54.4øF, 70.0% humidity, 5 mph SW wind, 0.21 inches rain/24hrs
    ---
    þ Synchronet þ Vertrauen þ Home of Synchronet þ [vert/cvs/bbs].synchro.net