|
Post by donnybowers on May 7, 2021 14:12:11 GMT -5
Let's say, for example, I have program 1 and program 2. I want to link a user who is logged in on program 1 to program 2 and I don't want them to have to log in again to use certain features that require login. How can I pass a variable that can be used to tell program 2 that my user who came from program 1 is already logged in? All I'm looking for is how to pass a piece of text or a number in a variable from program 1 that I can then process in program 2
'i.e. if loggedin<>0 then button #postComment, "Comment", [comment]
I need a secure method like the POST method in PHP as opposed to the GET method which isn't secure because the variable is passed in the address bar where anyone can see it. With the POST method it's passed via HTTP header. I've looked through the RunBASIC help file commands and functions and haven't seen anything that looks like it will do this. But I can sometimes look right at something and still miss it.
LB has a similar function, I believe it's called COMMANDLINE$ or something like that. I guess I haven't used it in a while but Turbo BASIC had it and I'm pretty sure GWBASIC and BASICA had it too. These days I tend to pass variables in LB using a temporary text file, but you can't do that with RunBASIC because you don't know if another user will be linking to the same program at the same time and the wrong person might get the authority from it to use features meant only for logged in users. You really need something like a COMMANDLINE$ or POST command to pass a variable that's invisible and unaccessable to those it's not intended for.
|
|
|
Post by meerkat on May 7, 2021 15:20:22 GMT -5
I use the RUN command. Typically I have a main program where the user signs in. Based on their sign in they are presented with their menu. Each user gets different options based on their login. The menu gives them the option to simply look at data or maintain it. After they finish the RUNNED program they go back to the menu program. The menu program is the only place they can exit the system... Hope this helps.. Dan
|
|
|
Post by donnybowers on May 7, 2021 18:27:05 GMT -5
I use the RUN command. Typically I have a main program where the user signs in. Based on their sign in they are presented with their menu. Each user gets different options based on their login. The menu gives them the option to simply look at data or maintain it. After they finish the RUNNED program they go back to the menu program. The menu program is the only place they can exit the system... Hope this helps.. Dan Thank you Dan. That sounds like a solution that could be made to work for some things. But in most cases the user not only needs to have access to certain writing privileges; but I think most of my programs will have to have some way of identifying one user from another and the user who is reading an ad has to be able to contact them. I'm also hoping to create some kind of simple messaging system, not like a chat box but more like email. Maybe if I could put a cookie on their machine that would identify one user from another. I'd rather not have to use cookies, but I might consider it for this purpose. The IP address would help, but only if the person has a static IP address. Of course I could just make it so that people have to sign in every time they post an ad, but I'm hoping to figure out a way to avoid making people do that. I know I personally would find it annoying if I wanted to post several ads and had to sign in again and again for each one. If I think about it long enough I'll probably come up with some kind of work-around.
|
|
|
Post by meerkat on May 7, 2021 20:08:49 GMT -5
I only log in once. At the beginning of the main program it sees if you are logged in. If not it shows the login screen. From there you can run anything you want.
In your case, If you login to program 1 with user/pass you are running program 1. You may have a button or something that lets you run program 2. At that point you can use the RUN command to run program 2. In the RUN command, I pass whatever info I need in UserInfo$ that is picked up with the RUNNED program. Somewhere before the RUN command I have a hidden button the goes to whatever label I need to go to in program 1. Program gets the passed UserInfo$ it needs. If it was run by another program it sets the runPass$ = "Y" It then knows how to exit or to go back to program 1
button #exit, "Exit",[doExit] #exit setid("exitMe") #exit cssclass("extBtn") if runPass$ = "Y" then html "<script> document.getElementById('exitMe').name = document.getElementById('";runExit$;"').name; </script>" end if
' ----------------------------------------- ' Get outta here ' ----------------------------------------- [doExit]
html "<script language='javascript' type='text/javascript'> var a = history.length; a = a - 1; window.open('','_parent',''); window.close(); history.go(-a); </script>" wait
CSSClass ".extBtn", "{background-color:#E74C3C;}" CSSClass ".hide", "{visibility: hidden; height:0px; border:none}"
Hope this helps.. Dan
|
|
|
Post by donnybowers on May 8, 2021 0:52:41 GMT -5
I can't find anything on processing forms. It would be easy to pass a secret variable using a hidden field in a form if you have a way of processing the form after you submit it.
|
|
|
Post by meerkat on May 8, 2021 2:32:16 GMT -5
I can't find anything on processing forms. It would be easy to pass a secret variable using a hidden field in a form if you have a way of processing the form after you submit it. Not sure why you would like to have a hidden secret variable since you can pass it in UserInfo$. Anyway HTML lets you hold hidden values as described here; Hidden ValuesExample; city$ = "New York" html "<input type='hidden' name='city' id='city' value='";city$;"' size=22/>" ' the hidden value city$ = #request get$("city") ' get the hidden value Change the value anytime with; html "<script> document.getElementById('";city;"').value = '";newCity$;"';</script>" If you are having problems with your code, give me more detail of what you want to do and I can give you the code. It looks like what you are trying to do is not unusual.. I'm a little rusty with RB. I code mostly in RFO-Basic now. RFO runs on Android and Fuchsia. I always think it's kind of amusing knowing my web server is on my phone in my pocket. Hope this helps. Dan
|
|
|
Post by donnybowers on May 8, 2021 19:04:15 GMT -5
Not sure why you would like to have a hidden secret variable since you can pass it in UserInfo$. Anyway HTML lets you hold hidden values as described here; Hidden ValuesThank you for replying meerkat. This is the only thing I can find about UserInfo$ in the RB documentation -> UserInfo$ - This is information about the user's web browser. What I need is to pass a variable, preferably a string, but I could make a number work if I had to. The purpose is to identify the users username. Each registered user will have a directory of their own with a small profile and within this directory will be all of their contributions to the website (a local community website with information about events, local history etc. along with a classified ads section). There will be many sections of the site and each section will be different, hence different apps for each section of the site. What I want to do is make it so that a user can login in any of these sections and when they go to another section they will still be identified in case they want to contribute something to that section or place an ad in the classifieds. This will be a huge project. Right now I'm just working on "building block" pieces of code that I will need when I actually start making the website. Part of the planning stage along with the learning curve. If you know a way I can send a username from one RB program to another using RUN and UserInfo$ that would help me immensely. As for using a form with a hidden value, I basically know how to create a form, but the only way I know how to get the information from the form from one page (or program) to another is using PHP. I know a little bit of PHP, but I don't want to use PHP or Java script. I prefer to use BASIC. As I say, I know a little about PHP but I know nothing about Java script so with a Java script example I would need a lot of explanation. In PHP all I need is a simple form with the ACTION of sending it to another page for processing. There I could process the values or the input content of the fields in the form. Very simple, but this is RunBASIC, not PHP. For security reasons it's important that this variable not be visible in the address bar. But if that's the only option then I could work around that by encrypting the username so that a hacker wouldn't know what it was. If a username can be passed using UserInfo$ that would be all I would need because I could then get any other information I need about the user from their profile directory which would be named 'username'. I think I downloaded this language at one time. I think I got the info from one of your posts as a matter of fact. I have an Android tablet that my wife used to use, but now I use it mainly for experiments like trying things like RFO-Basic. It seems pretty cool, but I really hate the Android system and I'm stuck on the idea of using RunBASIC in Linux. Especially since I've found a way to get a TEXTAREA to wordwrap, something that kept me from beginning to do any real developing on RB for years. I really needed that feature and now I know a way to have it. So once again I'm beginning to work on the basic building blocks I'll need to create my site. Once I work out a couple more kinks I will begin actually constructing the site and then I will be wanting to download the paid version so I can start testing it on various devices, probably through a home RB network at first and then eventually on the internet. Now I need a way to pass variables from one RB app to another. I can work around a lot of things, but there are some things I really need to be able to do in order to create the local community website I would love to make. I doubt if I'll ever do it in PHP because I still have a lot to learn about how to use that language and I don't want to spend that much time learning. Anyway I find the PHP language a little weird and hard to learn. With RunBASIC the learning curve for me will be immensely shorter because I already know how to do most of it (with the help of the documentation and this forum). I've written a lot of programs in Just BASIC and Liberty BASIC, so much of it is second nature for me. If you can help I would be very grateful. Just a simple program 1 code to send a variable to program 2, and then another simple program 2 code that prints the result is all I would need. The documentation gives me almost zero information about how to use UserInfo$. To me it just looks like it will only give browser info like "Mozilla Firefox" etc. There are no examples or explanations in the documentation and the only other source of info I'm aware of is this forum. And I can't find any examples or details about how to process forms in the documentation or in a forum search either. If you search the word "forms" in the documentation you basically get nothing. The same with this forum. There's one or two references, for example apparently POST has something to do with processing forms and there's something in there called GET$ or get? but again, no details about how it's used or any examples to learn from. I would have been asking these questions years ago but I was hung up on not being able to have a TEXTAREA that would wordwrap and couldn't get any information or examples that actually worked for me. But I keep coming back to RB because I love the concept of making web apps in BASIC so much.
|
|
|
Post by donnybowers on May 8, 2021 22:34:58 GMT -5
I can't find anything on processing forms. It would be easy to pass a secret variable using a hidden field in a form if you have a way of processing the form after you submit it. Not sure why you would like to have a hidden secret variable since you can pass it in UserInfo$. Anyway HTML lets you hold hidden values as described here; Hidden ValuesExample; city$ = "New York" html "<input type='hidden' name='city' id='city' value='";city$;"' size=22/>" ' the hidden value city$ = #request get$("city") ' get the hidden value Change the value anytime with; html "<script> document.getElementById('";city;"').value = '";newCity$;"';</script>" If you are having problems with your code, give me more detail of what you want to do and I can give you the code. It looks like what you are trying to do is not unusual.. I'm a little rusty with RB. I code mostly in RFO-Basic now. RFO runs on Android and Fuchsia. I always think it's kind of amusing knowing my web server is on my phone in my pocket. Hope this helps. Dan Thanks Dan. So I tried to make this code work like this: Program 1 city$ = "New York" html "<input type='hidden' name='city' id='city' value='";city$;"' size=22/>" ' the hidden value run "Program 2"
Program 2 print "Pass value 2 test" : print city$ = #request get$("city") ' get the hidden value print city$
I get the following error message: Runtime Error in program 'Pass value 2': city$ = #request get$("city") Message not understood: #animateProductNamed:parameters:director:
Runtime Error in program 'Pass value 1': run "Pass value 2" Message not understood: #identifier
Also, what does "size=22/" do?
|
|
|
Post by meerkat on May 9, 2021 8:47:38 GMT -5
I tried it and it worked. You don't happen to have a cls command somewhere? If you do it will clear a html including <input"
It makes the input field size 22 wide. And it varies somewhat depending on the font you use. You can still enter more than 22 characters however since it scrolls right..
I have one question.. Why not make one program that contains the code for program1 and program1.. They probably have a lot of shared code they could use. Then you could goto lable [prog1] or [prog2] depending on what you want to do..
I wrote a quickie [Main] program that lets you run program 1 or program 2.. Prog 1 simply lets you get the pass data. I'll set it up to run prog2 or go back to the main program later today.. I assume you'll need a db to hold data you need based on user number. I set it up using memory db. You should make it a real db. hope it helps a little.
' ------------------------------------------ ' ad System ' ------------------------------------------
bf$ = "<SPAN STYLE='font-family:Arial; font-weight:700; font-size:12pt'>" bh$ = "<B><FONT SIZE=3 FACE=Arial>" ' Huge font CSSClass ".hide", "{visibility: hidden; height:0px; bprder:none}" NullColumn$ = ""
projectDir$ = "ad_project" ' -------------------------------------- ' create memory database ' -------------------------------------- sqliteconnect #mem, ":memory:"
sql$ = "CREATE TABLE user ( userNum INT(5), firstName VARCHAR(22), middleName VARCHAR(22), lastName VARCHAR(22), addr1 VARCHAR(22), addr2 VARCHAR(22), city VARCHAR(22), state CHAR(3), zip VARCHAR(10), country VARCHAR(4), phone VARCHAR(17), eMail VARCHAR(40), username VARCHAR(16), password VARCHAR(16), passwordHint VARCHAR(50), keyKeeper CHAR(1))" #mem execute(sql$)
sql$ = "CREATE UNIQUE INDEX user_userNum ON user(userNum)" #mem execute(sql$)
sql$ = "INSERT INTO user VALUES ('1','Admin','The','Data','I have no address','','Redding','CA','96001','USA','','','admin','admin','What is Kashogi','Y')" #mem execute(sql$)
clrHdr$ = "#C4D79B" ' Heading color clrBkg$ = "#A6C36A" ' Background color clr0bg$ = "#F5F8EE" ' Even line background clr1bg$ = "#F5F8EE" ' Odd line background clrTbl$ = "#4E5E2C" ' table line color
fromProg$ = "M" ' from main program runTitle$ = "AD system" titlebar runTitle$
' check for passed info from prog 1 or prog 2.. ' Lead in to UserInfo$ is ^~N where N = 1 for prog 1 and 2 for prog 2 if left$(UserInfo$,5) = "^~" then html " UserInfo:";UserInfo$ progFrom$ = mid$(UserInfo$,3,1) end if
if loginUserNum = 0 then goto [doLogin] [main] cls
html bf$;"<TABLE BORDER=1 CELLPADDING=0 cellspacing=0 WIDTH=100% bordercolor=";clrTbl$;" bgcolor=";clrBkg$;">" html "<TR ALIGN=CENTER><TD bgcolor=";clrBkg$;" width=15%>" button #log, "Login",[doLogin]
html "</TD><TD bgcolor=";clrBkg$;" width=15%>";loginUserNum;" ";loginUserName$
html "</TD><TD bgcolor=";clrBkg$;">";bh$;runTitle$ html "</TD><TD bgcolor=";clrBkg$;" width=15%>";date$("yyyy-mm-dd") html "</TD><TD bgcolor=";clrBkg$;" width=15%>" button #exit, "Exit",[doExit] html "</TD></TR>" html "<TR align=center><TD colspan=5 align=center>" html "Run Program 1 ": button #p1, "Run Prog1" ,[doProg1]
html "<BR>" html "Run Program 2 ": button #p1, "Run Prog2" ,[doProg2] html "</TD></TR></TABLE>" wait
' ====================================== ' Signin ' ====================================== [doLogin] CLS loginCanMaint$ = "N" loginKeyKeeper$ = "N" html bf$;"<CENTER><TABLE CELLPADDING=0 CELLSPACING=4 border=0 bgcolor=";clrBkg$;"> <TR><TD colspan=2 align=center>LOGIN</TD></TR> <TR><TD align=center>UserName</TD><TD>" TEXTBOX #userName, "" html "</TR></TD><TR><TD align=right>Password:</TD><TD>" PasswordBox #passWord, ""
html "</TD></TR><TD colspan=2>" html bf$;"<TABLE BORDER=0 CELLPADDING=0 CELLSPACING=0 WIDTH=100% bgcolor=";clrHdr$;"><TR><TD align=center>" button #si, "Signin", [doSignin] html "</TD><TD align=center>" button #ex, "Exit", [chkExit] html "</TD></TR></TABLE>" html "</TD></TR></TABLE>"
WAIT
[doSignin] loginUserName$ = trim$(#userName contents$()) loginPassWord$ = trim$(#passWord contents$())
[getSignin] sql$ = "SELECT * FROM user WHERE username = '";loginUserName$;"' AND password = '";loginPassWord$;"'" sql$ = "SELECT * FROM user" #mem execute(sql$) rows = #mem ROWCOUNT() 'Get the number of rows print sql$ print rows
if rows = 0 then print "Invalid username or password" wait end if #row = #mem #nextrow() loginKeyKeeper$ = #row keyKeeper$() loginUserNum = #row userNum() loginUserName$ = #row firstName$();" ";#row middleName$();" ";#row lastName$() goto [main]
' ---------------------------- ' Do prog 1 ' ----------------------------- [doProg1] prog$ = "prog1.bas" passFrom$ = "^~0" ' pass from 0 = main runProgData$ = "Anything you want to pass to program 1" goto [doRun]
' ---------------------------- ' Do prog 2 ' ----------------------------- [doProg2] prog$ = "prog2.bas" passFrom$ = "^~0" ' pass from 0 = main runProgData$ = "Anything you want to pass to program 2" goto [doRun] ' ------------------------------------------- ' Run program ' ------------------------------------------- [doRun] runAction$ = "maint" ' a way to tell it what you want it to do cls runProg$ = "menu" ' who is running it ' ---- pass user number and name and what maint they can do, who ran it, and data to pass UserInfo$ = passFrom$;" |";loginUserNum;" |";loginUserName$;" |";loginCanMaint$;" |";loginKeyKeeper$;" |";runProg$;" |";runProgData$
button #rtna, "Exit App" ,[main] #rtna cssclass("hide") ' hide the [exit app] button #rtna setid("exitApp")
incdir$ = DefaultDir$ + "\projects\ad_project\" run incdir$;prog$,#include render #include wait
' ----------------------------------------- ' Get outta here ' ----------------------------------------- [chkExit] if loginUserNum <> 0 then goto [main]
[doExit]
html "<script language='javascript' type='text/javascript'> var a = history.length; a = a - 1; window.open('','_parent',''); window.close(); history.go(-a); </script>" wait
|
|
|
Post by meerkat on May 9, 2021 8:59:05 GMT -5
program 1 might look something like this.. I'll test it later, but want you show it so you'd know how to pass information.
' *********************************************************** ' program 1 ' *********************************************************** call SetCSS NullColumn$ = "" bf$ = "<SPAN STYLE='font-family:Arial; font-weight:700; font-size:12pt'>" bf2$ = "<SPAN STYLE='font-family:Arial; font-weight:700; font-size:10pt'>" bf1$ = "<SPAN STYLE='font-family:Arial; font-weight:700; font-size:14pt'>"
wordWrap$ = "style='white-space: pre-wrap;";_ "white-space: -moz-pre-wrap;";_ "white-space: -pre-wrap;";_ "white-space: -o-pre-wrap;";_ "word-wrap: break-word'"
' --------------------------------------------- ' Get RUN pass information ' --------------------------------------------- passFrom$ = trim$(word$(UserInfo$,1,"|")) loginUserNum$ = trim$(word$(UserInfo$,2,"|")) loginUserName$ = trim$(word$(UserInfo$,3,"|")) loginCanMaint$ = trim$(word$(UserInfo$,4,"|")) loginKeyKeeper$ = trim$(word$(UserInfo$,5,"|")) runProg$ = trim$(word$(UserInfo$,6,"|")) runProgData$ = trim$(word$(UserInfo$,7,"|")) runPass$ = trim$(word$(UserInfo$,8,"|")) runExit$ = trim$(word$(UserInfo$,9,"|")) if runExit$ = "" then runExit$ = "exitApp" loginUserNum = val(loginUserNum$)
if runExit$ = "" then runExit$ = "exitApp" if runPass$ <> "Y" then titlebar "program 1"
projectDir$ = "ad_project" if left$(Platform$,3) = "win" then adDb$ = DefaultDir$ + "\projects\" + projectDir$ + "\data\ad.db" incdir$ = DefaultDir$ + "\projects\ad_project\" else adDb$ = DefaultDir$ + "/projects/" + projectDir$ + "/data/ad.db" incdir$ = DefaultDir$ + "/projects/ad_project/" end if
print "Im in program 1" Pring "UserInfo:";UserInfo$
html "Back to Main ": button #p1, "Run ad" ,[doProg1]
html "<BR>" html "Run Program 2 ": button #p1, "Run Prog2" ,[doProg2]
' ---------------------------- ' Do prog 2 ' ----------------------------- [doProg2] prog$ = "prog2.bas" passFrom$ = "^~1" runProgData$ = "Anything you want to pass to program 2" goto [doRun] ' ------------------------------------------- ' Run program ' ------------------------------------------- [doRun] runAction$ = "maint" ' a way to tell it what you want it to do cls runProg$ = "menu" ' who is running it ' ---- pass user number and name and what maint they can do, who ran it, and data to pass UserInfo$ = passFrom$;" |";loginUserNum;" |";loginUserName$;" |";loginCanMaint$;" |";loginKeyKeeper$;" |";runProg$;" |";runProgData$
button #rtna, "Exit App" ,[main] #rtna cssclass("hide") ' hide the [exit app] button #rtna setid("exitApp")
incdir$ = DefaultDir$ + "\projects\ad_project\" run incdir$;prog$,#include render #include wait
' ----------------------------------------- ' Get outta here ' ----------------------------------------- [chkExit] if loginUserNum <> 0 then goto [main]
[doExit]
html "<script language='javascript' type='text/javascript'> var a = history.length; a = a - 1; window.open('','_parent',''); window.close(); history.go(-a); </script>" wait
|
|
|
Post by donnybowers on May 9, 2021 13:59:19 GMT -5
Wow! Look how much easier it is to pass a variable in PHP!
Program1.php
<?php $userName='Donny Bowers' ?> <form action="program2.php" method="post"> <input type="hidden" name="name" value="<?php echo $userName; ?>"> <input type="submit" value="Program2"> </form>
Program2.php
<?php $userName = $_POST['name']; echo $userName ?>
|
|
|
Post by donnybowers on May 9, 2021 14:07:02 GMT -5
In the above example program 1 will display a button that says "Program2" When pressed the button will take you to program2.php which will display "Donny Bowers"
|
|
|
Post by donnybowers on May 9, 2021 23:35:43 GMT -5
Nope. I ran the exact code that I posted.
Do I have to do all of this just to pass a variable from one program to another? I tried running this code and it wouldn't run. Errors! Very confusing.
|
|
|
Post by StefanPendl on May 10, 2021 9:07:19 GMT -5
Here is a "simple" example of using a session ID to handle user information. It uses a text file, but you can also use a SQLite database. The session ID should be a more complex one to better distinguish between the many user sessions. Publish program2 to be able to use this example.
The main program or login page:
' program1 print print "Enter User Name: "; textbox #username, "" print print "Enter Password: "; passwordbox #password, ""
print print link #doAction, "Continue", [doAction]
#username setfocus() wait
[doAction] userName$ = #username contents$() passWord$ = #password contents$()
sessionID$ = "my_md5_hash"
open sessionID$; ".txt" for output as #txt #txt "userName="; userName$ #txt "passWord="; passWord$ close #txt
html "</br></br><a href='?app=program2&sid="; sessionID$; "' target='_blank'>Next</a>" end
The start for one of the sections:
' program2 print print "UrlKeys$: "; UrlKeys$
i = 1 while word$(UrlKeys$, i, "&") <> "" urlKey$ = word$(UrlKeys$, i, "&") option$ = word$(urlKey$, 1, "=") value$ = word$(urlKey$, 2, "=")
if option$ = "sid" then sessionID$ = value$ end if
i = i + 1 wend
print print "sessionID$: "; sessionID$
open sessionID$; ".txt" for input as #txt while not(eof(#txt)) line input #txt, theLine$
option$ = word$(theLine$, 1, "=") value$ = word$(theLine$, 2, "=")
select case option$ case "userName" userName$ = value$
case "passWord" passWord$ = value$ end select wend close #txt
print print "userName$: "; userName$ print "passWord$: "; passWord$ end
|
|
|
Post by donnybowers on May 11, 2021 19:08:58 GMT -5
Here is a "simple" example of using a session ID to handle user information. It uses a text file, but you can also use a SQLite database. The session ID should be a more complex one to better distinguish between the many user sessions. Publish program2 to be able to use this example. The main program or login page: ' program1 print print "Enter User Name: "; textbox #username, "" print print "Enter Password: "; passwordbox #password, ""
print print link #doAction, "Continue", [doAction]
#username setfocus() wait
[doAction] userName$ = #username contents$() passWord$ = #password contents$()
sessionID$ = "my_md5_hash"
open sessionID$; ".txt" for output as #txt #txt "userName="; userName$ #txt "passWord="; passWord$ close #txt
html "</br></br><a href='?app=program2&sid="; sessionID$; "' target='_blank'>Next</a>" end
The start for one of the sections: ' program2 print print "UrlKeys$: "; UrlKeys$
i = 1 while word$(UrlKeys$, i, "&") <> "" urlKey$ = word$(UrlKeys$, i, "&") option$ = word$(urlKey$, 1, "=") value$ = word$(urlKey$, 2, "=")
if option$ = "sid" then sessionID$ = value$ end if
i = i + 1 wend
print print "sessionID$: "; sessionID$
open sessionID$; ".txt" for input as #txt while not(eof(#txt)) line input #txt, theLine$
option$ = word$(theLine$, 1, "=") value$ = word$(theLine$, 2, "=")
select case option$ case "userName" userName$ = value$
case "passWord" passWord$ = value$ end select wend close #txt
print print "userName$: "; userName$ print "passWord$: "; passWord$ end
I enter a name and password and click "Continue". All it does is give me another link "Next" which opens a new instance of RB IDE in a new tab. Apparently the info is not being sent to program2. Since I'm not familiar with this code I have no idea how to fix it.
|
|