DaftAcademy / daftacademy-python4beginners-autumn2018

DaftAcademy Python4Beginners Autumn 2018
https://daftacademy.pl/
13 stars 22 forks source link

Wykład 4 - Zadanie 2 #9

Open mdybowski opened 5 years ago

mdybowski commented 5 years ago

Jak właściwie ma wyglądać struktura ConfData ? Czy to ma być klasa ? Ponadto testy mówią o braku metody read_passwords. Czy to też należy napisać ?

monika-osiak commented 5 years ago
Traceback (most recent call last):
  File "/home/runner/_test_runner.py", line 2, in <module>
    import unit_tests
  File "/home/runner/unit_tests.py", line 53, in <module>
    class UnitTests(unittest.TestCase):
  File "/home/runner/unit_tests.py", line 128, in UnitTests
    model_database = ModelConfData(database_file='confwrld_user_database.csv')
  File "/home/runner/unit_tests.py", line 58, in __init__
    self.database = self._read_database(database_file)
  File "/home/runner/unit_tests.py", line 70, in _read_database
    datetime.strptime(row[2], "%Y-%m-%dT%H:%M:%S").timestamp(),
NameError: name 'datetime' is not defined
exit status 1

To wynik pierwszego testu - być może się mylę, ale czy błąd nie jest po stronie kodu testującego?

bulkazszynka commented 5 years ago

Mówiąc szczerze też nie rozumiem w jaki sposób to zadanie ma zostać rozwiązane. Jakieś podpowiedzi?

KulerOvZuo commented 5 years ago

Pytanie do czego odnosi się data "date_updated"? Bo chociażby dla 1 przypadku, hasło się zmieniło, ale ta data nie.

"W pierwszej kolejności należy zresetować hasła klientom którzy nie zmieniali hasła od czasu ataku" Jak to rozumieć?

koseq commented 5 years ago

Też nie rozumiem np. po co nam pass_list w przypadku tej metody: ConfData.pwned_users(pass_list, hack_time) = ["mail1", "mail2", ..... ] Jeżeli dobrze rozumiem, to ma ona zwracać po prostu listę osób, dla których date_updated < hack_time

Rogal27 commented 5 years ago

Treść jest trochę niezrozumiała, ale podejrzewam, że pwned_users ma zwrócić liste osób, dla których date_updated < hack_time i ich hasło znajduje się na liście najpopularniejszych haseł i do tego potrzebne jest nam pass list. Niestety nie mogę sprawdzić swojego rozumowania, bo tylko w tej funkcji otrzymuję, że mój program trwa za długo (nie mam pojęcia dlaczego tak jest, gdyż jest to funkcja bardzo podobna do pozostałych moich funkcji, a funkcja normalnie działa u mnie na komputerze)

Rogal27 commented 5 years ago

Żeby testy działały nam w jakikolwiek sensowny sposób musimy zaimportować kilka bibliotek: from collections import defaultdict from collections import OrderedDict from datetime import datetime nawet jeśli z nich nie korzystamy

mdybowski commented 5 years ago

A w klasie ConfData jak ma wyglądać konstruktor tej klasy? Jego polami mają być obie listy klientów, czy jak to ma wyglądać ?

koseq commented 5 years ago

Nie mam pojęcia, ale ja dałam ścieżki do pliku, który wyciekł i do ogólnej bazy, tylko testy zupełnie mi nie działąją, wiec nie jestem w stanie zweryfikowac czegokolwiek

Rogal27 commented 5 years ago

konstruktor przyjmuje nazwe pliku, w którym jest nasza lista osób i do pola data przypisuje dane z pliku w jakiś sformatowany sposób taki, żeby było nam wygodnie na nim operować. Taka analogiczna funkcja do funkcji get_data z wykładu

Rogal27 commented 5 years ago

ten parametr musi mieć wartość domyślną (ja dałem "confwrld_user_database.csv")

koseq commented 5 years ago

Jeszcze jeżeli chodzi o testy, to przy run tests wyświetla mi sie cały czas "connecting to server" aż w końcu wyświetla się błąd:

Your program took too long to execute.
Make sure that it isn't waiting for input and that there is no infinite loop.

Natomiast jak uruchamiam program u siebie, to wszystko jest ok

mdybowski commented 5 years ago

Brzmi sensownie, dzięki, spróbuję podziałać :)

Rogal27 commented 5 years ago

Problematyczna jest jeszcze ta funkcja , która nie jest w żaden sposób wspomniana, a jest wymagana do działania programu - read_passwords, istotne jest to, że ona musi być statyczna

Rogal27 commented 5 years ago

Jednak miałem błąd w implementacji funkcji pwned_users, gdy go poprawiłem to zniknął komunikat o przekroczeniu czasu i zaliczyło test, więc taki sposób działania funkcji jaki napisałem wyżej powinien być poprawny

Angerton commented 5 years ago

Ja odpuszczam, testy sa napisane w taki sposob ze nie da sie nic z tym zrobic a nie chce spedzic calej niedzieli zastanawiajac sie co autor mial na mysli...

Chcialbym tylko potwierdzic ze w weak_pass_users wychodzi wam 6375 osob z haslami ktore znajduja sie w liscie top 500, oraz 118 osob ktore maja hasla takie jak w top 10.

Co do reszty to spojrzalem sobie na dane i niestety nie maja sensu, ktos sie musial pomylic tworzac tabele z aktualnymi danymi.

Listy maja dokladnie ta sama dlugosc i dokladnie te same maile sa w jednej i drugiej. Listy roznia sie haslami oraz date_updated. I tu niestety mamy babola, w kazdym przypadku gdzie haslo zostalo zmienione (czytaj haslo w jednej bazie dla tego samego uzytkownika jest inne niz w drugiej bazie), date_updated jest wczesniejsze niz data hackowania, a dla wszystkich hasel ktore sie realnie nie zmienily (w jednej bazie takie samo jak w drugiej), date_updated jest nowe i jest wieksze od daty hackowania. Powinno byc dokladnie na odwrot...

Ciekawe czy znajdzie sie taki/taka co przejdzie testy :) Milej niedzieli!

Rogal27 commented 5 years ago

Mi się udało zaliczyć wszsytkie testy, jednak zajęło mi to zdecydowanie więcej czasu niż bym chciał oraz w pewnych miejscach musiąłem się domyślać czego oczekują na wyjściu, bo nie zawsze zgadzało się to z tym co było napisane. confwrld_user_data_dump_10.11.2017.csv jeśli chodzi o tą listę nie była ona w żaden sposób użyta przeze mnie w rozwiązaniu ani nie widzę jej w przykładowym rozwiązaniu

kamilkar1 commented 5 years ago

Czy ktoś może wie o co może chodzić w tym błędzie do pierwszego testu ?

`Traceback (most recent call last): File "/home/runner/unit_tests.py", line 200, in test_conf_data_weak_pass_users self.model_database.weak_pass_users(self.pass_list) AssertionError: Lists differ: ['aoj[194022 chars]e.cl', 'aojbpalbqeplelfbizkvgupqm@hxrv.ar', 'b[776087 chars].cl'] != ['aoj[194022 chars]e.cl']

First list contains 25500 additional elements. First extra element 6375: 'aojbpalbqeplelfbizkvgupqm@hxrv.ar'

Diff is 1065790 characters long. Set self.maxDiff to None to see it.`

FHoffmannCode commented 5 years ago

apropo importów - mój błąd, umknęły mi, przed chwilą zedytowałem testy i teraz powinno być dobrze, za wszelkie kłopoty bardzo przepraszam.

mdybowski commented 5 years ago

Traceback (most recent call last): File "/home/runner/_test_runner.py", line 2, in import unit_tests File "/home/runner/unit_tests.py", line 35, in class UnitTests(unittest.TestCase): File "/home/runner/unit_tests.py", line 114, in UnitTests pass_list = ConfData.read_passwords(database_file="top_500_most_common_passwords.txt") TypeError: read_passwords() missing 1 required positional argument: 'self' exit status 1

Czy ktoś może wie ja kto naprawić ? Moja metoda w klasie to def read_passwords(self, database_file): m = list() with open(database_file, 'r') as f: for line in f: m.append(line.strip('\n').split(',')) return m

Wygląda na to, że ta funkcja nie jest wykonywana na instancji, ale nie mam pojęcia jak mógłbym na to zaradzić

Rogal27 commented 5 years ago

Ta funkcja musi być statyczna

mdybowski commented 5 years ago

A no jasne, dzięki :D

Velociraptorvelraptor commented 5 years ago

Hej, wie ktoś czemu nie mogą mi się timestampy przeparsować?

def read_file(self, file, *args): datastamps_parser = lambda x: pd.datetime.strptime(str(x), '%Y-%m-%dT%H:%M:%S') f = pd.read_csv(file, parse_dates = ['date_created', 'date_updated'], date_parser = datastamps_parser, sep = ',') print(f.columns) return f

error: ValueError: 'date_created' is not in list

migasmonika commented 5 years ago

ConfData.common_pass(pass_list, n=10) = ["pass1", "pass2", ..... ] Przyjmuje: pass_list -> struktura z wczytanymi hasłami i jej hashami n -> liczba haseł jakie chcemy otrzymać Zwraca: [["pass1", "pass1_hash"], ["pass1", "pass1_hash"], ...] listę list haseł i ich hashy SHA1

Co w przypadku, gdy po posortowaniu po liczbie wystąpień hasło_10, hasło_11 i hasło_12 ma taką samą liczbę? Które z haseł powinno znaleźć się na liście? Alfabetycznie?

webster58 commented 5 years ago

@migasmonika Tak wypisujemy 10 haseł. jeżeli 10, 11, 12 mają taką ilość wystąpień, pierwsze które alfabetycznie się pojawi w tej trójce.

Angerton commented 5 years ago

Dlaczego testy caly czas wymagaja utworzenia metod o ktorych nic nie ma napisane w tresci zadania? Mowie tu o read_passwords. Na Wtorkowym wykladzie ustalalismy ze wszystkie wymagane metody beda opisane...

webster58 commented 5 years ago

Dlaczego testy caly czas wymagaja utworzenia metod o ktorych nic nie ma napisane w tresci zadania? Mowie tu o read_passwords. Na Wtorkowym wykladzie ustalalismy ze wszystkie wymagane metody beda opisane...

Dodany został Scaffold rozwiązania, jeśli jednak jest on z jakiś przyczyn niewidoczny to dokleiłem go w treści zadania. Mam nadzieję że teraz nie będzie problemu

Bazyl29 commented 5 years ago

Cześć, mam problem z przejściem testu common_pass_users. Wydaje mi się, że funkcja działa dobrze, ale test sprawdza jakąś swoją kolejność haseł w liście, zamiast robić to alfabetycznie.

Błąd wywalany przez test:

self.model_database.common_pass_users(self.pass_list, 21)
AssertionError: Lists differ: ['fuc[14 chars]r', 'cowboy', 'ford', 'merlin', 'murphy', 'pau[138 chars]ssy'] != ['fuc[14 chars]r', 'ford', 'cowboy', 'merlin', 'murphy', 'pau[139 chars]hjk']

First differing element 2:
'cowboy'
'ford'

  ['fucking',
   'panther',
+  'ford',
   'cowboy',
-  'ford',
   'merlin',
   'murphy',
   'paul',
   '4321',
-  'booger',
   'loveme',
   'lover',
   'michelle',
   'pamela',
-  'asdfghjk',
+  'booger',
+  'winner',
+  'victor',
+  'pussy',
+  'tester',
+  'nascar',
+  'cumshot',
   'cookie',
+  'asdfghjk']
-  'cumshot',
-  'december',
-  'fuck',
-  'horny',
-  'nascar',
-  'pussy']

Moja lista (tylko dla potrzeb githuba hasła wypisane razem z ilością powtórzeń w bazie).

[['fucking', 27], ['panther', 26], ['cowboy', 25], ['ford', 25], ['merlin', 24], ['murphy', 23], ['paul', 22], ['4321', 21], ['booger', 20], ['loveme', 20], ['lover', 20], ['michelle', 20], ['pamela', 20], ['asdfghjk', 19], ['cookie', 19], ['cumshot', 19], ['december', 19], ['fuck', 19], ['horny', 19], ['nascar', 19]]

Jak widać błędy wyrzuca przy hasłach, które mają taką samą liczbę powtórzeń, przy czym w mojej liście są one ustawione alfabetycznie, a w liście testowej nie do końca.

Czy to mój błąd i coś skopałem w liczeniu haseł, czy jednak testy?

mdybowski commented 5 years ago

Mam ten sam problem. Co najciekawsze w testach mamy loveme i lover, natomiast booger się już nie pojawia a jest pierwsze w kolejności alfabetycznej. Nawet gdyby iść od drugiej strony to pierwszy jest pamela, który również nie występuje...

Chyba wiem jak to działa. Wypisuje w takiej kolejności, że n1 występuje w liście przed n2, jeśli n1 wystąpiło wiecej razy od n2. A jeśli wystapilo tyle samo razy to wtedy pierwszy jest ten, który pierwszy się pojawił w pliku z tymi userami.

Dodatkowo nie wiem co się zadziało, ale jak odpaliłem restart wszystkiego to od tamtej pory pojawia się komunikat o infinite loop co bym nie zrobił. Nawet jak usunę dosłowni wszystko i zostaje biała tablica.

KulerOvZuo commented 5 years ago

Taaaa... Już wiem co jest "nie tak" z common_pass_users:

Edited: wróć, most_common działa ok ale tylko z OrderedDict tak mi się wydaje

mdybowski commented 5 years ago

A czy też masz może ten problem odnosnie nieskończonej pętli ? Bo nie wiem czy to tylko u mnie czy coś się zepsuło globalnie. Nawet jak usunę wszystko, nie ma żadnego zapisanego kodu to pisze ze mam infinity loop.

KulerOvZuo commented 5 years ago

Nie mam problemu z tym. Spróbuj na tym repl.it "zacząć od nowa"

mdybowski commented 5 years ago

No właśnie restartowalem już parę razy i nadal to samo, nie wiem co robić :/

koseq commented 5 years ago

Ja mam dość dziwny problem z metodą common_pass_users, na razie zupełnie niezwiązany z kolejnością haseł, tylko z długością samej listy. Jak wywołuję print("Length: "+ str(len(my_data.common_pass_users(my_pass_list)))) to output wygląda tak: ['fucking', 'panther', 'ford', 'cowboy', 'merlin', 'murphy', 'paul', '4321', 'loveme', 'lover'] Length: 10 Natomiast z testu wynika błąd wskazujący na pustą listę: Traceback (most recent call last): File "/home/runner/unit_tests.py", line 210, in test_test_conf_data_common_pass_users_with_default_args self.assertEqual(len(common_pass_users), 10) AssertionError: 0 != 10 Jakieś pomysły? Bo zupełnie nie mam pomysłu co może być powodem.

koseq commented 5 years ago

I jeszcze jedno pytanie, jakie warunki mają być spełnione przy safe_users? W dwóch miejscach jest to nieco inaczej sformułowane:

Ja to rozumiem tak, że date_updated ma być > od hack_time i hasło nie widnieje w top500, ale jak tak robię, to z testów wynika, że brakuje mi ponad 7000 użytkowników na liście:

Traceback (most recent call last): File "/home/runner/unit_tests.py", line 246, in test_conf_data_safe_users self.model_database.safe_users(self.pass_list, self.hack_time) AssertionError: Lists differ: ['aaeut@gweh.cl', 'adugzqcnuqhchfcguikdje@go[23944 chars].sm'] != ['aojbpalbqeplelfbizkvgupqm@hxrv.ar', 'ggwkg[254237 chars].cl'] First differing element 0: 'aaeut@gweh.cl' 'aojbpalbqeplelfbizkvgupqm@hxrv.ar' Second list contains 7572 additional elements. First extra element 784: 'rbkkmrbdcrjewnyylxyvptzeusje@fikd.ar' Diff is 305676 characters long. Set self.maxDiff to None to see it.

Velociraptorvelraptor commented 5 years ago

I jeszcze jedno pytanie, jakie warunki mają być spełnione przy safe_users? W dwóch miejscach jest to nieco inaczej sformułowane:

  • hasło nie figuruje na liście oraz zmienili hasło od ataku
  • Zwraca listę ludzi którzy nie figurowali w wycieku i mają bezpieczne hasła.

Ja to rozumiem tak, że date_updated ma być > od hack_time i hasło nie widnieje w top500, ale jak tak robię, to z testów wynika, że brakuje mi ponad 7000 użytkowników na liście:

Też to tak rozumiem, z bazy danych wszystkich użytkowników wybieram tych, którzy last update mają wcześniej niż data ataku ORAZ hasło jest na liście top500, co najdziwniejsze zbiory te nie przecinają się -> tablica wyników jest pusta.

koseq commented 5 years ago

Dobra, przeszło mi testy: ma być date_updated <= hack_time lub hasło nie jest w top 500. Zaczęłam przechodzić przez wszystkie kombinacje tego warunku i w końcu coś zadziałało.

Zostało mi jeszcze common_pass i ten dziwny błąd w takim razie.

pt., 30 lis 2018 o 23:11 Max notifications@github.com napisał(a):

I jeszcze jedno pytanie, jakie warunki mają być spełnione przy safe_users? W dwóch miejscach jest to nieco inaczej sformułowane:

  • hasło nie figuruje na liście oraz zmienili hasło od ataku
  • Zwraca listę ludzi którzy nie figurowali w wycieku i mają bezpieczne hasła.

Ja to rozumiem tak, że date_updated ma być > od hack_time i hasło nie widnieje w top500, ale jak tak robię, to z testów wynika, że brakuje mi ponad 7000 użytkowników na liście:

Też to tak rozumiem, z bazy danych wszystkich użytkowników wybieram tych, którzy last update mają wcześniej niż data ataku ORAZ hasło jest na liście top500, co najdziwniejsze zbiory te nie przecinają się -> tablica wyników jest pusta.

— You are receiving this because you commented. Reply to this email directly, view it on GitHub https://github.com/daftcode/daftacademy-python4beginners-autumn2018/issues/9#issuecomment-443355196, or mute the thread https://github.com/notifications/unsubscribe-auth/AlSUZg7ZOrn2UN05KD4uESrBqXmYHoikks5u0a0WgaJpZM4YxOd7 .

mdybowski commented 5 years ago

U mnie okazało się, że safe_users to dokładnie dopełnienie użytkowników z pwned_users.

Moribund7 commented 5 years ago

@KulerOvZuo @Bazyl29 jak udało się Wam rozwiązać problem w common_pass (swoją drogą czy dokumentacji jest common_pass a w testach common_pass_users?) dotyczący kolejności wypisywanych haseł? Bo korzystam z OrderDict i mimo to zwracana jest zła kolejność.

KulerOvZuo commented 5 years ago

Counter(OrderedDict(sorted(_dict.items(), key=lambda t: t[1], reverse=True))).most_common(n) gdzie _dict to słownik hasło + liczba wystąpień

Moribund7 commented 5 years ago

Udało się przejść pierwszy z testów ale na kolejnym znowu się wywalił.

Traceback (most recent call last):
  File "/home/runner/unit_tests.py", line 212, in test_conf_data_common_pass_users_with_all_params
    self.model_database.common_pass_users(self.pass_list, 21)
AssertionError: Lists differ: ['fuc[72 chars]'lover', 'michelle', 'pamela', 'loveme', 'boog[78 chars]uck'] != ['fuc[72 chars]'loveme', 'lover', 'michelle', 'pamela', 'boog[81 chars]hjk']

First differing element 8:
'lover'
'loveme'

  ['fucking',
   'panther',
   'ford',
   'cowboy',
   'merlin',
   'murphy',
   'paul',
   '4321',
+  'loveme',
   'lover',
   'michelle',
   'pamela',
-  'loveme',
   'booger',
   'winner',
-  'horny',
+  'victor',
+  'pussy',
   'tester',
+  'nascar',
   'cumshot',
+  'cookie',
+  'asdfghjk']
-  'pussy',
-  'december',
-  'victor',
-  'fuck']
Moribund7 commented 5 years ago

Ma ktoś pomysł, dlaczego to nie przechodzi testów?

def common_pass_users(self, pass_list, n=10):
        pass_dict=OrderedDict()
        pass_counts_dict=OrderedDict()
        for i in range(len(pass_list)):
            pass_dict[pass_list[i][1]]=pass_list[i][0]
            pass_counts_dict[pass_list[i][1]]=0
        for record in self.database:
            if record[1] in pass_dict:
                pass_counts_dict[record[1]]+=1

        n_most_common_pass_list=[]    
        for i in Counter(OrderedDict(sorted(pass_counts_dict.items(), key=lambda t: t[1], reverse=True))).most_common(n):
            n_most_common_pass_list.append(pass_dict[i[0]])

        return n_most_common_pass_list
migasmonika commented 5 years ago

Chyba coś zmieniło się w testach. Rozwiązanie, w którym bierzemy w kolejności alfabetycznej dla haseł o tej samej liczbie wystąpień przechodzi.

Moribund7 commented 5 years ago

Faktycznie, ten sam kod przechodzi teraz jeden z testów, ale na drugim zwraca następujący błąd: Traceback (most recent call last):

  File "/home/runner/unit_tests.py", line 211, in test_test_conf_data_common_pass_users_with_default_args
    set(self.model_database.common_pass_users(self.pass_list))
AssertionError: Items in the first set but not the second:
'michelle'
'lover'
Items in the second set but not the first:
'booger'
'loveme'
migasmonika commented 5 years ago

U mnie zadziałało zwykłe sortowanie słownika po liczbie wystąpień i kluczu a następnie wybór pierwszych n-elementów. Nie używałam OrderDicta, ale możliwe, że to jedno z rozwiązań.

bulkazszynka commented 5 years ago

Niestety, ale to zadanie, a w szczególności testy do niego wyjątkowo niepoważnie traktują uczestników tego kursu. Funkcja "ConfData.common_pass(pass_list, n=10)" z domyślmym parametrem może zwrócić 4 różne, 4 równie poprawne odpowiedzi. Wszystko przez to, że mamy 5 haseł, które występują 20 razy każde i na nieszczęście są one ex aequo 9. pod względem popularności.

mkmkl93 commented 5 years ago

Czy mógłbym prosić o potwierdzenie od prowadzących, że nie daliście pustego outa do 1 testu i to całkowity przypadek, że ten kod przechodzi pierwszy test (i pewnie jedyny sprawdzający weak_pass)? def weak_pass_users(self, pass_list): return list() Edit: Czy mógłbym też prosić o potwierdzenie, że mamy zwrócić listę list? Jak próbuję ją zwrócić to dostaję  `Traceback (most recent call last): File "/home/runner/unit_tests.py", line 185, in test_conf_data_common_pass_users_with_all_params set(common_pass_users), TypeError: unhashable type: 'list'` a jak zwracam listę tupli to wywalam się linijkę później.

ArekP2 commented 5 years ago

mkmkl93:

Edit: Czy mógłbym też prosić o potwierdzenie, że mamy zwrócić listę list? Jak próbuję ją zwrócić to dostaję  Traceback (most recent call last): File "/home/runner/unit_tests.py", line 185, in test_conf_data_common_pass_users_with_all_params set(common_pass_users), TypeError: unhashable type: 'list' a jak zwracam listę tupli to wywalam się linijkę później. Mi wychodzi, że mamy zwrócić listę haseł: ["pass1", "pass2", ...] a nie jak błędnie podane w zadaniu listę list: [["pass1", "pass1_hash"], ["pass1", "pass1_hash"], ...] no i nie listę tupli.

ArekP2 commented 5 years ago

Uff... wreszcie ConfData.common_pass() ok :sweat_smile: Aby kod podany przez @KulerOvZuo zadziałał i uwzględnił, że w przypadku haseł z tą samą liczbą wystąpień sortujemy je dodatkowo alfabetycznie, można go tak uzupełnić:

Counter(OrderedDict(sorted(_dict.items(), key=lambda t: (-t[1],t[0]) ))).most_common(n)
ghost commented 5 years ago

Jaki właściwie powinien być output ConfData.common_pass() na domyślnych ustawieniach? Mi zwraca: ['fucking', 'panther', 'cowboy', 'ford', 'merlin', 'murphy', 'paul', '4321', 'booger', 'loveme'] i testy krzyczą, że to źle:

Traceback (most recent call last): File "/home/runner/unit_tests.py", line 189, in test_test_conf_data_common_pass_users_with_default_args set(self.model_database.common_pass_users(self.pass_list)) AssertionError: Items in the first set but not the second: 'paul' 'cowboy' 'loveme' '4321' 'murphy' 'fucking' 'booger' 'merlin' 'panther' 'ford'

joanna1771 commented 5 years ago

Czy ktoś może spotkał się z taką sytuacją, że wszystkie testy zaznaczone są na zielono, ale całe zadanie ma status Failed? Jakieś wskazówki z czego może to wynikać? Może jakiś dodatkowy warunek, który nie jest uwzględniony w testach?