From 97b1a5daf0d11cbc94f453bf9ca3b615fb12f4c1 Mon Sep 17 00:00:00 2001 From: Pradyumn Vikram Date: Tue, 15 Apr 2025 15:32:53 +0530 Subject: [PATCH 1/2] Solutions to bandit levels 0-15 --- Pradyumn_V/otw.md | 95 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 95 insertions(+) create mode 100644 Pradyumn_V/otw.md diff --git a/Pradyumn_V/otw.md b/Pradyumn_V/otw.md new file mode 100644 index 0000000..d82e2c4 --- /dev/null +++ b/Pradyumn_V/otw.md @@ -0,0 +1,95 @@ +## Level 0 + +### pswd - bandit0 + +used ssh to login to the server for overthewire where bandit is played + +## Level 1 + +### pswd - ZjLjTmM6FvvyRnrb2rfNWOZOTa6ip5If + +used ls to find readme file and used **cat** to read the contents + +## Level 2 + +### pswd - 263JGJPfgU6LtdEvgfWU1XP5yac29mFx + +used ls to find a file named '-' used ./- to specify the entire directory because passing only cat - can cause problems since - is commonly used to pass arguements to the function + +## Level 3 + +### pswd - MNk8KNH3Usiio41PRUEoDFPqfxLPlSmx + +used quotations to specify the filename when passed as an arguement in cat + +## Level 4 + +### pswd - 2WmrDFRmJIq3IPxneAaMGhap0pFhF3NJ + +used **ls -a** to show all files including hidden ones then read the file using **cat ./...Hidden-From-You** + +## Level 5 + +### pswd - 4oQYVPkxZOOEOO5pTW81FB8j8lxXGUQw + +used file ./* to find the type of text in all files and read the file07 using cat since it contained ASCII characters + +## Level 6 + +### pswd - HWasnPhtq9AVKe0dmk45nxy20cvUa6EG + +executed **file */* | grep "ASCII text" | du -b -a | grep 1033** to extract all ascii text files of size 1033 since only 1 result showed, read that using cat and got the password + +## Level 7 + +### pswd - morbNTDkSW6jIlUc0ymOdMaLnOlFVAaj + +used **find / -user bandit7 -group bandit6 -size 33c 2>/dev/null** we add the last part to hide all permission denied error messages + +## Level 8 + +### pswd - dfwvzFQi4mU0wfNbFOe9RoWskMLg7eEc + +**cat data.txt | grep millionth** returned the complete line containing millionth including the password + +## Level 9 + +### pswd - 4CKMh1JI91bUIZZPXDqGanal4xvAg0JM + +**sort data.txt | uniq -u** sort will sort the file allowing uniq to filter out repeating lines using the -u tag and return the only line appearing once + +## Level 10 + +### pswd - FGUW5ilLVJrxX9kMYMmlN4MgbpfMiqey + +**cat data.txt | strings | grep ==** strings will return all human readable lines and grep filters them + +## Level 11 + +### pswd - dtR173fZKb0RRsDFSGsg2RWnpNVj3qRr + +**cat data.txt | base64 -d** decrypts the encoded text and returns password + +## Level 12 + +### pswd - 7x16WNeHIi5YkIhWsfFIqoognUTyj9Q4 + +**cat data.txt | tr 'A-Za-z' 'N-ZA-Mn-za-m'** translate command is used to execute rotation by 13 on the character skipping numerical values + +## Level 13 + +### pswd - FO5dwFsc0cbaIiH0h8J2eUks2vdTDwAn + +we know that first we extract the hexadecimal contents then on reading it using **xxd** we see gzip compressed files start with 1f 8b as their first few bytes hence we decrypt then we see 425a which is bzip2 we repeat this process and encounter .bin files indicating archive extracted using **tar -xf** + +## Level 14 + +### pswd - MU4VWeTyJk8ROof1qqmcBPaLh7lDCPvS + +first we find the location of the ssh key file using ls then we download it by logging out and accessing the server from our computer using scp (secure copy protocol) for transferring files between hosts over a network then we reduce permissions using chmod 700 and finally login using the sshkey.private with -i tag with ssh + +## Level 15 + +### pswd - 8xCjnmgoKbGLhHFAZlGE5Tmu4M2tKJQo + +submitted level 14 password using **nc localhost 30000** and entering the password when prompted From 075eb1845e1e00e6bab1bc3584645d1a919cd4aa Mon Sep 17 00:00:00 2001 From: Pradyumn Vikram Date: Tue, 13 May 2025 15:27:33 +0530 Subject: [PATCH 2/2] task2_submission --- Task2/pradyumn_v/Content.cpp | 7 + Task2/pradyumn_v/Content.h | 13 ++ Task2/pradyumn_v/Dockerfile | 6 + Task2/pradyumn_v/admin.cpp | 145 ++++++++++++ Task2/pradyumn_v/admin.h | 19 ++ Task2/pradyumn_v/admin/admin1.dat | 2 + Task2/pradyumn_v/catalogues/data.dat | 3 + Task2/pradyumn_v/main.cpp | 253 ++++++++++++++++++++ Task2/pradyumn_v/media_rental_system | Bin 0 -> 61864 bytes Task2/pradyumn_v/movie.cpp | 7 + Task2/pradyumn_v/movie.h | 13 ++ Task2/pradyumn_v/movie_entry.h | 8 + Task2/pradyumn_v/show.cpp | 8 + Task2/pradyumn_v/show.h | 12 + Task2/pradyumn_v/show_entry.h | 9 + Task2/pradyumn_v/user.cpp | 335 +++++++++++++++++++++++++++ Task2/pradyumn_v/user.h | 29 +++ Task2/pradyumn_v/users/pradyumnv.dat | 5 + 18 files changed, 874 insertions(+) create mode 100644 Task2/pradyumn_v/Content.cpp create mode 100644 Task2/pradyumn_v/Content.h create mode 100644 Task2/pradyumn_v/Dockerfile create mode 100644 Task2/pradyumn_v/admin.cpp create mode 100644 Task2/pradyumn_v/admin.h create mode 100644 Task2/pradyumn_v/admin/admin1.dat create mode 100644 Task2/pradyumn_v/catalogues/data.dat create mode 100644 Task2/pradyumn_v/main.cpp create mode 100755 Task2/pradyumn_v/media_rental_system create mode 100644 Task2/pradyumn_v/movie.cpp create mode 100644 Task2/pradyumn_v/movie.h create mode 100644 Task2/pradyumn_v/movie_entry.h create mode 100644 Task2/pradyumn_v/show.cpp create mode 100644 Task2/pradyumn_v/show.h create mode 100644 Task2/pradyumn_v/show_entry.h create mode 100644 Task2/pradyumn_v/user.cpp create mode 100644 Task2/pradyumn_v/user.h create mode 100644 Task2/pradyumn_v/users/pradyumnv.dat diff --git a/Task2/pradyumn_v/Content.cpp b/Task2/pradyumn_v/Content.cpp new file mode 100644 index 0000000..4ac568d --- /dev/null +++ b/Task2/pradyumn_v/Content.cpp @@ -0,0 +1,7 @@ +#include "Content.h" + +Content::Content(string name, string type, int rated){ + title = name; + genre = type; + rating = (rated<=5)?rated:0; +} \ No newline at end of file diff --git a/Task2/pradyumn_v/Content.h b/Task2/pradyumn_v/Content.h new file mode 100644 index 0000000..f8fe997 --- /dev/null +++ b/Task2/pradyumn_v/Content.h @@ -0,0 +1,13 @@ +#pragma once +#include +using namespace std; + +class Content{ + public: + string title; + string genre; + int rating; + bool is_rented=false; + bool is_purchased=false; + Content(string name, string type, int rated); +}; \ No newline at end of file diff --git a/Task2/pradyumn_v/Dockerfile b/Task2/pradyumn_v/Dockerfile new file mode 100644 index 0000000..daa22e1 --- /dev/null +++ b/Task2/pradyumn_v/Dockerfile @@ -0,0 +1,6 @@ +FROM gcc:latest +WORKDIR /usr/src/app +COPY . . +RUN g++ *.cpp -o media_rental_system +VOLUME ["/app/user", "/app/admin", "/app/catalogues"] +CMD ["./media_rental_system"] diff --git a/Task2/pradyumn_v/admin.cpp b/Task2/pradyumn_v/admin.cpp new file mode 100644 index 0000000..35aa8c1 --- /dev/null +++ b/Task2/pradyumn_v/admin.cpp @@ -0,0 +1,145 @@ +#include "admin.h" + +void Admin::save(const string& filename) { + ofstream out(filename); + if (!out) { + cerr << "Could not open file for writing.\n"; + return; + } + out << username << '\n' << password << '\n'; + + out.close(); +} + +void Admin::load(const string& filename) { + ifstream in(filename); + if (!in) { + cerr << "Could not open file for reading.\n"; + return; + } + getline(in, username); + getline(in, password); + in.close(); +} + + +void Admin::save_catalogues(const string& filename, movie_entry* movie_cat, tv_show_entry* show_cat){ + ofstream out(filename); + if (!out) { + cerr << "Error opening file for writing: " << filename << endl; + return; + } + + movie_entry* m = movie_cat; + while (m) { + Movie* movie = m->data; + out << "MOVIE " << movie->title << " " + << movie->genre << " " << movie->rating << " " + << movie->duration << " " << movie->rent_cost << " " + << movie->purchase_cost << "\n"; + m = m->next; + } + + tv_show_entry* s = show_cat; + while (s) { + Show* show = s->data; + out << "SHOW " << show->title << " " + << show->genre << " " << show->rating << " " + << show->seasons << " " << show->ep_per_season << " " + << show->rent_cost << " " << show->purchase_cost << "\n"; + s = s->next; + } + + out.close(); +} + + + + +movie_entry* Admin::add_movie(string title, string type, int rated, int time, int rent, int purchase, movie_entry* head){ + movie_entry* entry = new movie_entry; + entry->data = new Movie(title, type, rated, time, rent, purchase); + entry->next=nullptr; + bool added = false; + + if(!head){ + return entry; + } + + movie_entry* curr = head; + while(curr->next){ + if(curr->data->genre==entry->data->genre){ + entry->next=curr->next; + curr->next = entry; + added = true; + break; + } + curr = curr->next; + } + if(!added){ + curr->next = entry; + } + return head; +} + +movie_entry* Admin::remove_movie(string name, movie_entry* head){ + movie_entry* curr = head; + movie_entry* prev = nullptr; + if(curr->data->title==name){ + head = curr->next; + return head; + } + while(curr->data->title!=name){ + prev = curr; + curr = curr->next; + if(curr==nullptr){ + return head; + } + } + prev->next = curr->next; + return head; +} + +tv_show_entry* Admin::add_show(string title, string type, int rated, int season, int ep_per_seasons, int time, int rent, int purchase, tv_show_entry* head){ + tv_show_entry* entry = new tv_show_entry; + entry->data = new Show(title, type, rated, season, ep_per_seasons, rent, purchase); + entry->next=nullptr; + bool added = false; + + if(!head){ + return entry; + } + + tv_show_entry* curr = head; + while(curr->next){ + if(curr->data->genre==entry->data->genre){ + entry->next=curr->next; + curr->next = entry; + added = true; + break; + } + curr = curr->next; + } + if(!added){ + curr->next = entry; + } + return head; +} + +tv_show_entry* Admin::remove_show(string name, tv_show_entry* head){ + tv_show_entry* curr = head; + tv_show_entry* prev = nullptr; + if(curr->data->title==name){ + head = curr->next; + return head; + } + while(curr->data->title!=name){ + prev = curr; + curr = curr->next; + if(curr==nullptr){ + return head; + } + } + prev->next = curr->next; + return head; +} \ No newline at end of file diff --git a/Task2/pradyumn_v/admin.h b/Task2/pradyumn_v/admin.h new file mode 100644 index 0000000..1b70171 --- /dev/null +++ b/Task2/pradyumn_v/admin.h @@ -0,0 +1,19 @@ +#pragma once +#include +#include "show_entry.h" +#include "movie_entry.h" +#include +using namespace std; + +class Admin{ + public: + string username; + string password; + void save(const string& filename); + void load(const string& filename); + void save_catalogues(const string& filename, movie_entry* movie_cat, tv_show_entry* show_cat); + movie_entry* add_movie(string title, string type, int rated, int time, int rent, int purchase, movie_entry* head); + movie_entry* remove_movie(string name, movie_entry* head); + tv_show_entry* add_show(string title, string type, int rated, int season, int ep_per_seasons, int time, int rent, int purchase, tv_show_entry* head); + tv_show_entry* remove_show(string name, tv_show_entry* head); +}; \ No newline at end of file diff --git a/Task2/pradyumn_v/admin/admin1.dat b/Task2/pradyumn_v/admin/admin1.dat new file mode 100644 index 0000000..3d47a4c --- /dev/null +++ b/Task2/pradyumn_v/admin/admin1.dat @@ -0,0 +1,2 @@ +admin1 +34567 diff --git a/Task2/pradyumn_v/catalogues/data.dat b/Task2/pradyumn_v/catalogues/data.dat new file mode 100644 index 0000000..d0d5244 --- /dev/null +++ b/Task2/pradyumn_v/catalogues/data.dat @@ -0,0 +1,3 @@ +MOVIE MeBeforeYou Romantic 3 100 120 140 +SHOW TBBT SitCom 4 8 24 300 350 +SHOW HIMYM SitCom 2 11 13 400 3000 diff --git a/Task2/pradyumn_v/main.cpp b/Task2/pradyumn_v/main.cpp new file mode 100644 index 0000000..50b05c7 --- /dev/null +++ b/Task2/pradyumn_v/main.cpp @@ -0,0 +1,253 @@ +#include +#include "user.h" +#include "admin.h" +#include +using namespace std; + +void load_cat(const string& filename, movie_entry** movie_cat, tv_show_entry** show_cat) { + ifstream in(filename); + if (!in) { + cerr << "Error opening file for reading: " << filename << endl; + return; + } + + *movie_cat = nullptr; + *show_cat = nullptr; + + string line; + while (getline(in, line)) { + istringstream iss(line); + string type; + iss >> type; + + if (type == "MOVIE") { + string title, genre; + int rating, duration, rent_cost, purchase_cost; + iss >> title >> genre >> rating >> duration >> rent_cost >> purchase_cost; + + Movie* new_movie = new Movie(title, genre, rating, duration, rent_cost, purchase_cost); + movie_entry* new_entry = new movie_entry{new_movie, nullptr}; + + if (!*movie_cat) { + *movie_cat = new_entry; + } else { + movie_entry* current = *movie_cat; + while (current->next) current = current->next; + current->next = new_entry; + } + + } else if (type == "SHOW") { + string title, genre; + int rating, seasons, ep_per_season, rent_cost, purchase_cost; + iss >> title >> genre >> rating >> seasons >> ep_per_season >> rent_cost >> purchase_cost; + + Show* new_show = new Show(title, genre, rating, seasons, ep_per_season, rent_cost, purchase_cost); + tv_show_entry* new_entry = new tv_show_entry{new_show, nullptr}; + + if (!*show_cat) { + *show_cat = new_entry; + } else { + tv_show_entry* current = *show_cat; + while (current->next) current = current->next; + current->next = new_entry; + } + } + } + in.close(); +} + +int main(){ + int logged_in = 0, rated, duration, rent, purchase, seasons, episodes; + string user, pswd, input, title, type; + int decision = 0, decision_ua=0; + movie_entry* movie_cat = nullptr; + tv_show_entry* show_cat = nullptr; + load_cat("catalogues/data.dat", &movie_cat, &show_cat); + User* active_user=nullptr; + Admin* active_admin=nullptr; + while(true){ + if(!logged_in){ + cout<<"[1] Login"<>decision; + if(decision==1){ + cout<<"Enter Username: "<>user; + cout<<"Enter Password: "<>pswd; + cout<<"[1] Admin"<>decision_ua; + if(decision_ua==1){ + active_admin = new Admin; + active_admin->load("admin/"+user+".dat"); + if(active_admin->password==pswd){ + logged_in=2; + } + else{ + cout<<"Username or password is incorrect.\n"; + active_admin = nullptr; + logged_in=0; + } + } + if(decision_ua==2){ + active_user = new User; + active_user->load("users/"+user+".dat", movie_cat, show_cat); + if(active_user->password==pswd){ + logged_in=1; + } + else{ + cout<<"Username or password is incorrect.\n"; + active_admin = nullptr; + logged_in=0; + } + } + } + else if(decision==2){ + cout<<"[1] Admin"<>decision; + if(decision==1){ + cout<<"Enter Admin Username"<>user; + cout<<"Enter Admin Password"<>pswd; + active_admin = new Admin; + active_admin->username = user; + active_admin->password = pswd; + logged_in=2; + } + else{ + + cout<<"Enter Username"<>user; + cout<<"Enter Password"<>pswd; + active_user = new User; + active_user->username = user; + active_user->password = pswd; + logged_in=1; + } + } + + else{ + break; + } + + } + + if(logged_in==1){ + cout<<"[1] Search by title\n[2] Search by genre\n[3] Rent a title\n[4] Purchase a title\n[5] View Purchased\n[6] View Rented\n[7] Show dues\n[8] Return title\n[9] Log out\n"; + cin>>decision; + switch(decision){ + case 1: + cout<<"Enter the title: \n"; + cin>>input; + active_user->search_title(input, movie_cat, show_cat); + break; + case 2: + cout<<"Enter the genre: \n"; + cin>>input; + active_user->search_genre(input, movie_cat, show_cat); + break; + case 3: + cout<<"Enter the title you wish to rent: \n"; + cin>>input; + active_user->rent(input, movie_cat, show_cat); + break; + case 4: + cout<<"Enter the title you wish to purchase: \n"; + cin>>input; + active_user->purchase(input, movie_cat, show_cat); + break; + case 5: + active_user->view_purchased(); + break; + case 6: + active_user->view_rented(); + break; + case 7: + active_user->dues(); + break; + case 8: + cout<<"Enter the title you wish to return: \n"; + cin>>input; + active_user->return_(input); + break; + case 9: + logged_in = false; + + active_user->save("users/"+active_user->username+".dat"); + active_user=nullptr; + cout<<"Successfuly logged out\n"; + break; + + } + } + else if(logged_in==2){ + cout<<"[1] Add a movie\n[2] Add a show\n[3] Remove a movie\n[4] Remove a show\n[5] Log out\n"; + cin>>decision; + switch(decision){ + case 1: + cout<<"Title: "; + cin>>title; + cout<<"\nGenre: "; + cin>>type; + cout<<"\nRating: "; + cin>>rated; + cout<<"\nDuration: "; + cin>>duration; + cout<<"\nRent Cost: "; + cin>>rent; + cout<<"\nPurchase Cost: "; + cin>>purchase; + movie_cat = active_admin->add_movie(title, type, rated, duration, rent, purchase, movie_cat); + cout<<"Movie has been added\n"; + break; + case 2: + cout<<"Title: "; + cin>>title; + cout<<"\nGenre: "; + cin>>type; + cout<<"\nRating: "; + cin>>rated; + cout<<"\nSeasons: "; + cin>>seasons; + cout<<"\nEpisodes: "; + cin>>episodes; + cout<<"\nDuration Per Episode: "; + cin>>duration; + cout<<"\nRent Cost: "; + cin>>rent; + cout<<"\nPurchase Cost: "; + cin>>purchase; + show_cat = active_admin->add_show(title, type, rated, seasons, episodes, duration, rent, purchase, show_cat); + cout<<"Show has been added\n"; + break; + case 3: + cout<<"Enter Title to remove: "; + cin>>title; + movie_cat = active_admin->remove_movie(title, movie_cat); + break; + case 4: + cout<<"Enter Title to remove: "; + cin>>title; + show_cat = active_admin->remove_show(title, show_cat); + break; + case 5: + logged_in = false; + active_admin->save("admin/"+active_admin->username+".dat"); + active_admin->save_catalogues("catalogues/data.dat", movie_cat, show_cat); + active_admin=nullptr; + cout<<"Successfully logged out\n"; + break; + } + } +} + + return 0; + +} + +//docker \ No newline at end of file diff --git a/Task2/pradyumn_v/media_rental_system b/Task2/pradyumn_v/media_rental_system new file mode 100755 index 0000000000000000000000000000000000000000..5eaaa251d776b9f847be7946804c6a5ac7e72b6e GIT binary patch literal 61864 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 +#include "Content.h" + +using namespace std; + +class Movie: public Content{ + public: + int duration; + int rent_cost; + int purchase_cost; + Movie(string name, string type, int rated, int time, int rent, int purchase); +}; \ No newline at end of file diff --git a/Task2/pradyumn_v/movie_entry.h b/Task2/pradyumn_v/movie_entry.h new file mode 100644 index 0000000..6428130 --- /dev/null +++ b/Task2/pradyumn_v/movie_entry.h @@ -0,0 +1,8 @@ +#pragma once +#include +#include "movie.h" + +struct movie_entry{ + Movie* data; + movie_entry* next; +}; \ No newline at end of file diff --git a/Task2/pradyumn_v/show.cpp b/Task2/pradyumn_v/show.cpp new file mode 100644 index 0000000..7397d43 --- /dev/null +++ b/Task2/pradyumn_v/show.cpp @@ -0,0 +1,8 @@ +#include "show.h" + +Show::Show(string name, string type, int rated, int season, int ep_per_seasons, int rent, int purchase):Content(name, type, rated){ + seasons = season; + ep_per_season = ep_per_seasons; + rent_cost = rent; + purchase_cost = purchase; +}; \ No newline at end of file diff --git a/Task2/pradyumn_v/show.h b/Task2/pradyumn_v/show.h new file mode 100644 index 0000000..ecffccf --- /dev/null +++ b/Task2/pradyumn_v/show.h @@ -0,0 +1,12 @@ +#pragma once +#include +#include "Content.h" + +class Show: public Content{ + public: + int seasons; + int ep_per_season; + int rent_cost; + int purchase_cost; + Show(string name, string type, int rated, int season, int ep_per_seasons, int rent, int purchase); +}; \ No newline at end of file diff --git a/Task2/pradyumn_v/show_entry.h b/Task2/pradyumn_v/show_entry.h new file mode 100644 index 0000000..7c4d489 --- /dev/null +++ b/Task2/pradyumn_v/show_entry.h @@ -0,0 +1,9 @@ +#pragma once +#include +#include "show.h" +using namespace std; + +struct tv_show_entry{ + Show* data; + tv_show_entry* next; +}; \ No newline at end of file diff --git a/Task2/pradyumn_v/user.cpp b/Task2/pradyumn_v/user.cpp new file mode 100644 index 0000000..9b37d60 --- /dev/null +++ b/Task2/pradyumn_v/user.cpp @@ -0,0 +1,335 @@ +#include "user.h" +#include + +void User::search_title(string name, movie_entry* movie_catalog, tv_show_entry* show_catalog){ + tv_show_entry* iter = show_catalog; + movie_entry* iter_movie = movie_catalog; + bool printed=false; + while(iter){ + if(iter->data->title==name){ + cout<<"--------------------"<data->title<data->genre<data->seasons<data->ep_per_season<data->rent_cost<data->purchase_cost<next; + } + + while(iter_movie){ + if(iter_movie->data->title==name){ + cout<<"--------------------"<data->title<data->genre<data->duration<data->rent_cost<data->purchase_cost<next; + } + if(!printed){ + cout<<"Could not find title"; + } +} + +void User::search_genre(string genres, movie_entry* movie_catalog, tv_show_entry* show_catalog){ + tv_show_entry* iter = show_catalog; + movie_entry* iter_movie = movie_catalog; + bool printed = false; + while(iter){ + if(iter->data->genre==genres){ + cout<<"--------------------"<data->title<data->genre<data->seasons<data->ep_per_season<data->rent_cost<data->purchase_cost<next; + } + + while(iter_movie){ + if(iter_movie->data->genre==genres){ + cout<<"--------------------"<data->title<data->genre<data->duration<data->rent_cost<data->purchase_cost<next; + } + if(!printed){ + cout<<"Could not find title\n"; + } +} + +void User::return_(string name){ + movie_entry* curr = rented; + movie_entry* prev = nullptr; + while(curr){ + if(curr->data->title == name){ + if(prev) prev->next = curr->next; + else rented = curr->next; + delete curr; + cout << "Movie returned"<next; + } + + tv_show_entry* curr_show = rented_show; + tv_show_entry* prev_show = nullptr; + while(curr_show){ + if(curr_show->data->title == name){ + if(prev_show) prev_show->next = curr_show->next; + else rented_show = curr_show->next; + delete curr_show; + cout << "Show returned"<next; + } + + cout << "Item not found\n"; +} + + +void User::dues(){ + cout<data->title==name){ + found=true; + break; + } + curr=curr->next; + } + + while(curr_show!=nullptr){ + if(curr_show->data->title==name){ + found=true; + break; + } + curr_show=curr_show->next; + } + + if(curr&&found){ + movie_entry* new_head = new movie_entry; + new_head->data = curr->data; + new_head->next = nullptr; + curr = new_head; + if(!rented){ + rented = curr; + } + else{ + curr->next=rented; + rented=curr; + } + + due+=curr->data->rent_cost; + } + else if(curr_show&&found){ + tv_show_entry* new_head = new tv_show_entry; + new_head->data = curr_show->data; + new_head->next = nullptr; + curr_show = new_head; + if(!rented_show){ + rented_show = curr_show; + } + else{ + curr_show->next=rented_show; + rented_show=curr_show; + } + + due+=curr_show->data->rent_cost; + } + else{ + cout<<"Could not find the title you searched for\n"; + } +} + +void User::purchase(string name, movie_entry* movie_catalog, tv_show_entry* tv_catalog){ + movie_entry* curr = movie_catalog; + tv_show_entry* curr_show = tv_catalog; + bool found; + while(curr!=nullptr){ + if(curr->data->title==name){ + found=true; + break; + } + curr=curr->next; + } + + while(curr_show!=nullptr){ + if(curr_show->data->title==name){ + found=true; + break; + } + curr_show=curr_show->next; + } + + if(curr&&found){ + movie_entry* new_head = new movie_entry; + new_head->data = curr->data; + new_head->next = nullptr; + curr = new_head; + if(!purchased){ + purchased = curr; + } + else{ + curr->next=rented; + purchased=curr; + } + + due+=curr->data->rent_cost; + } + else if(curr_show&&found){ + tv_show_entry* new_head = new tv_show_entry; + new_head->data = curr_show->data; + new_head->next = nullptr; + curr_show = new_head; + if(!purchased_show){ + purchased_show = curr_show; + } + else{ + curr_show->next=purchased_show; + purchased_show=curr_show; + } + + due+=curr_show->data->rent_cost; + } + else{ + cout<<"Could not find the title you searched for\n"; + } +} + +void User::view_purchased(){ + movie_entry* iter = purchased; + tv_show_entry* iter_show = purchased_show; + cout<<"Purchased Titles"<data->title<data->genre<data->purchase_cost<next; + } + + while(iter_show!=nullptr){ + cout<<"Title: "<data->title<data->genre<data->purchase_cost<next; + } + cout<<"--------------------"<data->title<data->genre<data->purchase_cost<next; + } + + while(iter_show){ + cout<<"Title: "<data->title<data->genre<data->purchase_cost<next; + } + cout<<"--------------------"<data->title<<'\n'; + m = m->next; + } + m = purchased; + while (m) { + out << "PURCHASED_MOVIE " << m->data->title <<'\n'; + m = m->next; + } + tv_show_entry* s = rented_show; + while (s) { + out << "RENTED_SHOW " << s->data->title << '\n'; + s = s->next; + } + s = purchased_show; + while (s) { + out << "PURCHASED_SHOW " << s->data->title << '\n'; + s = s->next; + } + out.close(); +} + +void User::load(const string& filename, movie_entry* movie_cat, tv_show_entry* show_cat) { + ifstream in(filename); + if (!in) { + cerr << "Could not open file for reading.\n"; + return; + } + getline(in, username); + getline(in, password); + + string due_line; + getline(in, due_line); + due = stoi(due_line); + + string line; + while (getline(in, line)) { + istringstream iss(line); + string type, title, genre; + int rating; + iss >> type >> title >> genre >> rating; + if (type == "RENTED_MOVIE") { + rent(title, movie_cat, show_cat); + } else if (type == "PURCHASED_MOVIE") { + purchase(title, movie_cat, show_cat); + } else if (type == "RENTED_SHOW") { + rent(title, movie_cat, show_cat); + } else if (type == "PURCHASED_SHOW") { + purchase(title, movie_cat, show_cat); + } + } + in.close(); +} + diff --git a/Task2/pradyumn_v/user.h b/Task2/pradyumn_v/user.h new file mode 100644 index 0000000..d94b691 --- /dev/null +++ b/Task2/pradyumn_v/user.h @@ -0,0 +1,29 @@ +#pragma once +#include +#include "show_entry.h" +#include "movie_entry.h" +#include +using namespace std; + +class User{ + private: + movie_entry* rented=nullptr; + movie_entry* purchased=nullptr; + tv_show_entry* rented_show=nullptr; + tv_show_entry* purchased_show=nullptr; + int due = 0; + public: + string username; + string password; + void save(const string& filename); + void load(const string& filename, movie_entry* movie_cat, tv_show_entry* show_cat); + void search_title(string name, movie_entry* movie_catalog, tv_show_entry* show_catalog); + void search_genre(string genre, movie_entry* movie_catalog, tv_show_entry* show_catalog); + void rent(string name, movie_entry* movie_catalog, tv_show_entry* tv_catalog); + void purchase(string name, movie_entry* movie_catalog, tv_show_entry* tv_catalog); + void return_(string name); + void dues(); + void view_purchased(); + void view_rented(); +}; + diff --git a/Task2/pradyumn_v/users/pradyumnv.dat b/Task2/pradyumn_v/users/pradyumnv.dat new file mode 100644 index 0000000..a34d2fc --- /dev/null +++ b/Task2/pradyumn_v/users/pradyumnv.dat @@ -0,0 +1,5 @@ +pradyumnv +123456 +2100 +RENTED_MOVIE MeBeforeYou +PURCHASED_SHOW TBBT